diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-06-04 13:12:58 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-06-04 13:12:58 +0300 |
commit | 28b597b6df46b6d2581d7948578922bb3566d242 (patch) | |
tree | 5b79613f8387d44ce66dc415b629b55906cabf93 /source/blender/draw | |
parent | 8d1e6d7833177023a6af0d040dabf4d5690b87db (diff) |
Eevee: Material code refactor.
Separate material handling inside another file.
Make use of enums to identify shader variations.
Group all 64*64 LUTs into one array texture.
Only update world probe if world changes.
Diffstat (limited to 'source/blender/draw')
-rw-r--r-- | source/blender/draw/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_engine.c | 517 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lights.c | 4 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lut.h | 2053 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_materials.c | 434 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_private.h | 35 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_probes.c | 163 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl | 8 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl | 22 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/ltc_lib.glsl | 6 |
10 files changed, 2692 insertions, 551 deletions
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index a7aabeb4662..ef477f4eb7a 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -83,6 +83,7 @@ set(SRC engines/eevee/eevee_data.c engines/eevee/eevee_engine.c engines/eevee/eevee_lights.c + engines/eevee/eevee_materials.c engines/eevee/eevee_probes.c engines/eevee/eevee_effects.c engines/external/external_engine.c diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index ab8923109e9..769edc3503c 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -23,9 +23,8 @@ * \ingroup draw_engine */ -#include "DRW_render.h" - #include "DNA_world_types.h" +#include "DRW_render.h" #include "BLI_dynstr.h" #include "BLI_rand.h" @@ -35,151 +34,11 @@ #include "eevee_engine.h" #include "eevee_private.h" -#include "eevee_lut.h" #define EEVEE_ENGINE "BLENDER_EEVEE" -#define SHADER_DEFINES \ - "#define EEVEE_ENGINE\n" \ - "#define MAX_LIGHT " STRINGIFY(MAX_LIGHT) "\n" \ - "#define MAX_SHADOW_CUBE " STRINGIFY(MAX_SHADOW_CUBE) "\n" \ - "#define MAX_SHADOW_MAP " STRINGIFY(MAX_SHADOW_MAP) "\n" \ - "#define MAX_SHADOW_CASCADE " STRINGIFY(MAX_SHADOW_CASCADE) "\n" \ - "#define MAX_CASCADE_NUM " STRINGIFY(MAX_CASCADE_NUM) "\n" - -/* *********** STATIC *********** */ -static struct { - char *frag_shader_lib; - - struct GPUShader *default_lit; - struct GPUShader *default_lit_flat; - struct GPUShader *default_world; - struct GPUShader *default_background; - struct GPUShader *depth_sh; - - struct GPUShader *probe_filter_sh; - struct GPUShader *probe_spherical_harmonic_sh; - - struct GPUTexture *ltc_mat; - struct GPUTexture *brdf_lut; - struct GPUTexture *jitter; - - float camera_pos[3]; -} e_data = {NULL}; /* Engine data */ - -extern char datatoc_default_frag_glsl[]; -extern char datatoc_default_world_frag_glsl[]; -extern char datatoc_ltc_lib_glsl[]; -extern char datatoc_bsdf_lut_frag_glsl[]; -extern char datatoc_bsdf_common_lib_glsl[]; -extern char datatoc_bsdf_direct_lib_glsl[]; -extern char datatoc_bsdf_sampling_lib_glsl[]; -extern char datatoc_lit_surface_frag_glsl[]; -extern char datatoc_lit_surface_vert_glsl[]; -extern char datatoc_shadow_frag_glsl[]; -extern char datatoc_shadow_geom_glsl[]; -extern char datatoc_shadow_vert_glsl[]; -extern char datatoc_probe_filter_frag_glsl[]; -extern char datatoc_probe_sh_frag_glsl[]; -extern char datatoc_probe_geom_glsl[]; -extern char datatoc_probe_vert_glsl[]; -extern char datatoc_background_vert_glsl[]; - -extern Material defmaterial; extern GlobalsUboStorage ts; -static struct GPUTexture *create_jitter_texture(int w, int h) -{ - struct GPUTexture *tex; - float (*texels)[2] = MEM_mallocN(sizeof(float[2]) * w * h, "jitter_tex"); - int i; - - /* TODO replace by something more evenly distributed like blue noise */ - for (i = 0; i < w * h; i++) { - texels[i][0] = 2.0f * BLI_frand() - 1.0f; - texels[i][1] = 2.0f * BLI_frand() - 1.0f; - normalize_v2(texels[i]); - } - - tex = DRW_texture_create_2D(w, h, DRW_TEX_RG_16, DRW_TEX_WRAP, (float *)texels); - MEM_freeN(texels); - return tex; -} - -static struct GPUTexture *create_ggx_lut_texture(int UNUSED(w), int UNUSED(h)) -{ - struct GPUTexture *tex; -#if 0 /* Used only to generate the LUT values */ - struct GPUFrameBuffer *fb = NULL; - static float samples_ct = 8192.0f; - static float inv_samples_ct = 1.0f / 8192.0f; - - char *lib_str = NULL; - - DynStr *ds_vert = BLI_dynstr_new(); - BLI_dynstr_append(ds_vert, datatoc_bsdf_common_lib_glsl); - BLI_dynstr_append(ds_vert, datatoc_bsdf_sampling_lib_glsl); - lib_str = BLI_dynstr_get_cstring(ds_vert); - BLI_dynstr_free(ds_vert); - - struct GPUShader *sh = DRW_shader_create_with_lib( - datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, datatoc_bsdf_lut_frag_glsl, lib_str, - "#define HAMMERSLEY_SIZE 8192\n" - "#define BRDF_LUT_SIZE 64\n" - "#define NOISE_SIZE 64\n"); - - DRWPass *pass = DRW_pass_create("Probe Filtering", DRW_STATE_WRITE_COLOR); - DRWShadingGroup *grp = DRW_shgroup_create(sh, pass); - DRW_shgroup_uniform_float(grp, "sampleCount", &samples_ct, 1); - DRW_shgroup_uniform_float(grp, "invSampleCount", &inv_samples_ct, 1); - DRW_shgroup_uniform_texture(grp, "texHammersley", e_data.hammersley); - DRW_shgroup_uniform_texture(grp, "texJitter", e_data.jitter); - - struct Batch *geom = DRW_cache_fullscreen_quad_get(); - DRW_shgroup_call_add(grp, geom, NULL); - - float *texels = MEM_mallocN(sizeof(float[2]) * w * h, "lut"); - - tex = DRW_texture_create_2D(w, h, DRW_TEX_RG_16, DRW_TEX_FILTER, (float *)texels); - - DRWFboTexture tex_filter = {&tex, DRW_TEX_RG_16, DRW_TEX_FILTER}; - DRW_framebuffer_init(&fb, &draw_engine_eevee_type, w, h, &tex_filter, 1); - - DRW_framebuffer_bind(fb); - DRW_draw_pass(pass); - - float *data = MEM_mallocN(sizeof(float[3]) * w * h, "lut"); - glReadBuffer(GL_COLOR_ATTACHMENT0); - glReadPixels(0, 0, w, h, GL_RGB, GL_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]); - } - printf("}"); - - MEM_freeN(texels); - MEM_freeN(data); -#else - float (*texels)[3] = MEM_mallocN(sizeof(float[3]) * 64 * 64, "bsdf lut texels"); - - for (int i = 0; i < 64 * 64; i++) { - texels[i][0] = bsdf_split_sum_ggx[i*2 + 0]; - texels[i][1] = bsdf_split_sum_ggx[i*2 + 1]; - texels[i][2] = ltc_mag_ggx[i]; - } - - tex = DRW_texture_create_2D(64, 64, DRW_TEX_RGB_16, DRW_TEX_FILTER, (float *)texels); - MEM_freeN(texels); -#endif - - return tex; -} - - /* *********** FUNCTIONS *********** */ static void EEVEE_engine_init(void *ved) @@ -196,247 +55,31 @@ static void EEVEE_engine_init(void *ved) (int)viewport_size[0], (int)viewport_size[1], &tex, 1); - if (!e_data.frag_shader_lib) { - DynStr *ds_frag = BLI_dynstr_new(); - BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl); - BLI_dynstr_append(ds_frag, datatoc_ltc_lib_glsl); - BLI_dynstr_append(ds_frag, datatoc_bsdf_direct_lib_glsl); - BLI_dynstr_append(ds_frag, datatoc_lit_surface_frag_glsl); - e_data.frag_shader_lib = BLI_dynstr_get_cstring(ds_frag); - BLI_dynstr_free(ds_frag); - } - - if (!e_data.depth_sh) { - e_data.depth_sh = DRW_shader_create_3D_depth_only(); - } - - if (!e_data.default_lit) { - char *frag_str = NULL; - - DynStr *ds_frag = BLI_dynstr_new(); - BLI_dynstr_append(ds_frag, e_data.frag_shader_lib); - BLI_dynstr_append(ds_frag, datatoc_default_frag_glsl); - frag_str = BLI_dynstr_get_cstring(ds_frag); - BLI_dynstr_free(ds_frag); - - e_data.default_lit = DRW_shader_create( - datatoc_lit_surface_vert_glsl, NULL, frag_str, SHADER_DEFINES "#define MESH_SHADER\n"); - - e_data.default_lit_flat = DRW_shader_create( - datatoc_lit_surface_vert_glsl, NULL, frag_str, - SHADER_DEFINES - "#define MESH_SHADER\n" - "#define USE_FLAT_NORMAL\n"); - - MEM_freeN(frag_str); - } - - if (!e_data.default_world) { - e_data.default_world = DRW_shader_create( - datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, datatoc_default_world_frag_glsl, NULL); - } - - if (!e_data.default_background) { - e_data.default_background = DRW_shader_create_fullscreen(datatoc_default_world_frag_glsl, NULL); - } - - if (!e_data.ltc_mat) { - e_data.ltc_mat = DRW_texture_create_2D(64, 64, DRW_TEX_RGBA_16, DRW_TEX_FILTER, ltc_mat_ggx); - } - - if (!e_data.jitter) { - e_data.jitter = create_jitter_texture(64, 64); - } - - if (!e_data.brdf_lut) { - e_data.brdf_lut = create_ggx_lut_texture(64, 64); - } - - { - float viewinvmat[4][4]; - DRW_viewport_matrix_get(viewinvmat, DRW_MAT_VIEWINV); - - copy_v3_v3(e_data.camera_pos, viewinvmat[3]); - } - + EEVEE_materials_init(); EEVEE_lights_init(sldata); - EEVEE_probes_init(sldata); - EEVEE_effects_init(vedata); - - // EEVEE_lights_update(stl); -} - -static DRWShadingGroup *eevee_cube_shgroup(struct GPUShader *sh, DRWPass *pass, struct Batch *geom) -{ - DRWShadingGroup *grp = DRW_shgroup_instance_create(sh, pass, geom); - - for (int i = 0; i < 6; ++i) - DRW_shgroup_call_dynamic_add_empty(grp); - - return grp; } static void EEVEE_cache_init(void *vedata) { - static int zero = 0; - EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get(); - if (!stl->g_data) { /* Alloc transient pointers */ stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__); } - { - // psl->shadow_pass = DRW_pass_create("Shadow Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS); - // stl->g_data->shadow_shgrp = DRW_shgroup_create(e_data.shadow_sh, psl->shadow_pass); - // DRW_shgroup_uniform_mat4(stl->g_data->shadow_shgrp, "ShadowMatrix", (float *)stl->lamps->shadowmat); - // DRW_shgroup_uniform_int(stl->g_data->shadow_shgrp, "Layer", &stl->lamps->layer, 1); - } - - { - psl->probe_background = DRW_pass_create("Probe Background Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR); - - struct Batch *geom = DRW_cache_fullscreen_quad_get(); - DRWShadingGroup *grp = NULL; - - const DRWContextState *draw_ctx = DRW_context_state_get(); - Scene *scene = draw_ctx->scene; - World *wo = scene->world; - - float *col = ts.colorBackground; - if (wo) { - col = &wo->horr; - } - - if (wo && wo->use_nodes && wo->nodetree) { - struct GPUMaterial *gpumat = GPU_material_from_nodetree( - scene, wo->nodetree, &wo->gpumaterial, &DRW_engine_viewport_eevee_type, 0, - datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, e_data.frag_shader_lib, - SHADER_DEFINES "#define PROBE_CAPTURE\n"); - - grp = DRW_shgroup_material_instance_create(gpumat, psl->probe_background, geom); - - if (grp) { - DRW_shgroup_uniform_int(grp, "Layer", &zero, 1); - - for (int i = 0; i < 6; ++i) - DRW_shgroup_call_dynamic_add_empty(grp); - } - else { - /* Shader failed : pink background */ - static float pink[3] = {1.0f, 0.0f, 1.0f}; - col = pink; - } - } - - /* Fallback if shader fails or if not using nodetree. */ - if (grp == NULL) { - grp = eevee_cube_shgroup(e_data.default_world, psl->probe_background, geom); - DRW_shgroup_uniform_vec3(grp, "color", col, 1); - DRW_shgroup_uniform_int(grp, "Layer", &zero, 1); - } - } - - { - psl->background_pass = DRW_pass_create("Background Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR); - - struct Batch *geom = DRW_cache_fullscreen_quad_get(); - DRWShadingGroup *grp = NULL; - - const DRWContextState *draw_ctx = DRW_context_state_get(); - Scene *scene = draw_ctx->scene; - World *wo = scene->world; - - float *col = ts.colorBackground; - if (wo) { - col = &wo->horr; - } - - if (wo && wo->use_nodes && wo->nodetree) { - struct GPUMaterial *gpumat = GPU_material_from_nodetree( - scene, wo->nodetree, &wo->gpumaterial, &DRW_engine_viewport_eevee_type, 1, - datatoc_background_vert_glsl, NULL, e_data.frag_shader_lib, - SHADER_DEFINES "#define WORLD_BACKGROUND\n"); - - grp = DRW_shgroup_material_create(gpumat, psl->background_pass); - - if (grp) { - DRW_shgroup_call_add(grp, geom, NULL); - } - else { - /* Shader failed : pink background */ - static float pink[3] = {1.0f, 0.0f, 1.0f}; - col = pink; - } - } - - /* Fallback if shader fails or if not using nodetree. */ - if (grp == NULL) { - grp = DRW_shgroup_create(e_data.default_background, psl->background_pass); - DRW_shgroup_uniform_vec3(grp, "color", col, 1); - DRW_shgroup_call_add(grp, geom, NULL); - } - } - - { - psl->depth_pass = DRW_pass_create("Depth Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS); - stl->g_data->depth_shgrp = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); - - psl->depth_pass_cull = DRW_pass_create( - "Depth Pass Cull", - DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK); - stl->g_data->depth_shgrp_cull = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass_cull); - } - - { - DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL; - psl->default_pass = DRW_pass_create("Default Shader Pass", state); - - for (uint j = 0; j < 2; j++) { - struct GPUShader *shader; - struct DRWShadingGroup *shgrp; - - if (j == 0) { - shader = e_data.default_lit; - shgrp = DRW_shgroup_create(shader, psl->default_pass); - } - else { - shader = e_data.default_lit_flat; - shgrp = DRW_shgroup_create(shader, psl->default_pass); - } - - DRW_shgroup_uniform_block(shgrp, "light_block", sldata->light_ubo); - DRW_shgroup_uniform_block(shgrp, "shadow_block", sldata->shadow_ubo); - DRW_shgroup_uniform_int(shgrp, "light_count", &sldata->lamps->num_light, 1); - DRW_shgroup_uniform_float(shgrp, "lodMax", &sldata->probes->lodmax, 1); - DRW_shgroup_uniform_vec3(shgrp, "shCoefs[0]", (float *)sldata->probes->shcoefs, 9); - DRW_shgroup_uniform_vec3(shgrp, "cameraPos", e_data.camera_pos, 1); - DRW_shgroup_uniform_texture(shgrp, "ltcMat", e_data.ltc_mat); - DRW_shgroup_uniform_texture(shgrp, "brdfLut", e_data.brdf_lut); - DRW_shgroup_uniform_texture(shgrp, "probeFiltered", sldata->probe_pool); - /* NOTE : Adding Shadow Map textures uniform in EEVEE_cache_finish */ - } - } - - { - DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL; - psl->material_pass = DRW_pass_create("Material Shader Pass", state); - } - - EEVEE_probes_cache_init(sldata, psl); + EEVEE_materials_cache_init(vedata); EEVEE_lights_cache_init(sldata, psl); + EEVEE_probes_cache_init(sldata, psl); EEVEE_effects_cache_init(vedata); } static void EEVEE_cache_populate(void *vedata, Object *ob) { - EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get(); @@ -450,110 +93,8 @@ static void EEVEE_cache_populate(void *vedata, Object *ob) struct Batch *geom = DRW_cache_object_surface_get(ob); if (geom) { - IDProperty *ces_mode_ob = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_OBJECT, ""); - const bool do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling"); - const bool is_sculpt_mode = is_active && (ob->mode & OB_MODE_SCULPT) != 0; - const bool is_default_mode_shader = is_sculpt_mode; - - /* Depth Prepass */ - { - DRWShadingGroup *depth_shgrp = do_cull ? stl->g_data->depth_shgrp_cull : stl->g_data->depth_shgrp; - if (is_sculpt_mode) { - DRW_shgroup_call_sculpt_add(depth_shgrp, ob, ob->obmat); - } - else { - DRW_shgroup_call_object_add(depth_shgrp, geom, ob); - } - } - - /* Get per-material split surface */ - struct Batch **mat_geom = DRW_cache_object_surface_material_get(ob); - if (mat_geom) { - struct GPUShader *default_shader = e_data.default_lit; - - if (is_default_mode_shader) { - if (is_sculpt_mode) { - bool use_flat = DRW_object_is_flat_normal(ob); - default_shader = use_flat ? e_data.default_lit_flat : e_data.default_lit; - } - } - - for (int i = 0; i < MAX2(1, (is_sculpt_mode ? 1 : ob->totcol)); ++i) { - Material *ma = give_current_material(ob, i + 1); - - if (ma == NULL) - ma = &defmaterial; - - if (ma->use_nodes && ma->nodetree) { - Scene *scene = draw_ctx->scene; - struct GPUMaterial *gpumat = GPU_material_from_nodetree( - scene, ma->nodetree, &ma->gpumaterial, &DRW_engine_viewport_eevee_type, 0, - datatoc_lit_surface_vert_glsl, NULL, e_data.frag_shader_lib, - SHADER_DEFINES "#define MESH_SHADER\n"); - - DRWShadingGroup *shgrp = DRW_shgroup_material_create(gpumat, psl->material_pass); - if (shgrp) { - DRW_shgroup_uniform_block(shgrp, "light_block", sldata->light_ubo); - DRW_shgroup_uniform_block(shgrp, "shadow_block", sldata->shadow_ubo); - DRW_shgroup_uniform_int(shgrp, "light_count", &sldata->lamps->num_light, 1); - DRW_shgroup_uniform_float(shgrp, "lodMax", &sldata->probes->lodmax, 1); - DRW_shgroup_uniform_vec3(shgrp, "shCoefs[0]", (float *)sldata->probes->shcoefs, 9); - DRW_shgroup_uniform_vec3(shgrp, "cameraPos", e_data.camera_pos, 1); - DRW_shgroup_uniform_texture(shgrp, "ltcMat", e_data.ltc_mat); - DRW_shgroup_uniform_texture(shgrp, "brdfLut", e_data.brdf_lut); - DRW_shgroup_uniform_texture(shgrp, "probeFiltered", sldata->probe_pool); - - if (is_sculpt_mode) { - DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat); - } - else { - DRW_shgroup_call_object_add(shgrp, mat_geom[i], ob); - } - } - else { - /* Shader failed : pink color */ - static float col[3] = {1.0f, 0.0f, 1.0f}; - static float half = 0.5f; - - shgrp = DRW_shgroup_create(default_shader, psl->default_pass); - DRW_shgroup_uniform_vec3(shgrp, "basecol", col, 1); - DRW_shgroup_uniform_float(shgrp, "metallic", &half, 1); - DRW_shgroup_uniform_float(shgrp, "specular", &half, 1); - DRW_shgroup_uniform_float(shgrp, "roughness", &half, 1); - DRW_shgroup_uniform_texture(shgrp, "ltcMat", e_data.ltc_mat); - DRW_shgroup_uniform_texture(shgrp, "brdfLut", e_data.brdf_lut); - DRW_shgroup_uniform_texture(shgrp, "probeFiltered", sldata->probe_pool); - - if (is_sculpt_mode) { - DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat); - } - else { - DRW_shgroup_call_object_add(shgrp, mat_geom[i], ob); - } - } - } - else { - DRWShadingGroup *shgrp = DRW_shgroup_create(default_shader, psl->default_pass); - DRW_shgroup_uniform_vec3(shgrp, "basecol", &ma->r, 1); - DRW_shgroup_uniform_float(shgrp, "metallic", &ma->ray_mirror, 1); - DRW_shgroup_uniform_float(shgrp, "specular", &ma->spec, 1); - DRW_shgroup_uniform_float(shgrp, "roughness", &ma->gloss_mir, 1); - DRW_shgroup_uniform_texture(shgrp, "ltcMat", e_data.ltc_mat); - DRW_shgroup_uniform_texture(shgrp, "brdfLut", e_data.brdf_lut); - DRW_shgroup_uniform_texture(shgrp, "probeFiltered", sldata->probe_pool); - - if (is_sculpt_mode) { - DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat); - } - else { - DRW_shgroup_call_object_add(shgrp, mat_geom[i], ob); - } - } - } - } - // GPUMaterial *gpumat = GPU_material_from_nodetree(struct bNodeTree *ntree, ListBase *gpumaterials, void *engine_type, int options) + EEVEE_materials_cache_populate(vedata, sldata, ob, geom); - // DRW_shgroup_call_add(stl->g_data->shadow_shgrp, geom, ob->obmat); const bool cast_shadow = true; if (cast_shadow) { @@ -568,34 +109,12 @@ static void EEVEE_cache_populate(void *vedata, Object *ob) } } -typedef struct eevee_bind_shadow_data { - struct GPUTexture *shadow_depth_cube_pool; - struct GPUTexture *shadow_depth_cascade_pool; -} eevee_bind_shadow_data; - -static void eevee_bind_shadow(void *data, DRWShadingGroup *shgrp) +static void EEVEE_cache_finish(void *UNUSED(vedata)) { - eevee_bind_shadow_data *shdw_data = data; - DRW_shgroup_uniform_texture(shgrp, "shadowCubes", shdw_data->shadow_depth_cube_pool); - DRW_shgroup_uniform_texture(shgrp, "shadowCascades", shdw_data->shadow_depth_cascade_pool); -} - -static void EEVEE_cache_finish(void *vedata) -{ - EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get(); EEVEE_lights_cache_finish(sldata); EEVEE_probes_cache_finish(sldata); - - /* Shadows binding */ - eevee_bind_shadow_data data; - - data.shadow_depth_cube_pool = sldata->shadow_depth_cube_pool; - data.shadow_depth_cascade_pool = sldata->shadow_depth_cascade_pool; - - DRW_pass_foreach_shgroup(psl->default_pass, eevee_bind_shadow, &data); - DRW_pass_foreach_shgroup(psl->material_pass, eevee_bind_shadow, &data); } static void EEVEE_draw_scene(void *vedata) @@ -607,12 +126,12 @@ static void EEVEE_draw_scene(void *vedata) /* Default framebuffer and texture */ DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); - /* Refresh Probes */ - EEVEE_refresh_probe(sldata, psl); - /* Refresh shadows */ EEVEE_draw_shadows(sldata, psl); + /* Refresh Probes */ + EEVEE_probes_refresh(sldata, psl); + /* Attach depth to the hdr buffer and bind it */ DRW_framebuffer_texture_detach(dtxl->depth); DRW_framebuffer_texture_attach(fbl->main, dtxl->depth, 0, 0); @@ -620,30 +139,26 @@ static void EEVEE_draw_scene(void *vedata) DRW_framebuffer_clear(false, true, false, NULL, 1.0f); DRW_draw_pass(psl->background_pass); + + /* Depth prepass */ DRW_draw_pass(psl->depth_pass); DRW_draw_pass(psl->depth_pass_cull); + + /* Shading pass */ DRW_draw_pass(psl->default_pass); + DRW_draw_pass(psl->default_flat_pass); DRW_draw_pass(psl->material_pass); + /* Post Process */ EEVEE_draw_effects(vedata); } static void EEVEE_engine_free(void) { + EEVEE_materials_free(); EEVEE_effects_free(); EEVEE_lights_free(); EEVEE_probes_free(); - - MEM_SAFE_FREE(e_data.frag_shader_lib); - DRW_SHADER_FREE_SAFE(e_data.default_lit); - DRW_SHADER_FREE_SAFE(e_data.default_lit_flat); - DRW_SHADER_FREE_SAFE(e_data.default_world); - DRW_SHADER_FREE_SAFE(e_data.default_background); - DRW_SHADER_FREE_SAFE(e_data.probe_filter_sh); - DRW_SHADER_FREE_SAFE(e_data.probe_spherical_harmonic_sh); - DRW_TEXTURE_FREE_SAFE(e_data.ltc_mat); - DRW_TEXTURE_FREE_SAFE(e_data.brdf_lut); - DRW_TEXTURE_FREE_SAFE(e_data.jitter); } static void EEVEE_layer_collection_settings_create(RenderEngine *UNUSED(engine), IDProperty *props) diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c index 0c27ede2148..05565e8e0ba 100644 --- a/source/blender/draw/engines/eevee/eevee_lights.c +++ b/source/blender/draw/engines/eevee/eevee_lights.c @@ -30,6 +30,9 @@ #include "eevee_engine.h" #include "eevee_private.h" +/* Theses are the structs stored inside Objects. + * It works with even if the object is in multiple layers + * because we don't get the same "Object *" for each layer. */ typedef struct EEVEE_LightData { short light_id, shadow_id; } EEVEE_LightData; @@ -197,7 +200,6 @@ void EEVEE_lights_cache_finish(EEVEE_SceneLayerData *sldata) { EEVEE_LampsInfo *linfo = sldata->lamps; - /* Setup enough layers. */ /* Free textures if number mismatch. */ if (linfo->num_cube != linfo->cache_num_cube) { diff --git a/source/blender/draw/engines/eevee/eevee_lut.h b/source/blender/draw/engines/eevee/eevee_lut.h index f2b53467708..5c03dce616d 100644 --- a/source/blender/draw/engines/eevee/eevee_lut.h +++ b/source/blender/draw/engines/eevee/eevee_lut.h @@ -3344,4 +3344,2057 @@ static float bsdf_split_sum_ggx[64 * 64 * 2] = { 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 }; + +/* R is normalized noise, Green and Blue are Cos and Sin of the previous value */ +static float blue_noise[64 * 64 * 3] = { + 0.254398f, -0.027633f, 0.999618f, 0.667491f, -0.495510f, -0.868602f, + 0.925063f, 0.891186f, -0.453638f, 0.749523f, -0.002996f, -0.999996f, + 0.110842f, 0.767132f, 0.641489f, 0.969253f, 0.981397f, -0.191989f, + 0.777844f, 0.174057f, -0.984736f, 0.312993f, -0.385544f, 0.922690f, + 0.881361f, 0.734796f, -0.678288f, 0.415045f, -0.860887f, 0.508796f, + 0.940200f, 0.930238f, -0.366956f, 0.748547f, -0.009132f, -0.999958f, + 0.588144f, -0.850520f, -0.525943f, 0.958022f, 0.965418f, -0.260705f, + 0.436774f, -0.922125f, 0.386892f, 0.726085f, -0.149696f, -0.988732f, + 0.994888f, 0.999484f, -0.032113f, 0.114015f, 0.754188f, 0.656659f, + 0.505867f, -0.999321f, -0.036856f, 0.354742f, -0.611624f, 0.791149f, + 0.270512f, -0.128524f, 0.991706f, 0.975845f, 0.988505f, -0.151189f, + 0.461433f, -0.970783f, 0.239960f, 0.923598f, 0.886973f, -0.461821f, + 0.423102f, -0.885530f, 0.464583f, 0.833753f, 0.502282f, -0.864704f, + 0.996597f, 0.999771f, -0.021379f, 0.363531f, -0.654360f, 0.756183f, + 0.645274f, -0.611548f, -0.791207f, 0.270756f, -0.130045f, 0.991508f, + 0.551034f, -0.949029f, -0.315188f, 0.490242f, -0.998121f, 0.061274f, + 0.160891f, 0.531091f, 0.847315f, 0.009766f, 0.998118f, 0.061322f, + 0.652354f, -0.575757f, -0.817621f, 0.405768f, -0.829783f, 0.558086f, + 0.563485f, -0.921493f, -0.388395f, 0.929702f, 0.904027f, -0.427475f, + 0.207767f, 0.262255f, 0.964998f, 0.705821f, -0.274032f, -0.961721f, + 0.146242f, 0.606720f, 0.794916f, 0.627939f, -0.693928f, -0.720044f, + 0.359869f, -0.636788f, 0.771039f, 0.179934f, 0.426152f, 0.904651f, + 0.073732f, 0.894596f, 0.446875f, 0.568612f, -0.908505f, -0.417873f, + 0.669200f, -0.486154f, -0.873873f, 0.111818f, 0.763181f, 0.646184f, + 0.906264f, 0.831518f, -0.555498f, 0.169924f, 0.482169f, 0.876078f, + 0.575692f, -0.889023f, -0.457862f, 0.489265f, -0.997726f, 0.067397f, + 0.107179f, 0.781688f, 0.623669f, 0.998062f, 0.999926f, -0.012176f, + 0.027832f, 0.984748f, 0.173987f, 0.891127f, 0.775007f, -0.631953f, + 0.584726f, -0.861618f, -0.507557f, 0.794202f, 0.274170f, -0.961681f, + 0.642100f, -0.627204f, -0.778855f, 0.542489f, -0.964576f, -0.263805f, + 0.842298f, 0.547962f, -0.836503f, 0.700694f, -0.304865f, -0.952395f, + 0.914076f, 0.857774f, -0.514028f, 0.152346f, 0.575796f, 0.817593f, + 0.965591f, 0.976720f, -0.214518f, 0.550546f, -0.949992f, -0.312275f, + 0.191897f, 0.357014f, 0.934099f, 0.408698f, -0.839915f, 0.542718f, + 0.281743f, -0.198125f, 0.980177f, 0.577890f, -0.882617f, -0.470092f, + 0.052003f, 0.947093f, 0.320960f, 0.201175f, 0.301988f, 0.953312f, + 0.529305f, -0.983096f, -0.183090f, 0.646006f, -0.607901f, -0.794013f, + 0.109865f, 0.771054f, 0.636770f, 0.479988f, -0.992105f, 0.125409f, + 0.680919f, -0.420550f, -0.907269f, 0.088380f, 0.849737f, 0.527206f, + 0.823255f, 0.444193f, -0.895931f, 0.618418f, -0.735738f, -0.677266f, + 0.384039f, -0.746105f, 0.665829f, 0.224857f, 0.157322f, 0.987547f, + 0.676280f, -0.446811f, -0.894628f, 0.882582f, 0.739977f, -0.672632f, + 0.138186f, 0.646166f, 0.763197f, 0.619638f, -0.730522f, -0.682889f, + 0.003662f, 0.999735f, 0.023008f, 0.687266f, -0.384039f, -0.923317f, + 0.168215f, 0.491549f, 0.870850f, 0.285161f, -0.219128f, 0.975696f, + 0.609873f, -0.771023f, -0.636807f, 0.018311f, 0.993389f, 0.114797f, + 0.195560f, 0.335427f, 0.942066f, 0.756847f, 0.043011f, -0.999075f, + 0.066896f, 0.912960f, 0.408050f, 0.347906f, -0.577089f, 0.816681f, + 0.831312f, 0.488958f, -0.872307f, 0.579599f, -0.877519f, -0.479543f, + 0.863783f, 0.655555f, -0.755147f, 0.474617f, -0.987309f, 0.158813f, + 0.056397f, 0.937871f, 0.346985f, 0.818128f, 0.415106f, -0.909773f, + 0.105226f, 0.789283f, 0.614030f, 0.288090f, -0.237050f, 0.971497f, + 0.872084f, 0.694032f, -0.719944f, 0.743908f, -0.038269f, -0.999267f, + 0.472175f, -0.984756f, 0.173939f, 0.825940f, 0.459247f, -0.888309f, + 0.951675f, 0.954255f, -0.298993f, 0.389654f, -0.769127f, 0.639096f, + 0.026856f, 0.985797f, 0.167941f, 0.459724f, -0.968150f, 0.250370f, + 0.525399f, -0.987293f, -0.158908f, 0.721691f, -0.176936f, -0.984222f, + 0.784192f, 0.213184f, -0.977012f, 0.280034f, -0.187588f, 0.982248f, + 0.362799f, -0.650873f, 0.759187f, 0.220951f, 0.181511f, 0.983389f, + 0.751232f, 0.007742f, -0.999970f, 0.439948f, -0.929656f, 0.368428f, + 0.321782f, -0.435885f, 0.900002f, 0.214847f, 0.219081f, 0.975707f, + 0.453864f, -0.958279f, 0.285836f, 0.987320f, 0.996828f, -0.079588f, + 0.092287f, 0.836543f, 0.547901f, 0.421881f, -0.881940f, 0.471361f, + 0.621836f, -0.721025f, -0.692909f, 0.384283f, -0.747125f, 0.664683f, + 0.795178f, 0.280066f, -0.959981f, 0.094484f, 0.828899f, 0.559398f, + 0.342535f, -0.549204f, 0.835688f, 0.835706f, 0.512855f, -0.858475f, + 0.702647f, -0.293155f, -0.956065f, 0.452888f, -0.956507f, 0.291711f, + 0.858656f, 0.630893f, -0.775870f, 0.727794f, -0.139070f, -0.990283f, + 0.348394f, -0.579592f, 0.814907f, 0.802991f, 0.326833f, -0.945082f, + 0.250980f, -0.006160f, 0.999981f, 0.164309f, 0.512773f, 0.858524f, + 0.864759f, 0.660177f, -0.751110f, 0.366705f, -0.669309f, 0.742984f, + 0.203128f, 0.290266f, 0.956946f, 0.044923f, 0.960429f, 0.278524f, + 0.545907f, -0.958689f, -0.284458f, 0.807385f, 0.352801f, -0.935698f, + 0.025635f, 0.987056f, 0.160375f, 0.434089f, -0.915465f, 0.402397f, + 0.565438f, -0.916657f, -0.399674f, 0.738537f, -0.071964f, -0.997407f, + 0.323980f, -0.448268f, 0.893899f, 0.877943f, 0.720061f, -0.693911f, + 0.092042f, 0.837382f, 0.546618f, 0.773449f, 0.146804f, -0.989166f, + 0.528817f, -0.983653f, -0.180073f, 0.470954f, -0.983393f, 0.181487f, + 0.872328f, 0.695135f, -0.718879f, 0.940932f, 0.931917f, -0.362672f, + 0.129885f, 0.685075f, 0.728473f, 0.421393f, -0.880490f, 0.474065f, + 0.918471f, 0.871638f, -0.490150f, 0.238773f, 0.070482f, 0.997513f, + 0.751476f, 0.009276f, -0.999957f, 0.189700f, 0.369876f, 0.929081f, + 0.354498f, -0.610410f, 0.792086f, 0.886976f, 0.758265f, -0.651946f, + 0.666758f, -0.499502f, -0.866313f, 0.385748f, -0.753211f, 0.657779f, + 0.575448f, -0.889724f, -0.456498f, 0.045411f, 0.959570f, 0.281469f, + 0.311528f, -0.377035f, 0.926199f, 0.907729f, 0.836595f, -0.547821f, + 0.608896f, -0.774916f, -0.632064f, 0.205814f, 0.274078f, 0.961707f, + 0.759045f, 0.056799f, -0.998386f, 0.985122f, 0.995634f, -0.093342f, + 0.231449f, 0.116297f, 0.993215f, 0.633066f, -0.670377f, -0.742021f, + 0.034424f, 0.976699f, 0.214612f, 0.927993f, 0.899385f, -0.437157f, + 0.592538f, -0.835675f, -0.549224f, 0.819348f, 0.422071f, -0.906563f, + 0.507820f, -0.998793f, -0.049116f, 0.689708f, -0.369831f, -0.929099f, + 0.071046f, 0.902009f, 0.431717f, 0.854505f, 0.610448f, -0.792057f, + 0.001953f, 0.999925f, 0.012272f, 0.271733f, -0.136126f, 0.990691f, + 0.752209f, 0.013877f, -0.999904f, 0.189944f, 0.368450f, 0.929648f, + 0.824720f, 0.452420f, -0.891805f, 0.032715f, 0.978948f, 0.204112f, + 0.693370f, -0.348356f, -0.937362f, 0.498299f, -0.999943f, 0.010690f, + 0.605722f, -0.787366f, -0.616486f, 0.014405f, 0.995907f, 0.090383f, + 0.945571f, 0.942090f, -0.335360f, 0.233402f, 0.104099f, 0.994567f, + 0.385504f, -0.752201f, 0.658933f, 0.144778f, 0.614011f, 0.789298f, + 0.990982f, 0.998395f, -0.056632f, 0.007813f, 0.998795f, 0.049068f, + 0.908461f, 0.839108f, -0.543965f, 0.558846f, -0.932420f, -0.361376f, + 0.298344f, -0.299107f, 0.954220f, 0.514168f, -0.996040f, -0.088903f, + 0.897475f, 0.799589f, -0.600548f, 0.757336f, 0.046076f, -0.998938f, + 0.473396f, -0.986062f, 0.166381f, 0.911147f, 0.848167f, -0.529730f, + 0.294926f, -0.278547f, 0.960423f, 0.954849f, 0.960028f, -0.279905f, + 0.197757f, 0.322390f, 0.946607f, 0.846937f, 0.572106f, -0.820180f, + 0.247074f, 0.018383f, 0.999831f, 0.491218f, -0.998478f, 0.055148f, + 0.653330f, -0.570729f, -0.821138f, 0.952407f, 0.955621f, -0.294598f, + 0.224369f, 0.160351f, 0.987060f, 0.382330f, -0.738912f, 0.673802f, + 0.677256f, -0.441313f, -0.897353f, 0.299565f, -0.306417f, 0.951897f, + 0.808850f, 0.361398f, -0.932412f, 0.616953f, -0.741941f, -0.670465f, + 0.694591f, -0.341157f, -0.940006f, 0.320806f, -0.430354f, 0.902660f, + 0.081300f, 0.872342f, 0.488896f, 0.971450f, 0.983954f, -0.178422f, + 0.625986f, -0.702712f, -0.711474f, 0.251713f, -0.010762f, 0.999942f, + 0.493416f, -0.999144f, 0.041358f, 0.766369f, 0.102669f, -0.994716f, + 0.995132f, 0.999532f, -0.030579f, 0.229007f, 0.131518f, 0.991314f, + 0.681163f, -0.419158f, -0.907913f, 0.099123f, 0.812245f, 0.583316f, + 0.500740f, -0.999989f, -0.004650f, 0.281254f, -0.195117f, 0.980780f, + 0.872572f, 0.696237f, -0.717812f, 0.343999f, -0.556872f, 0.830598f, + 0.134279f, 0.664701f, 0.747109f, 0.840345f, 0.537655f, -0.843165f, + 0.394293f, -0.787425f, 0.616410f, 0.450690f, -0.952388f, 0.304888f, + 0.176028f, 0.448226f, 0.893921f, 0.658457f, -0.543986f, -0.839095f, + 0.131350f, 0.678341f, 0.734747f, 0.914565f, 0.859347f, -0.511394f, + 0.379400f, -0.726384f, 0.687289f, 0.736095f, -0.087255f, -0.996186f, + 0.495613f, -0.999620f, 0.027561f, 0.671153f, -0.475394f, -0.879773f, + 0.352544f, -0.600644f, 0.799517f, 0.562997f, -0.922680f, -0.385566f, + 0.479500f, -0.991716f, 0.128453f, 0.296635f, -0.288844f, 0.957376f, + 0.213626f, 0.226558f, 0.973998f, 0.429206f, -0.902691f, 0.430289f, + 0.893812f, 0.785560f, -0.618786f, 0.166751f, 0.499543f, 0.866289f, + 0.628183f, -0.692823f, -0.721108f, 0.523201f, -0.989393f, -0.145263f, + 0.065919f, 0.915446f, 0.402440f, 0.670665f, -0.478091f, -0.878311f, + 0.489754f, -0.997928f, 0.064336f, 0.597177f, -0.819315f, -0.573344f, + 0.408209f, -0.838246f, 0.545292f, 0.777356f, 0.171035f, -0.985265f, + 0.640879f, -0.633159f, -0.774022f, 0.129397f, 0.687306f, 0.726368f, + 0.703624f, -0.287283f, -0.957846f, 0.255375f, -0.033766f, 0.999430f, + 0.338140f, -0.525923f, 0.850532f, 0.159670f, 0.537574f, 0.843216f, + 0.597665f, -0.817552f, -0.575855f, 0.698253f, -0.319439f, -0.947607f, + 0.388678f, -0.765191f, 0.643803f, 0.059327f, 0.931325f, 0.364190f, + 0.792004f, 0.260867f, -0.965375f, 0.405280f, -0.828067f, 0.560629f, + 0.579355f, -0.878253f, -0.478196f, 0.335210f, -0.510178f, 0.860069f, + 0.124514f, 0.709264f, 0.704943f, 0.732433f, -0.110152f, -0.993915f, + 0.048096f, 0.954684f, 0.297620f, 0.574960f, -0.891121f, -0.453766f, + 0.499763f, -0.999999f, 0.001486f, 0.176516f, 0.445481f, 0.895291f, + 0.030762f, 0.981379f, 0.192083f, 0.533944f, -0.977343f, -0.211661f, + 0.452155f, -0.955154f, 0.296109f, 0.710948f, -0.242914f, -0.970048f, + 0.142092f, 0.627241f, 0.778825f, 0.549813f, -0.951419f, -0.307900f, + 0.013916f, 0.996180f, 0.087327f, 0.433600f, -0.914227f, 0.405203f, + 0.171145f, 0.475436f, 0.879750f, 0.527352f, -0.985269f, -0.171012f, + 0.779309f, 0.183113f, -0.983092f, 0.414801f, -0.860106f, 0.510116f, + 0.148196f, 0.596919f, 0.802301f, 0.656748f, -0.552964f, -0.833205f, + 0.441901f, -0.934108f, 0.356991f, 0.697032f, -0.326697f, -0.945129f, + 0.564462f, -0.919093f, -0.394042f, 0.302251f, -0.322435f, 0.946592f, + 0.959487f, 0.967777f, -0.251809f, 0.084230f, 0.863195f, 0.504870f, + 0.879408f, 0.726417f, -0.687254f, 0.336919f, -0.519384f, 0.854541f, + 0.263920f, -0.087351f, 0.996178f, 0.556161f, -0.938385f, -0.345591f, + 0.194827f, 0.339759f, 0.940512f, 0.942885f, 0.936297f, -0.351208f, + 0.593515f, -0.832289f, -0.554341f, 0.158206f, 0.545312f, 0.838233f, + 0.891859f, 0.777907f, -0.628379f, 0.954116f, 0.958729f, -0.284320f, + 0.117678f, 0.738880f, 0.673837f, 0.871107f, 0.689601f, -0.724189f, + 0.582040f, -0.870059f, -0.492947f, 0.999527f, 0.999996f, -0.002972f, + 0.271977f, -0.137646f, 0.990481f, 0.769787f, 0.124006f, -0.992281f, + 0.326909f, -0.464646f, 0.885496f, 0.812268f, 0.381338f, -0.924436f, + 0.888197f, 0.763243f, -0.646111f, 0.287358f, -0.232577f, 0.972578f, + 0.755627f, 0.035347f, -0.999375f, 0.191653f, 0.358446f, 0.933550f, + 0.331304f, -0.488917f, 0.872331f, 0.049561f, 0.951905f, 0.306394f, + 0.941909f, 0.934125f, -0.356947f, 0.446296f, -0.943608f, 0.331066f, + 0.067384f, 0.911703f, 0.410849f, 0.964858f, 0.975722f, -0.219011f, + 0.664073f, -0.514048f, -0.857761f, 0.084962f, 0.860863f, 0.508837f, + 0.780529f, 0.190648f, -0.981658f, 0.498543f, -0.999958f, 0.009156f, + 0.111574f, 0.764172f, 0.645013f, 0.538827f, -0.970390f, -0.241542f, + 0.988785f, 0.997518f, -0.070410f, 0.154543f, 0.564454f, 0.825465f, + 0.033936f, 0.977353f, 0.211615f, 0.899428f, 0.806898f, -0.590690f, + 0.800305f, 0.310840f, -0.950462f, 0.434333f, -0.916082f, 0.400992f, + 0.853529f, 0.605576f, -0.795787f, 0.235599f, 0.090359f, 0.995909f, + 0.984878f, 0.995490f, -0.094869f, 0.392096f, -0.778840f, 0.627223f, + 0.782238f, 0.201178f, -0.979555f, 0.936782f, 0.922143f, -0.386848f, + 0.267826f, -0.111772f, 0.993734f, 0.374517f, -0.704960f, 0.709248f, + 0.803723f, 0.331179f, -0.943568f, 0.952651f, 0.956072f, -0.293132f, + 0.329839f, -0.480867f, 0.876794f, 0.900160f, 0.809608f, -0.586971f, + 0.076417f, 0.886929f, 0.461906f, 0.849866f, 0.587106f, -0.809510f, + 0.349126f, -0.583336f, 0.812231f, 0.958755f, 0.966608f, -0.256260f, + 0.817395f, 0.410915f, -0.911674f, 0.544442f, -0.961266f, -0.275622f, + 0.008057f, 0.998719f, 0.050601f, 0.090089f, 0.844027f, 0.536300f, + 0.804944f, 0.338406f, -0.941000f, 0.196536f, 0.329641f, 0.944106f, + 0.497566f, -0.999883f, 0.015292f, 0.681895f, -0.414975f, -0.909833f, + 0.759777f, 0.061393f, -0.998114f, 0.013184f, 0.996571f, 0.082742f, + 0.973404f, 0.986069f, -0.166334f, 0.634287f, -0.664666f, -0.747141f, + 0.107912f, 0.778810f, 0.627260f, 0.295659f, -0.282964f, 0.959131f, + 0.816907f, 0.408116f, -0.912930f, 0.403815f, -0.822872f, 0.568227f, + 0.050050f, 0.950960f, 0.309313f, 0.250492f, -0.003092f, 0.999995f, + 0.638682f, -0.643785f, -0.765207f, 0.730724f, -0.120819f, -0.992675f, + 0.375982f, -0.711458f, 0.702729f, 0.140383f, 0.635568f, 0.772045f, + 0.060548f, 0.928504f, 0.371323f, 0.711681f, -0.238447f, -0.971155f, + 0.471199f, -0.983671f, 0.179978f, 0.102296f, 0.800452f, 0.599397f, + 0.562753f, -0.923271f, -0.384150f, 0.430915f, -0.907259f, 0.420572f, + 0.949477f, 0.950037f, -0.312138f, 0.097414f, 0.818462f, 0.574561f, + 0.695567f, -0.335382f, -0.942082f, 0.854017f, 0.608015f, -0.793926f, + 0.225834f, 0.151260f, 0.988494f, 0.374029f, -0.702780f, 0.711407f, + 0.832044f, 0.492968f, -0.870048f, 0.564706f, -0.918487f, -0.395451f, + 0.420417f, -0.877565f, 0.479458f, 0.866957f, 0.670483f, -0.741925f, + 0.234134f, 0.099521f, 0.995035f, 0.930922f, 0.907280f, -0.420528f, + 0.345708f, -0.565759f, 0.824571f, 0.641367f, -0.630782f, -0.775960f, + 0.723400f, -0.166358f, -0.986066f, 0.298833f, -0.302033f, 0.953297f, + 0.462654f, -0.972595f, 0.232507f, 0.700450f, -0.306326f, -0.951927f, + 0.188235f, 0.378411f, 0.925638f, 0.538094f, -0.971492f, -0.237074f, + 0.082033f, 0.870083f, 0.492905f, 0.353277f, -0.604317f, 0.796744f, + 0.662364f, -0.523229f, -0.852192f, 0.114260f, 0.753180f, 0.657815f, + 0.888930f, 0.766209f, -0.642592f, 0.208011f, 0.260775f, 0.965400f, + 0.645518f, -0.610334f, -0.792144f, 0.850843f, 0.592062f, -0.805892f, + 0.095216f, 0.826316f, 0.563207f, 0.598886f, -0.813111f, -0.582109f, + 0.198978f, 0.315120f, 0.949052f, 0.721935f, -0.175426f, -0.984493f, + 0.650401f, -0.585747f, -0.810494f, 0.590097f, -0.844002f, -0.536341f, + 0.274907f, -0.155854f, 0.987780f, 0.052491f, 0.946104f, 0.323864f, + 0.715587f, -0.214542f, -0.976715f, 0.237552f, 0.078131f, 0.996943f, + 0.889906f, 0.770137f, -0.637878f, 0.947036f, 0.945137f, -0.326675f, + 0.371832f, -0.692892f, 0.721041f, 0.744152f, -0.036736f, -0.999325f, + 0.603525f, -0.795802f, -0.605557f, 0.236332f, 0.085775f, 0.996315f, + 0.539803f, -0.968890f, -0.247492f, 0.396735f, -0.796788f, 0.604259f, + 0.478279f, -0.990701f, 0.136055f, 0.774426f, 0.152871f, -0.988246f, + 0.433845f, -0.914847f, 0.403800f, 0.704356f, -0.282872f, -0.959158f, + 0.073976f, 0.893910f, 0.448247f, 0.530282f, -0.981954f, -0.189119f, + 0.791760f, 0.259386f, -0.965774f, 0.451179f, -0.953319f, 0.301965f, + 0.338628f, -0.528530f, 0.848915f, 0.021485f, 0.990902f, 0.134583f, + 0.529061f, -0.983376f, -0.181581f, 0.822034f, 0.437308f, -0.899312f, + 0.652110f, -0.577011f, -0.816737f, 0.407477f, -0.835728f, 0.549144f, + 0.215579f, 0.214589f, 0.976705f, 0.970718f, 0.983123f, -0.182948f, + 0.156008f, 0.556833f, 0.830625f, 0.632578f, -0.672650f, -0.739961f, + 0.237797f, 0.076601f, 0.997062f, 0.808118f, 0.357103f, -0.934065f, + 0.536385f, -0.973981f, -0.226628f, 0.468269f, -0.980191f, 0.198054f, + 0.610849f, -0.767101f, -0.641526f, 0.745617f, -0.027537f, -0.999621f, + 0.176761f, 0.444107f, 0.895974f, 0.283940f, -0.211638f, 0.977348f, + 0.625742f, -0.703803f, -0.710396f, 0.030030f, 0.982252f, 0.187565f, + 0.458991f, -0.966988f, 0.254823f, 0.742931f, -0.044400f, -0.999014f, + 0.277104f, -0.169476f, 0.985534f, 0.186526f, 0.388329f, 0.921521f, + 0.890883f, 0.774037f, -0.633141f, 0.840589f, 0.538948f, -0.842339f, + 0.601816f, -0.802258f, -0.596977f, 0.254887f, -0.030699f, 0.999529f, + 0.972183f, 0.984765f, -0.173892f, 0.635996f, -0.656605f, -0.754235f, + 0.912612f, 0.853006f, -0.521901f, 0.753918f, 0.024613f, -0.999697f, + 0.281987f, -0.199628f, 0.979872f, 0.475593f, -0.988265f, 0.152752f, + 0.723156f, -0.167870f, -0.985809f, 0.582528f, -0.868543f, -0.495614f, + 0.051026f, 0.949044f, 0.315143f, 0.506355f, -0.999203f, -0.039921f, + 0.427497f, -0.898019f, 0.439957f, 0.290776f, -0.253409f, 0.967359f, + 0.786389f, 0.226652f, -0.973976f, 0.484138f, -0.995038f, 0.099497f, + 0.382086f, -0.737878f, 0.674935f, 0.132082f, 0.674952f, 0.737861f, + 0.461921f, -0.971514f, 0.236981f, 0.192630f, 0.352711f, 0.935732f, + 0.603037f, -0.797656f, -0.603113f, 0.397223f, -0.798638f, 0.601812f, + 0.315435f, -0.399652f, 0.916667f, 0.630381f, -0.682801f, -0.730604f, + 0.472419f, -0.985022f, 0.172428f, 0.126223f, 0.701654f, 0.712518f, + 0.037842f, 0.971865f, 0.235537f, 0.864271f, 0.657869f, -0.753132f, + 0.293950f, -0.272648f, 0.962114f, 0.827893f, 0.470113f, -0.882606f, + 0.058595f, 0.932991f, 0.359900f, 0.898695f, 0.804172f, -0.594397f, + 0.229740f, 0.126955f, 0.991908f, 0.866468f, 0.668204f, -0.743978f, + 0.331792f, -0.491591f, 0.870826f, 0.984390f, 0.995194f, -0.097923f, + 0.666514f, -0.500830f, -0.865546f, 0.202396f, 0.294667f, 0.955600f, + 0.767590f, 0.110295f, -0.993899f, 0.935561f, 0.919149f, -0.393910f, + 0.477546f, -0.990065f, 0.140613f, 0.309819f, -0.367068f, 0.930194f, + 0.920180f, 0.876851f, -0.480762f, 0.574472f, -0.892509f, -0.451030f, + 0.836927f, 0.519425f, -0.854516f, 0.356695f, -0.621287f, 0.783583f, + 0.741466f, -0.053593f, -0.998563f, 0.038575f, 0.970771f, 0.240007f, + 0.381353f, -0.734764f, 0.678323f, 0.909926f, 0.844079f, -0.536219f, + 0.290288f, -0.250440f, 0.968132f, 0.137942f, 0.647336f, 0.762205f, + 0.971939f, 0.984497f, -0.175403f, 0.011475f, 0.997402f, 0.072036f, + 0.513436f, -0.996439f, -0.084318f, 0.799573f, 0.306463f, -0.951883f, + 0.363043f, -0.652037f, 0.758187f, 0.977798f, 0.990286f, -0.139047f, + 0.135500f, 0.658952f, 0.752185f, 0.822766f, 0.441442f, -0.897290f, + 0.591073f, -0.840695f, -0.541509f, 0.039551f, 0.969280f, 0.245959f, + 0.427985f, -0.899364f, 0.437200f, 0.515877f, -0.995028f, -0.099593f, + 0.106935f, 0.782644f, 0.622469f, 0.376226f, -0.712535f, 0.701637f, + 0.007324f, 0.998941f, 0.046004f, 0.307134f, -0.351320f, 0.936255f, + 0.489998f, -0.998026f, 0.062805f, 0.146975f, 0.603055f, 0.797699f, + 0.831067f, 0.487620f, -0.873056f, 0.020752f, 0.991511f, 0.130021f, + 0.416999f, -0.867066f, 0.498193f, 0.323735f, -0.446897f, 0.894586f, + 0.156741f, 0.553004f, 0.833178f, 0.750011f, 0.000072f, -1.000000f, + 0.909438f, 0.842430f, -0.538806f, 0.672374f, -0.468632f, -0.883394f, + 0.036866f, 0.973292f, 0.229569f, 0.245365f, 0.029118f, 0.999576f, + 0.870130f, 0.685144f, -0.728407f, 0.970962f, 0.983402f, -0.181440f, + 0.746349f, -0.022936f, -0.999737f, 0.908217f, 0.838272f, -0.545252f, + 0.830823f, 0.486280f, -0.873803f, 0.502205f, -0.999904f, -0.013854f, + 0.163821f, 0.515404f, 0.856947f, 0.781506f, 0.196668f, -0.980470f, + 0.263676f, -0.085822f, 0.996310f, 0.914809f, 0.860130f, -0.510075f, + 0.426032f, -0.893931f, 0.448204f, 0.988296f, 0.997297f, -0.073470f, + 0.152590f, 0.574541f, 0.818476f, 0.714366f, -0.222027f, -0.975041f, + 0.578866f, -0.879716f, -0.475499f, 0.355718f, -0.616467f, 0.787381f, + 0.161624f, 0.527186f, 0.849750f, 0.620127f, -0.728424f, -0.685127f, + 0.480720f, -0.992672f, 0.120842f, 0.130129f, 0.683956f, 0.729523f, + 0.275883f, -0.161912f, 0.986805f, 0.570077f, -0.904621f, -0.426217f, + 0.858900f, 0.632083f, -0.774901f, 0.164065f, 0.514089f, 0.857737f, + 0.243168f, 0.042915f, 0.999079f, 0.754894f, 0.030747f, -0.999527f, + 0.096681f, 0.821097f, 0.570788f, 0.004639f, 0.999575f, 0.029142f, + 0.503182f, -0.999800f, -0.019989f, 0.265141f, -0.094989f, 0.995478f, + 0.674571f, -0.456391f, -0.889779f, 0.860365f, 0.639188f, -0.769051f, + 0.483406f, -0.994569f, 0.104076f, 0.589364f, -0.846461f, -0.532451f, + 0.069337f, 0.906593f, 0.422006f, 0.422858f, -0.884816f, 0.465941f, + 0.676768f, -0.444064f, -0.895995f, 0.328862f, -0.475478f, 0.879728f, + 0.922377f, 0.883405f, -0.468611f, 0.104982f, 0.790224f, 0.612818f, + 0.715099f, -0.217537f, -0.976052f, 0.210941f, 0.242961f, 0.970036f, + 0.540536f, -0.967741f, -0.251948f, 0.393317f, -0.783628f, 0.621230f, + 0.678477f, -0.434417f, -0.900712f, 0.088869f, 0.848116f, 0.529811f, + 0.963638f, 0.974014f, -0.226488f, 0.226078f, 0.149743f, 0.988725f, + 0.657969f, -0.546557f, -0.837422f, 0.818616f, 0.417895f, -0.908495f, + 0.734142f, -0.099474f, -0.995040f, 0.409430f, -0.842404f, 0.538847f, + 0.591318f, -0.839863f, -0.542798f, 0.217288f, 0.204089f, 0.978952f, + 0.957290f, 0.964208f, -0.265146f, 0.619150f, -0.732614f, -0.680644f, + 0.527108f, -0.985530f, -0.169500f, 0.861585f, 0.645068f, -0.764125f, + 0.991226f, 0.998481f, -0.055100f, 0.230228f, 0.123911f, 0.992293f, + 0.359625f, -0.635605f, 0.772014f, 0.128908f, 0.689532f, 0.724256f, + 0.945083f, 0.941057f, -0.338249f, 0.571298f, -0.901325f, -0.433143f, + 0.081056f, 0.873091f, 0.487557f, 0.312261f, -0.381293f, 0.924454f, + 0.532235f, -0.979560f, -0.201155f, 0.020264f, 0.991905f, 0.126979f, + 0.660166f, -0.534944f, -0.844887f, 0.109621f, 0.772030f, 0.635586f, + 0.980484f, 0.992491f, -0.122317f, 0.044678f, 0.960855f, 0.277050f, + 0.569589f, -0.905924f, -0.423440f, 0.706310f, -0.271080f, -0.962557f, + 0.649912f, -0.588231f, -0.808693f, 0.347417f, -0.574581f, 0.818448f, + 0.507088f, -0.999009f, -0.044519f, 0.214359f, 0.222074f, 0.975030f, + 0.100343f, 0.807747f, 0.589529f, 0.675303f, -0.452292f, -0.891870f, + 0.965347f, 0.976390f, -0.216016f, 0.549325f, -0.952359f, -0.304979f, + 0.014160f, 0.996045f, 0.088855f, 0.838148f, 0.525963f, -0.850507f, + 0.712169f, -0.235467f, -0.971882f, 0.394781f, -0.789312f, 0.613992f, + 0.086183f, 0.856935f, 0.515425f, 0.631357f, -0.678306f, -0.734780f, + 0.427008f, -0.896665f, 0.442711f, 0.696788f, -0.328147f, -0.944627f, + 0.187991f, 0.379831f, 0.925056f, 0.873304f, 0.699533f, -0.714600f, + 0.609384f, -0.772973f, -0.634438f, 0.121340f, 0.723180f, 0.690659f, + 0.926772f, 0.896006f, -0.444043f, 0.317388f, -0.410871f, 0.911694f, + 0.174563f, 0.456434f, 0.889757f, 0.716564f, -0.208545f, -0.978013f, + 0.776135f, 0.163473f, -0.986548f, 0.211917f, 0.237004f, 0.971509f, + 0.886000f, 0.754251f, -0.656586f, 0.549081f, -0.952826f, -0.303518f, + 0.247807f, 0.013782f, 0.999905f, 0.477790f, -0.990279f, 0.139094f, + 0.659922f, -0.536240f, -0.844066f, 0.891615f, 0.776942f, -0.629572f, + 0.315679f, -0.401058f, 0.916053f, 0.854261f, 0.609232f, -0.792992f, + 0.488533f, -0.997406f, 0.071988f, 0.756359f, 0.039945f, -0.999202f, + 0.357183f, -0.623688f, 0.781673f, 0.787366f, 0.232624f, -0.972567f, + 0.149416f, 0.590748f, 0.806856f, 0.938491f, 0.926244f, -0.376924f, + 0.532479f, -0.979250f, -0.202657f, 0.883803f, 0.745114f, -0.666937f, + 0.054932f, 0.941024f, 0.338339f, 0.693126f, -0.349794f, -0.936827f, + 0.362310f, -0.648541f, 0.761180f, 0.794690f, 0.277119f, -0.960836f, + 0.253910f, -0.024566f, 0.999698f, 0.066651f, 0.913584f, 0.406649f, + 0.688487f, -0.376946f, -0.926235f, 0.460456f, -0.969292f, 0.245912f, + 0.624277f, -0.710311f, -0.703888f, 0.831800f, 0.491632f, -0.870803f, + 0.515633f, -0.995180f, -0.098066f, 0.414557f, -0.859322f, 0.511435f, + 0.810803f, 0.372813f, -0.927906f, 0.682383f, -0.412182f, -0.911102f, + 0.218265f, 0.198078f, 0.980186f, 0.369635f, -0.682871f, 0.730539f, + 0.288823f, -0.241519f, 0.970396f, 0.431403f, -0.908545f, 0.417786f, + 0.729992f, -0.125386f, -0.992108f, 0.860121f, 0.638007f, -0.770030f, + 0.327153f, -0.466004f, 0.884782f, 0.190433f, 0.365596f, 0.930774f, + 0.087404f, 0.852956f, 0.521982f, 0.779553f, 0.184621f, -0.982810f, + 0.615488f, -0.748080f, -0.663608f, 0.918715f, 0.872389f, -0.488812f, + 0.806409f, 0.347053f, -0.937846f, 0.458015f, -0.965406f, 0.260752f, + 0.269780f, -0.123959f, 0.992287f, 0.381109f, -0.733722f, 0.679450f, + 0.760754f, 0.067517f, -0.997718f, 0.190677f, 0.364168f, 0.931333f, + 0.921401f, 0.880513f, -0.474022f, 0.504158f, -0.999659f, -0.026123f, + 0.037598f, 0.972226f, 0.234045f, 0.966812f, 0.978337f, -0.207021f, + 0.804700f, 0.336962f, -0.941518f, 0.551522f, -0.948058f, -0.318098f, + 0.337407f, -0.522003f, 0.852944f, 0.986343f, 0.996321f, -0.085703f, + 0.392584f, -0.780761f, 0.624830f, 0.791028f, 0.254939f, -0.966957f, + 0.442634f, -0.935741f, 0.352689f, 0.547127f, -0.956479f, -0.291802f, + 0.019776f, 0.992290f, 0.123935f, 0.983413f, 0.994574f, -0.104028f, + 0.348882f, -0.582089f, 0.813125f, 0.622812f, -0.716760f, -0.697320f, + 0.836683f, 0.518113f, -0.855312f, 0.157473f, 0.549164f, 0.835715f, + 0.734386f, -0.097947f, -0.995192f, 0.410163f, -0.844875f, 0.534964f, + 0.059815f, 0.930203f, 0.367046f, 0.594980f, -0.827152f, -0.561978f, + 0.169192f, 0.486196f, 0.873850f, 0.010010f, 0.998023f, 0.062853f, + 0.257328f, -0.046028f, 0.998940f, 0.920912f, 0.879054f, -0.476722f, + 0.570321f, -0.903966f, -0.427605f, 0.304204f, -0.334027f, 0.942563f, + 0.472908f, -0.985546f, 0.169406f, 0.074220f, 0.893221f, 0.449618f, + 0.272709f, -0.142203f, 0.989838f, 0.181155f, 0.419201f, 0.907893f, + 0.777600f, 0.172547f, -0.985001f, 0.448737f, -0.948575f, 0.316553f, + 0.103761f, 0.794901f, 0.606739f, 0.917983f, 0.870130f, -0.492822f, + 0.175540f, 0.450966f, 0.892541f, 0.388434f, -0.764203f, 0.644976f, + 0.768811f, 0.117915f, -0.993024f, 0.541756f, -0.965780f, -0.259363f, + 0.002441f, 0.999882f, 0.015339f, 0.194095f, 0.344084f, 0.938939f, + 0.332280f, -0.494260f, 0.869314f, 0.735607f, -0.090311f, -0.995914f, + 0.162356f, 0.523270f, 0.852167f, 0.614511f, -0.752138f, -0.659006f, + 0.450202f, -0.951448f, 0.307809f, 0.785412f, 0.220671f, -0.975348f, + 0.932387f, 0.911112f, -0.412160f, 0.582773f, -0.867782f, -0.496946f, + 0.230472f, 0.122389f, 0.992482f, 0.528084f, -0.984472f, -0.175544f, + 0.386969f, -0.758234f, 0.651982f, 0.488777f, -0.997515f, 0.070458f, + 0.847913f, 0.577128f, -0.816654f, 0.258305f, -0.052156f, 0.998639f, + 0.018067f, 0.993564f, 0.113273f, 0.401129f, -0.813167f, 0.582031f, + 0.310307f, -0.369920f, 0.929064f, 0.736828f, -0.082670f, -0.996577f, + 0.042237f, 0.964992f, 0.262279f, 0.936049f, 0.920353f, -0.391088f, + 0.636728f, -0.653127f, -0.757249f, 0.440925f, -0.931900f, 0.362716f, + 0.316167f, -0.403866f, 0.914818f, 0.602304f, -0.800423f, -0.599436f, + 0.882338f, 0.738944f, -0.673766f, 0.289067f, -0.243007f, 0.970025f, + 0.107424f, 0.780731f, 0.624868f, 0.659190f, -0.540118f, -0.841589f, + 0.465095f, -0.976047f, 0.217561f, 0.234379f, 0.097995f, 0.995187f, + 0.705333f, -0.276981f, -0.960875f, 0.051270f, 0.948560f, 0.316598f, + 0.208255f, 0.259294f, 0.965799f, 0.640635f, -0.634346f, -0.773049f, + 0.829603f, 0.479564f, -0.877507f, 0.258793f, -0.055220f, 0.998474f, + 0.513924f, -0.996176f, -0.087375f, 0.091310f, 0.839889f, 0.542758f, + 0.387457f, -0.760231f, 0.649653f, 0.037354f, 0.972584f, 0.232554f, + 0.807141f, 0.351365f, -0.936238f, 0.998306f, 0.999943f, -0.010642f, + 0.273442f, -0.146756f, 0.989173f, 0.773693f, 0.148321f, -0.988939f, + 0.946304f, 0.943623f, -0.331021f, 0.437751f, -0.924481f, 0.381227f, + 0.710460f, -0.245889f, -0.969298f, 0.122072f, 0.719994f, 0.693980f, + 0.191165f, 0.361309f, 0.932446f, 0.624765f, -0.708148f, -0.706064f, + 0.698985f, -0.315074f, -0.949067f, 0.855970f, 0.617712f, -0.786405f, + 0.351812f, -0.596958f, 0.802273f, 0.646250f, -0.606682f, -0.794945f, + 0.983169f, 0.994414f, -0.105553f, 0.515389f, -0.995329f, -0.096540f, + 0.320562f, -0.428969f, 0.903319f, 0.566903f, -0.912940f, -0.408094f, + 0.654551f, -0.564414f, -0.825492f, 0.884047f, 0.746137f, -0.665793f, + 0.296880f, -0.290312f, 0.956932f, 0.087160f, 0.853756f, 0.520673f, + 0.957046f, 0.963801f, -0.266624f, 0.700206f, -0.307786f, -0.951456f, + 0.271244f, -0.133086f, 0.991104f, 0.905043f, 0.827233f, -0.561859f, + 0.041016f, 0.966975f, 0.254869f, 0.992691f, 0.998946f, -0.045908f, + 0.118898f, 0.733690f, 0.679485f, 0.867689f, 0.673890f, -0.738831f, + 0.177981f, 0.437222f, 0.899354f, 0.078126f, 0.881918f, 0.471403f, + 0.673838f, -0.460481f, -0.887669f, 0.945327f, 0.941575f, -0.336805f, + 0.136477f, 0.654324f, 0.756215f, 0.741222f, -0.055124f, -0.998480f, + 0.906752f, 0.833218f, -0.552944f, 0.439704f, -0.929090f, 0.369853f, + 0.564950f, -0.917879f, -0.396860f, 0.960464f, 0.969304f, -0.245866f, + 0.127687f, 0.695066f, 0.718946f, 0.520272f, -0.991899f, -0.127026f, + 0.862318f, 0.648577f, -0.761149f, 0.241703f, 0.052109f, 0.998641f, + 0.072023f, 0.899343f, 0.437243f, 0.799329f, 0.305002f, -0.952352f, + 0.120851f, 0.725296f, 0.688437f, 0.223880f, 0.163379f, 0.986563f, + 0.735851f, -0.088783f, -0.996051f, 0.373785f, -0.701688f, 0.712484f, + 0.851087f, 0.593298f, -0.804983f, 0.043702f, 0.962537f, 0.271149f, + 0.931411f, 0.908565f, -0.417743f, 0.133547f, 0.668133f, 0.744042f, + 0.531991f, -0.979867f, -0.199652f, 0.305425f, -0.341247f, 0.939974f, + 0.739513f, -0.065843f, -0.997830f, 0.943862f, 0.938435f, -0.345456f, + 0.409674f, -0.843229f, 0.537554f, 0.136233f, 0.655483f, 0.755210f, + 0.670176f, -0.480783f, -0.876840f, 0.939223f, 0.927969f, -0.372658f, + 0.471931f, -0.984488f, 0.175450f, 0.573739f, -0.894575f, -0.446918f, + 0.319585f, -0.423418f, 0.905934f, 0.617197f, -0.740911f, -0.671603f, + 0.129152f, 0.688420f, 0.725312f, 0.519539f, -0.992473f, -0.122460f, + 0.342779f, -0.550485f, 0.834845f, 0.647959f, -0.598111f, -0.801413f, + 0.547860f, -0.955126f, -0.296201f, 0.869398f, 0.681785f, -0.731553f, + 0.403571f, -0.821999f, 0.569489f, 0.989761f, 0.997931f, -0.064288f, + 0.023682f, 0.988950f, 0.148250f, 0.437263f, -0.923308f, 0.384061f, + 0.561532f, -0.926190f, -0.377057f, 0.119142f, 0.732646f, 0.680609f, + 0.225101f, 0.155807f, 0.987788f, 0.838636f, 0.528570f, -0.848890f, + 0.014649f, 0.995767f, 0.091910f, 0.737316f, -0.079612f, -0.996826f, + 0.422614f, -0.884100f, 0.467297f, 0.123293f, 0.714650f, 0.699482f, + 0.603769f, -0.794872f, -0.606777f, 0.791272f, 0.256422f, -0.966565f, + 0.437018f, -0.922717f, 0.385477f, 0.859144f, 0.633271f, -0.773931f, + 0.585702f, -0.858487f, -0.512835f, 0.481453f, -0.993217f, 0.116273f, + 0.381598f, -0.735803f, 0.677195f, 0.255131f, -0.032232f, 0.999480f, + 0.552255f, -0.946584f, -0.322458f, 0.708019f, -0.260729f, -0.965412f, + 0.478767f, -0.991114f, 0.133015f, 0.350103f, -0.588309f, 0.808636f, + 0.821057f, 0.431782f, -0.901978f, 0.028321f, 0.984210f, 0.177007f, + 0.612314f, -0.761164f, -0.648559f, 0.302739f, -0.325338f, 0.945598f, + 0.055909f, 0.938931f, 0.344106f, 0.679210f, -0.430268f, -0.902701f, + 0.171389f, 0.474086f, 0.880479f, 0.837415f, 0.522044f, -0.852919f, + 0.662119f, -0.524536f, -0.851388f, 0.198489f, 0.318030f, 0.948081f, + 0.589853f, -0.844823f, -0.535045f, 0.705089f, -0.278455f, -0.960449f, + 0.490730f, -0.998304f, 0.058211f, 0.363775f, -0.655519f, 0.755179f, + 0.994156f, 0.999326f, -0.036712f, 0.683848f, -0.403778f, -0.914857f, + 0.533700f, -0.977667f, -0.210162f, 0.160403f, 0.533688f, 0.845681f, + 0.593759f, -0.831438f, -0.555618f, 0.273198f, -0.145239f, 0.989397f, + 0.762951f, 0.081284f, -0.996691f, 0.629892f, -0.685040f, -0.728506f, + 0.835950f, 0.514171f, -0.857687f, 0.897963f, 0.801428f, -0.598092f, + 0.492195f, -0.998798f, 0.049021f, 0.101076f, 0.805026f, 0.593240f, + 0.580575f, -0.874560f, -0.484918f, 0.796643f, 0.288890f, -0.957362f, + 0.303227f, -0.328237f, 0.944595f, 0.857679f, 0.626121f, -0.779726f, + 0.235843f, 0.088831f, 0.996047f, 0.699229f, -0.313618f, -0.949549f, + 0.907485f, 0.835754f, -0.549104f, 0.203616f, 0.287329f, 0.957832f, + 0.459968f, -0.968533f, 0.248885f, 0.841321f, 0.542819f, -0.839850f, + 0.079835f, 0.876805f, 0.480846f, 0.219730f, 0.189048f, 0.981968f, + 0.783215f, 0.207185f, -0.978302f, 0.057130f, 0.936264f, 0.351298f, + 0.503426f, -0.999768f, -0.021522f, 0.817639f, 0.412313f, -0.911042f, + 0.242679f, 0.045980f, 0.998942f, 0.762463f, 0.078226f, -0.996936f, + 0.911391f, 0.848978f, -0.528428f, 0.715831f, -0.213043f, -0.977043f, + 0.401862f, -0.815837f, 0.578282f, 0.613779f, -0.755163f, -0.655537f, + 0.279057f, -0.181558f, 0.983380f, 0.955337f, 0.960882f, -0.276958f, + 0.214603f, 0.220578f, 0.975369f, 0.493904f, -0.999267f, 0.038293f, + 0.927749f, 0.898713f, -0.438536f, 0.234867f, 0.094941f, 0.995483f, + 0.367193f, -0.671585f, 0.740927f, 0.149172f, 0.591985f, 0.805949f, + 0.098146f, 0.815809f, 0.578321f, 0.647715f, -0.599340f, -0.800495f, + 0.824964f, 0.453788f, -0.891110f, 0.766125f, 0.101143f, -0.994872f, + 0.316411f, -0.405269f, 0.914197f, 0.017334f, 0.994075f, 0.108699f, + 0.637461f, -0.649635f, -0.760246f, 0.899672f, 0.807804f, -0.589452f, + 0.268803f, -0.117868f, 0.993029f, 0.404059f, -0.823742f, 0.566964f, + 0.791516f, 0.257904f, -0.966170f, 0.999039f, 0.999982f, -0.006040f, + 0.218509f, 0.196574f, 0.980489f, 0.503670f, -0.999734f, -0.023056f, + 0.371588f, -0.691785f, 0.722104f, 0.762707f, 0.079755f, -0.996814f, + 0.081788f, 0.870838f, 0.491570f, 0.341314f, -0.542778f, 0.839876f, + 0.419196f, -0.873861f, 0.486175f, 0.890639f, 0.773065f, -0.634327f, + 0.163333f, 0.518031f, 0.855362f, 0.566659f, -0.913565f, -0.406693f, + 0.835218f, 0.510219f, -0.860045f, 0.008545f, 0.998559f, 0.053664f, + 0.449226f, -0.949542f, 0.313641f, 0.910414f, 0.845720f, -0.533627f, + 0.402594f, -0.818489f, 0.574522f, 0.510994f, -0.997615f, -0.069023f, + 0.354986f, -0.612837f, 0.790209f, 0.177005f, 0.442732f, 0.896654f, + 0.417243f, -0.867829f, 0.496862f, 0.063233f, 0.922106f, 0.386937f, + 0.261723f, -0.073590f, 0.997289f, 0.372808f, -0.697303f, 0.716776f, + 0.197024f, 0.326743f, 0.945113f, 0.724620f, -0.158790f, -0.987312f, + 0.442145f, -0.934654f, 0.355558f, 0.000244f, 0.999999f, 0.001534f, + 0.169436f, 0.484855f, 0.874595f, 0.760266f, 0.064455f, -0.997921f, + 0.365484f, -0.663590f, 0.748096f, 0.048829f, 0.953305f, 0.302010f, + 0.679942f, -0.426109f, -0.904672f, 0.958999f, 0.967000f, -0.254777f, + 0.727306f, -0.142108f, -0.989851f, 0.382818f, -0.740976f, 0.671532f, + 0.908949f, 0.840773f, -0.541388f, 0.275151f, -0.157370f, 0.987540f, + 0.330816f, -0.486238f, 0.873826f, 0.112551f, 0.760200f, 0.649690f, + 0.602060f, -0.801342f, -0.598207f, 0.167971f, 0.492884f, 0.870095f, + 0.311040f, -0.374192f, 0.927351f, 0.039796f, 0.968902f, 0.247445f, + 0.491463f, -0.998562f, 0.053616f, 0.877455f, 0.717929f, -0.696117f, + 0.152834f, 0.573285f, 0.819356f, 0.813733f, 0.389830f, -0.920887f, + 0.686534f, -0.388284f, -0.921540f, 0.032471f, 0.979259f, 0.202610f, + 0.340337f, -0.537615f, 0.843191f, 0.661387f, -0.528448f, -0.848966f, + 0.511482f, -0.997399f, -0.072084f, 0.979995f, 0.992111f, -0.125362f, + 0.748791f, -0.007598f, -0.999971f, 0.212894f, 0.231038f, 0.972945f, + 0.054688f, 0.941542f, 0.336895f, 0.508797f, -0.998473f, -0.055244f, + 0.958267f, 0.965817f, -0.259224f, 0.420172f, -0.876828f, 0.480804f, + 0.215335f, 0.216087f, 0.976374f, 0.756603f, 0.041478f, -0.999139f, + 0.517830f, -0.993731f, -0.111796f, 0.165774f, 0.504849f, 0.863207f, + 0.457527f, -0.964601f, 0.263712f, 0.551766f, -0.947569f, -0.319552f, + 0.709728f, -0.250347f, -0.968156f, 0.875746f, 0.710412f, -0.703786f, + 0.284184f, -0.213137f, 0.977022f, 0.619883f, -0.729474f, -0.684009f, + 0.468757f, -0.980794f, 0.195046f, 0.976089f, 0.988736f, -0.149672f, + 0.781262f, 0.195164f, -0.980771f, 0.294194f, -0.274124f, 0.961694f, + 0.093751f, 0.831465f, 0.555578f, 0.652598f, -0.574502f, -0.818503f, + 0.256596f, -0.041430f, 0.999141f, 0.329595f, -0.479521f, 0.877530f, + 0.769055f, 0.119438f, -0.992842f, 0.205081f, 0.278501f, 0.960436f, + 0.979019f, 0.991323f, -0.131447f, 0.711192f, -0.241426f, -0.970419f, + 0.026612f, 0.986054f, 0.166428f, 0.956558f, 0.962978f, -0.269580f, + 0.566171f, -0.914808f, -0.403888f, 0.786633f, 0.228146f, -0.973627f, + 0.677501f, -0.439936f, -0.898029f, 0.989517f, 0.997832f, -0.065819f, + 0.873548f, 0.700629f, -0.713526f, 0.078614f, 0.880467f, 0.474107f, + 0.627695f, -0.695032f, -0.718979f, 0.560067f, -0.929621f, -0.368517f, + 0.966079f, 0.977373f, -0.211521f, 0.509285f, -0.998299f, -0.058307f, + 0.112062f, 0.762189f, 0.647354f, 0.874769f, 0.706081f, -0.708131f, + 0.416510f, -0.865534f, 0.500851f, 0.296147f, -0.285905f, 0.958258f, + 0.583017f, -0.867018f, -0.498276f, 0.138674f, 0.643821f, 0.765176f, + 0.466804f, -0.978327f, 0.207068f, 0.638926f, -0.642610f, -0.766193f, + 0.947768f, 0.946630f, -0.322322f, 0.686046f, -0.391110f, -0.920344f, + 0.374762f, -0.706047f, 0.708165f, 0.530526f, -0.981663f, -0.190625f, + 0.969741f, 0.981981f, -0.188977f, 0.792981f, 0.266786f, -0.963756f, + 0.668467f, -0.490171f, -0.871627f, 0.361334f, -0.643858f, 0.765145f, + 0.072755f, 0.897322f, 0.441378f, 0.453132f, -0.956953f, 0.290243f, + 0.547616f, -0.955579f, -0.294736f, 0.754650f, 0.029214f, -0.999573f, + 0.172122f, 0.470029f, 0.882651f, 0.847425f, 0.574620f, -0.818420f, + 0.064698f, 0.918506f, 0.395407f, 0.563973f, -0.920297f, -0.391220f, + 0.302495f, -0.323887f, 0.946096f, 0.404547f, -0.825478f, 0.564434f, + 0.923354f, 0.886264f, -0.463181f, 0.167239f, 0.496883f, 0.867817f, + 0.607431f, -0.780701f, -0.624905f, 0.849622f, 0.585864f, -0.810409f, + 0.135012f, 0.661256f, 0.750160f, 0.569100f, -0.907219f, -0.420659f, + 0.968032f, 0.979896f, -0.199511f, 0.102785f, 0.798609f, 0.601850f, + 0.655283f, -0.560610f, -0.828080f, 0.345953f, -0.567023f, 0.823702f, + 0.074708f, 0.891837f, 0.452356f, 0.143069f, 0.622451f, 0.782659f, + 0.937026f, 0.922736f, -0.385433f, 0.000000f, 1.000000f, 0.000000f, + 0.249027f, 0.006112f, 0.999981f, 0.543465f, -0.962939f, -0.269718f, + 0.050538f, 0.950007f, 0.312229f, 0.915541f, 0.862468f, -0.506111f, + 0.730236f, -0.123864f, -0.992299f, 0.381842f, -0.736841f, 0.676066f, + 0.950210f, 0.951463f, -0.307763f, 0.502937f, -0.999830f, -0.018455f, + 0.075441f, 0.889746f, 0.456455f, 0.664561f, -0.511414f, -0.859334f, + 0.306889f, -0.349884f, 0.936793f, 0.105470f, 0.788340f, 0.615240f, + 0.865248f, 0.662478f, -0.749081f, 0.239750f, 0.064360f, 0.997927f, + 0.458503f, -0.966201f, 0.257789f, 0.321050f, -0.431738f, 0.901999f, + 0.611093f, -0.766116f, -0.642702f, 0.151369f, 0.580802f, 0.814045f, + 0.527840f, -0.984740f, -0.174034f, 0.339117f, -0.531132f, 0.847289f, + 0.923110f, 0.885552f, -0.464540f, 0.390875f, -0.774006f, 0.633178f, + 0.262699f, -0.079708f, 0.996818f, 0.822522f, 0.440065f, -0.897966f, + 0.639170f, -0.641434f, -0.767178f, 0.552743f, -0.945590f, -0.325360f, + 0.243412f, 0.041382f, 0.999143f, 0.798108f, 0.297689f, -0.954663f, + 0.036622f, 0.973643f, 0.228076f, 0.190188f, 0.367023f, 0.930212f, + 0.836194f, 0.515487f, -0.856898f, 0.555917f, -0.938914f, -0.344151f, + 0.006836f, 0.999078f, 0.042939f, 0.737072f, -0.081141f, -0.996703f, + 0.874281f, 0.703905f, -0.710294f, 0.457038f, -0.963788f, 0.266671f, + 0.083986f, 0.863969f, 0.503545f, 0.259770f, -0.061346f, 0.998117f, + 0.190921f, 0.362739f, 0.931891f, 0.934585f, 0.916715f, -0.399542f, + 0.588388f, -0.849712f, -0.527247f, 0.307866f, -0.355625f, 0.934629f, + 0.997086f, 0.999832f, -0.018311f, 0.391852f, -0.777877f, 0.628417f, + 0.901869f, 0.815864f, -0.578243f, 0.268559f, -0.116344f, 0.993209f, + 0.717784f, -0.201037f, -0.979584f, 0.803967f, 0.332626f, -0.943059f, + 0.457282f, -0.964196f, 0.265192f, 0.874525f, 0.704994f, -0.709214f, + 0.672129f, -0.469986f, -0.882674f, 0.343511f, -0.554322f, 0.832303f, + 0.722423f, -0.172405f, -0.985026f, 0.282719f, -0.204136f, 0.978943f, + 0.068116f, 0.909803f, 0.415040f, 0.685557f, -0.393932f, -0.919140f, + 0.314214f, -0.392609f, 0.919705f, 0.860609f, 0.640367f, -0.768069f, + 0.245609f, 0.027585f, 0.999619f, 0.922866f, 0.884838f, -0.465898f, + 0.745861f, -0.026003f, -0.999662f, 0.433356f, -0.913604f, 0.406605f, + 0.573251f, -0.895942f, -0.444171f, 0.792248f, 0.262348f, -0.964973f, + 0.856214f, 0.618917f, -0.785456f, 0.681407f, -0.417764f, -0.908555f, + 0.138918f, 0.642647f, 0.766163f, 0.607675f, -0.779741f, -0.626102f, + 0.464363f, -0.975035f, 0.222050f, 0.187503f, 0.382667f, 0.923886f, + 0.864027f, 0.656713f, -0.754141f, 0.622324f, -0.718896f, -0.695118f, + 0.141360f, 0.630819f, 0.775930f, 0.797375f, 0.293292f, -0.956023f, + 0.479744f, -0.991912f, 0.126931f, 0.577646f, -0.883337f, -0.468738f, + 0.646738f, -0.604240f, -0.796802f, 0.815442f, 0.399696f, -0.916648f, + 0.120119f, 0.728457f, 0.685092f, 0.718517f, -0.196527f, -0.980498f, + 0.015869f, 0.995033f, 0.099545f, 0.842542f, 0.549244f, -0.835662f, + 0.469001f, -0.981092f, 0.193541f, 0.222904f, 0.169429f, 0.985542f, + 0.780041f, 0.187636f, -0.982239f, 0.694102f, -0.344039f, -0.938955f, + 0.065187f, 0.917289f, 0.398223f, 0.315190f, -0.398245f, 0.917279f, + 0.475349f, -0.988029f, 0.154268f, 0.157229f, 0.550445f, 0.834871f, + 0.912367f, 0.852205f, -0.523209f, 0.663340f, -0.517990f, -0.855387f, + 0.501472f, -0.999957f, -0.009252f, 0.975113f, 0.987799f, -0.155736f, + 0.749767f, -0.001462f, -0.999999f, 0.236576f, 0.084246f, 0.996445f, + 0.424567f, -0.889768f, 0.456413f, 0.145266f, 0.611586f, 0.791178f, + 0.212161f, 0.235513f, 0.971871f, 0.813245f, 0.387003f, -0.922078f, + 0.643809f, -0.618805f, -0.785545f, 0.568124f, -0.909783f, -0.415084f, + 0.429694f, -0.904007f, 0.427518f, 0.766613f, 0.104195f, -0.994557f, + 0.707286f, -0.265169f, -0.964202f, 0.238285f, 0.073542f, 0.997292f, + 0.091798f, 0.838220f, 0.545332f, 0.628672f, -0.690607f, -0.723230f, + 0.118410f, 0.735771f, 0.677231f, 0.425788f, -0.893243f, 0.449575f, + 0.599130f, -0.812217f, -0.583355f, 0.037110f, 0.972939f, 0.231062f, + 0.137453f, 0.649671f, 0.760215f, 0.248295f, 0.010714f, 0.999943f, + 0.547372f, -0.956030f, -0.293269f, 0.104250f, 0.793036f, 0.609175f, + 0.471687f, -0.984218f, 0.176960f, 0.910903f, 0.847353f, -0.531030f, + 0.380621f, -0.731634f, 0.681697f, 0.795422f, 0.281538f, -0.959550f, + 0.431159f, -0.907903f, 0.419179f, 0.013672f, 0.996312f, 0.085799f, + 0.606210f, -0.785471f, -0.618899f, 0.823499f, 0.445567f, -0.895249f, + 0.200198f, 0.307831f, 0.951441f, 0.306645f, -0.348446f, 0.937329f, + 0.647227f, -0.601793f, -0.798652f, 0.378180f, -0.721091f, 0.692840f, + 0.177493f, 0.439979f, 0.898008f, 0.330327f, -0.483555f, 0.875314f, + 0.414069f, -0.857749f, 0.514069f, 0.233158f, 0.105625f, 0.994406f, + 0.816175f, 0.403910f, -0.914799f, 0.022461f, 0.990058f, 0.140660f, + 0.553964f, -0.943067f, -0.332603f, 0.426276f, -0.894618f, 0.446832f, + 0.928481f, 0.900722f, -0.434396f, 0.249516f, 0.003044f, 0.999995f, + 0.894301f, 0.787455f, -0.616373f, 0.185550f, 0.393976f, 0.919121f, + 0.410895f, -0.847328f, 0.531071f, 0.519783f, -0.992284f, -0.123982f, + 0.903822f, 0.822899f, -0.568188f, 0.204349f, 0.282918f, 0.959144f, + 0.396002f, -0.793999f, 0.607920f, 0.758556f, 0.053736f, -0.998555f, + 0.292729f, -0.265261f, 0.964177f, 0.041993f, 0.965393f, 0.260798f, + 0.881117f, 0.733755f, -0.679414f, 0.144289f, 0.616429f, 0.787410f, + 0.431647f, -0.909185f, 0.416392f, 0.746105f, -0.024470f, -0.999701f, + 0.990738f, 0.998307f, -0.058163f, 0.024903f, 0.987784f, 0.155831f, + 0.716075f, -0.211544f, -0.977368f, 0.395758f, -0.793065f, 0.609137f, + 0.319097f, -0.420637f, 0.907229f, 0.613046f, -0.758172f, -0.652055f, + 0.071778f, 0.900013f, 0.435863f, 0.358648f, -0.630856f, 0.775900f, + 0.890394f, 0.772091f, -0.635512f, 0.516609f, -0.994559f, -0.104171f, + 0.299321f, -0.304957f, 0.952366f, 0.046876f, 0.956939f, 0.290289f, + 0.951431f, 0.953796f, -0.300456f, 0.326665f, -0.463288f, 0.886208f, + 0.124269f, 0.710345f, 0.703854f, 0.895521f, 0.792159f, -0.610315f, + 0.004150f, 0.999660f, 0.026075f, 0.505379f, -0.999429f, -0.033790f, + 0.863050f, 0.652073f, -0.758156f, 0.796887f, 0.290358f, -0.956918f, + 0.533455f, -0.977988f, -0.208662f, 0.206546f, 0.269649f, 0.962959f, + 0.965103f, 0.976057f, -0.217514f, 0.330571f, -0.484897f, 0.874571f, + 0.640391f, -0.635531f, -0.772075f, 0.946059f, 0.943115f, -0.332468f, + 0.741955f, -0.050529f, -0.998723f, 0.005371f, 0.999431f, 0.033742f, + 0.820325f, 0.427626f, -0.903956f, 0.583993f, -0.863945f, -0.503587f, + 0.231937f, 0.113249f, 0.993567f, 0.505623f, -0.999376f, -0.035323f, + 0.935805f, 0.919752f, -0.392499f, 0.718273f, -0.198031f, -0.980196f, + 0.365240f, -0.662442f, 0.749113f, 0.478035f, -0.990491f, 0.137575f, + 0.053956f, 0.943083f, 0.332558f, 0.526375f, -0.986300f, -0.164963f, + 0.981949f, 0.993575f, -0.113177f, 0.108400f, 0.776882f, 0.629646f, + 0.495369f, -0.999577f, 0.029094f, 0.943130f, 0.936835f, -0.349771f, + 0.709239f, -0.253316f, -0.967384f, 0.524178f, -0.988483f, -0.151331f, + 0.988540f, 0.997409f, -0.071940f, 0.754406f, 0.027680f, -0.999617f, + 0.303471f, -0.329686f, 0.944091f, 0.063966f, 0.920316f, 0.391176f, + 0.718761f, -0.195023f, -0.980799f, 0.375494f, -0.709298f, 0.704909f, + 0.012451f, 0.996941f, 0.078154f, 0.748302f, -0.010666f, -0.999943f, + 0.081544f, 0.871591f, 0.490233f, 0.348150f, -0.578341f, 0.815795f, + 0.279301f, -0.183066f, 0.983101f, 0.940444f, 0.930800f, -0.365529f, + 0.553719f, -0.943576f, -0.331156f, 0.666026f, -0.503483f, -0.864005f, + 0.968765f, 0.980803f, -0.194999f, 0.589609f, -0.845643f, -0.533749f, + 0.500496f, -0.999995f, -0.003116f, 0.649424f, -0.590709f, -0.806884f, + 0.202640f, 0.293201f, 0.956051f, 0.855482f, 0.615296f, -0.788296f, + 0.596689f, -0.821070f, -0.570828f, 0.361822f, -0.646202f, 0.763166f, + 0.215824f, 0.213090f, 0.977033f, 0.086427f, 0.856143f, 0.516739f, + 0.861097f, 0.642720f, -0.766101f, 0.445563f, -0.942074f, 0.335405f, + 0.269047f, -0.119391f, 0.992847f, 0.659678f, -0.537534f, -0.843242f, + 0.786145f, 0.225157f, -0.974322f, 0.994400f, 0.999381f, -0.035179f, + 0.599619f, -0.810424f, -0.585844f, 0.396246f, -0.794930f, 0.606701f, + 0.719249f, -0.192013f, -0.981392f, 0.850355f, 0.589587f, -0.807705f, + 0.525154f, -0.987536f, -0.157393f, 0.384771f, -0.749161f, 0.662388f, + 0.654307f, -0.565680f, -0.824625f, 0.182376f, 0.412225f, 0.911082f, + 0.353521f, -0.605538f, 0.795816f, 0.724376f, -0.160304f, -0.987068f, + 0.300298f, -0.310795f, 0.950477f, 0.477058f, -0.989629f, 0.143650f, + 0.690196f, -0.366979f, -0.930229f, 0.824475f, 0.451052f, -0.892498f, + 0.376959f, -0.715756f, 0.698350f, 0.504402f, -0.999617f, -0.027656f, + 0.204105f, 0.284389f, 0.958709f, 0.428962f, -0.902030f, 0.431674f, + 0.985855f, 0.996053f, -0.088759f, 0.153811f, 0.568247f, 0.822858f, + 0.646983f, -0.603017f, -0.797728f, 0.044434f, 0.961279f, 0.275576f, + 0.185061f, 0.396794f, 0.917908f, 0.541512f, -0.966177f, -0.257881f, + 0.119631f, 0.730555f, 0.682854f, 0.779797f, 0.186129f, -0.982525f, + 0.902358f, 0.817635f, -0.575737f, 0.688731f, -0.375525f, -0.926812f, + 0.242191f, 0.049044f, 0.998797f, 0.833265f, 0.499626f, -0.866241f, + 0.758312f, 0.052204f, -0.998636f, 0.042969f, 0.963775f, 0.266717f, + 0.885512f, 0.752233f, -0.658897f, 0.284916f, -0.217631f, 0.976031f, + 0.123049f, 0.715723f, 0.698385f, 0.360601f, -0.640330f, 0.768100f, + 0.671641f, -0.472692f, -0.881228f, 0.223148f, 0.167917f, 0.985801f, + 0.596201f, -0.822817f, -0.568306f, 0.833509f, 0.500955f, -0.865474f, + 0.325444f, -0.456477f, 0.889735f, 0.667247f, -0.496842f, -0.867841f, + 0.999771f, 0.999999f, -0.001438f, 0.780774f, 0.192154f, -0.981365f, + 0.605478f, -0.788311f, -0.615277f, 0.070802f, 0.902670f, 0.430333f, + 0.447517f, -0.946119f, 0.323819f, 0.171633f, 0.472735f, 0.881205f, + 0.114992f, 0.750144f, 0.661274f, 0.377935f, -0.720028f, 0.693945f, + 0.257084f, -0.044495f, 0.999010f, 0.952163f, 0.955168f, -0.296064f, + 0.564218f, -0.919696f, -0.392631f, 0.099855f, 0.809552f, 0.587048f, + 0.276616f, -0.166452f, 0.986050f, 0.810315f, 0.369965f, -0.929046f, + 0.518563f, -0.993206f, -0.116368f, 0.953384f, 0.957411f, -0.288729f, + 0.758801f, 0.055268f, -0.998472f, 0.134035f, 0.665847f, 0.746089f, + 0.922133f, 0.882685f, -0.469965f, 0.573007f, -0.896622f, -0.442796f, + 0.177737f, 0.438601f, 0.898682f, 0.104738f, 0.791163f, 0.611605f, + 0.689220f, -0.372680f, -0.927960f, 0.484382f, -0.995189f, 0.097971f, + 0.232914f, 0.107150f, 0.994243f, 0.173831f, 0.460524f, 0.887647f, + 0.064942f, 0.917898f, 0.396816f, 0.805432f, 0.341292f, -0.939957f, + 0.272953f, -0.143721f, 0.989618f, 0.973648f, 0.986323f, -0.164821f, + 0.442390f, -0.935199f, 0.354124f, 0.062989f, 0.922699f, 0.385522f, + 0.936538f, 0.921549f, -0.388262f, 0.019532f, 0.992479f, 0.122413f, + 0.867933f, 0.675023f, -0.737797f, 0.174075f, 0.459162f, 0.888353f, + 0.079103f, 0.879009f, 0.476806f, 0.774914f, 0.155902f, -0.987773f, + 0.899916f, 0.808707f, -0.588212f, 0.271489f, -0.134607f, 0.990899f, + 0.691661f, -0.358402f, -0.933568f, 0.332525f, -0.495593f, 0.868555f, + 0.751720f, 0.010810f, -0.999942f, 0.854749f, 0.611662f, -0.791119f, + 0.293217f, -0.268218f, 0.963358f, 0.975601f, 0.988272f, -0.152705f, + 0.253666f, -0.023032f, 0.999735f, 0.587167f, -0.853731f, -0.520714f, + 0.165042f, 0.508817f, 0.860875f, 0.401373f, -0.814059f, 0.580783f, + 0.023194f, 0.989400f, 0.145215f, 0.604013f, -0.793940f, -0.607996f, + 0.443122f, -0.936818f, 0.349816f, 0.206790f, 0.268172f, 0.963371f, + 0.577401f, -0.884055f, -0.467382f, 0.077150f, 0.884794f, 0.465983f, + 0.636973f, -0.651964f, -0.758250f, 0.454108f, -0.958716f, 0.284366f, + 0.853773f, 0.606796f, -0.794857f, 0.955093f, 0.960456f, -0.278432f, + 0.156497f, 0.554282f, 0.832329f, 0.531014f, -0.981074f, -0.193636f, + 0.911635f, 0.849788f, -0.527125f, 0.261479f, -0.072060f, 0.997400f, + 0.470466f, -0.982832f, 0.184503f, 0.146487f, 0.605500f, 0.795845f, + 0.695079f, -0.338271f, -0.941049f, 0.863539f, 0.654396f, -0.756152f, + 0.801770f, 0.319575f, -0.947561f, 0.334722f, -0.507537f, 0.861630f, + 0.894545f, 0.788399f, -0.615164f, 0.729259f, -0.129950f, -0.991521f, + 0.820081f, 0.426239f, -0.904611f, 0.060792f, 0.927933f, 0.372746f, + 0.349615f, -0.585825f, 0.810438f, 0.465583f, -0.976710f, 0.214565f, + 0.929213f, 0.902712f, -0.430246f, 0.672618f, -0.467276f, -0.884111f, + 0.418708f, -0.872366f, 0.488854f, 0.174807f, 0.455069f, 0.890456f, + 0.549569f, -0.951890f, -0.306440f, 0.692393f, -0.354101f, -0.935207f, + 0.029053f, 0.983385f, 0.181534f, 0.475105f, -0.987791f, 0.155783f, + 0.844251f, 0.558186f, -0.829716f, 0.334478f, -0.506214f, 0.862408f, + 0.016602f, 0.994564f, 0.104123f, 0.911879f, 0.850595f, -0.525821f, + 0.760021f, 0.062924f, -0.998018f, 0.622080f, -0.719961f, -0.694014f, + 0.930434f, 0.905985f, -0.423310f, 0.466560f, -0.978008f, 0.208568f, + 0.559335f, -0.931307f, -0.364235f, 0.752941f, 0.018479f, -0.999829f, + 0.142336f, 0.626046f, 0.779786f, 0.581064f, -0.873068f, -0.487599f, + 0.642344f, -0.626008f, -0.779816f, 0.252689f, -0.016897f, 0.999857f, + 0.551278f, -0.948545f, -0.316644f, 0.415534f, -0.862444f, 0.506152f, + 0.586679f, -0.855325f, -0.518093f, 0.309087f, -0.362783f, 0.931874f, + 0.625254f, -0.705979f, -0.708233f, 0.117433f, 0.739913f, 0.672703f, + 0.559091f, -0.931865f, -0.362806f, 0.398199f, -0.802316f, 0.596900f, + 0.089113f, 0.847302f, 0.531111f, 0.456062f, -0.962133f, 0.272579f, + 0.615732f, -0.747061f, -0.664755f, 0.682139f, -0.413579f, -0.910468f, + 0.418952f, -0.873115f, 0.487515f, 0.880385f, 0.730620f, -0.682784f, + 0.325933f, -0.459204f, 0.888331f, 0.742443f, -0.047464f, -0.998873f, + 0.926528f, 0.895323f, -0.445416f, 0.290043f, -0.248955f, 0.968515f, + 0.352056f, -0.598188f, 0.801356f, 0.665537f, -0.506132f, -0.862456f, + 0.810071f, 0.368539f, -0.929612f, 0.396979f, -0.797714f, 0.603036f, + 0.933364f, 0.913623f, -0.406561f, 0.180423f, 0.423375f, 0.905955f, + 0.771496f, 0.134654f, -0.990893f, 0.496101f, -0.999700f, 0.024494f, + 0.106203f, 0.785501f, 0.618861f, 0.438239f, -0.925647f, 0.378389f, + 0.628428f, -0.691716f, -0.722170f, 0.052979f, 0.945106f, 0.326765f, + 0.571054f, -0.901989f, -0.431760f, 0.220218f, 0.186034f, 0.982543f, + 0.417487f, -0.868591f, 0.495530f, 0.030274f, 0.981963f, 0.189072f, + 0.248783f, 0.007646f, 0.999971f, 0.491951f, -0.998721f, 0.050553f, + 0.620859f, -0.725263f, -0.688472f, 0.011719f, 0.997290f, 0.073566f, + 0.425055f, -0.891164f, 0.453681f, 0.678721f, -0.433035f, -0.901377f, + 0.781994f, 0.199675f, -0.979862f, 0.162844f, 0.520653f, 0.853768f, + 0.733165f, -0.105577f, -0.994411f, 0.006348f, 0.999205f, 0.039874f, + 0.620615f, -0.726318f, -0.687359f, 0.258549f, -0.053688f, 0.998558f, + 0.833021f, 0.498297f, -0.867006f, 0.308354f, -0.358491f, 0.933533f, + 0.382574f, -0.739945f, 0.672668f, 0.222660f, 0.170941f, 0.985281f, + 0.731945f, -0.113201f, -0.993572f, 0.419684f, -0.875349f, 0.483492f, + 0.276860f, -0.167964f, 0.985793f, 0.552010f, -0.947077f, -0.321005f, + 0.135988f, 0.656641f, 0.754204f, 0.364508f, -0.658988f, 0.752154f, + 0.305913f, -0.344129f, 0.938922f, 0.693858f, -0.345479f, -0.938427f, + 0.095949f, 0.823715f, 0.567004f, 0.226322f, 0.148226f, 0.988953f, + 0.902846f, 0.819397f, -0.573226f, 0.817884f, 0.413710f, -0.910409f, + 0.373053f, -0.698402f, 0.715706f, 0.764904f, 0.093509f, -0.995618f, + 0.122316f, 0.718929f, 0.695084f, 0.992203f, 0.998800f, -0.048973f, + 0.707774f, -0.262209f, -0.965011f, 0.033204f, 0.978317f, 0.207114f, + 0.848157f, 0.578380f, -0.815767f, 0.482673f, -0.994080f, 0.108651f, + 0.181888f, 0.415019f, 0.909813f, 0.889174f, 0.767194f, -0.641416f, + 0.799084f, 0.303541f, -0.952818f, 0.929458f, 0.903371f, -0.428861f, + 0.356207f, -0.618880f, 0.785486f, 0.056886f, 0.936802f, 0.349861f, + 0.835462f, 0.511538f, -0.859261f, 0.096193f, 0.822845f, 0.568267f, + 0.471443f, -0.983945f, 0.178469f, 0.639414f, -0.640256f, -0.768161f, + 0.127199f, 0.697269f, 0.716810f, 0.520027f, -0.992093f, -0.125504f, + 0.870863f, 0.688489f, -0.725246f, 0.150637f, 0.584542f, 0.811363f, + 0.487068f, -0.996701f, 0.081165f, 0.729747f, -0.126907f, -0.991915f, + 0.256107f, -0.038365f, 0.999264f, 0.548592f, -0.953752f, -0.300593f, + 0.030518f, 0.981672f, 0.190578f, 0.314946f, -0.396838f, 0.917889f, + 0.707042f, -0.266647f, -0.963794f, 0.814954f, 0.396882f, -0.917870f, + 0.178225f, 0.435842f, 0.900023f, 0.731701f, -0.114725f, -0.993397f, + 0.825452f, 0.456519f, -0.889713f, 0.960708f, 0.969680f, -0.244379f, + 0.370367f, -0.686226f, 0.727388f, 0.543709f, -0.962524f, -0.271195f, + 0.747326f, -0.016801f, -0.999859f, 0.978042f, 0.990498f, -0.137527f, + 0.208499f, 0.257812f, 0.966195f, 0.536629f, -0.973633f, -0.228122f, + 0.294682f, -0.277073f, 0.960849f, 0.878187f, 0.721125f, -0.692805f, + 0.222171f, 0.173963f, 0.984752f, 0.544930f, -0.960416f, -0.278570f, + 0.313970f, -0.391198f, 0.920307f, 0.122560f, 0.717862f, 0.696186f, + 0.902113f, 0.816750f, -0.576991f, 0.487312f, -0.996824f, 0.079636f, + 0.064454f, 0.919111f, 0.393998f, 0.977066f, 0.989635f, -0.143602f, + 0.782971f, 0.205684f, -0.978618f, 0.522225f, -0.990266f, -0.139189f, + 0.932631f, 0.911743f, -0.410762f, 0.644297f, -0.616392f, -0.787440f, + 0.868666f, 0.678411f, -0.734682f, 0.788098f, 0.237097f, -0.971486f, + 0.447028f, -0.945121f, 0.326720f, 0.984634f, 0.995343f, -0.096396f, + 0.031739f, 0.980182f, 0.198101f, 0.843519f, 0.554361f, -0.832276f, + 0.608164f, -0.777817f, -0.628491f, 0.412848f, -0.853781f, 0.520632f, + 0.326177f, -0.460566f, 0.887625f, 0.498054f, -0.999925f, 0.012224f, + 0.187259f, 0.384084f, 0.923298f, 0.887709f, 0.761258f, -0.648450f, + 0.290532f, -0.251925f, 0.967747f, 0.461189f, -0.970414f, 0.241449f, + 0.218753f, 0.195070f, 0.980789f, 0.796155f, 0.285951f, -0.958244f, + 0.362066f, -0.647372f, 0.762174f, 0.964126f, 0.974704f, -0.223499f, + 0.725841f, -0.151212f, -0.988501f, 0.018799f, 0.993032f, 0.117844f, + 0.525887f, -0.986801f, -0.161936f, 0.212650f, 0.232530f, 0.972589f, + 0.143313f, 0.621249f, 0.783613f, 0.499519f, -0.999995f, 0.003020f, + 0.728771f, -0.132991f, -0.991117f, 0.221927f, 0.175473f, 0.984484f, + 0.554940f, -0.941008f, -0.338384f, 0.988052f, 0.997184f, -0.075000f, + 0.790051f, 0.249001f, -0.968503f, 0.066163f, 0.914828f, 0.403844f, + 0.696056f, -0.332490f, -0.943107f, 0.963394f, 0.973665f, -0.227982f, + 0.009033f, 0.998390f, 0.056728f, 0.332769f, -0.496925f, 0.867794f, + 0.900404f, 0.810508f, -0.585728f, 0.607187f, -0.781659f, -0.623707f, + 0.411627f, -0.849763f, 0.527166f, 0.984146f, 0.995043f, -0.099450f, + 0.230961f, 0.119343f, 0.992853f, 0.378668f, -0.723214f, 0.690624f, + 0.946548f, 0.944130f, -0.329573f, 0.299077f, -0.303495f, 0.952833f, + 0.506600f, -0.999140f, -0.041454f, 0.113283f, 0.757202f, 0.653181f, + 0.877699f, 0.718996f, -0.695015f, 0.638437f, -0.644958f, -0.764218f, + 0.310552f, -0.371345f, 0.928495f, 0.085206f, 0.860081f, 0.510157f, + 0.692149f, -0.355536f, -0.934663f, 0.916030f, 0.864017f, -0.503463f, + 0.135744f, 0.657797f, 0.753195f, 0.483650f, -0.994728f, 0.102550f, + 0.961196f, 0.970425f, -0.241402f, 0.639658f, -0.639077f, -0.769143f, + 0.841566f, 0.544106f, -0.839016f, 0.401617f, -0.814949f, 0.579533f, + 0.775402f, 0.158932f, -0.987290f, 0.346197f, -0.568286f, 0.822831f, + 0.578622f, -0.880445f, -0.474149f, 0.650889f, -0.583258f, -0.812287f, + 0.153079f, 0.572028f, 0.820234f, 0.076905f, 0.885507f, 0.464625f, + 0.604990f, -0.790195f, -0.612856f, 0.118654f, 0.734731f, 0.678358f, + 0.201907f, 0.297597f, 0.954692f, 0.059083f, 0.931882f, 0.362761f, + 0.673594f, -0.461843f, -0.886962f, 0.254643f, -0.029166f, 0.999575f, + 0.518318f, -0.993384f, -0.114844f, 0.193851f, 0.345524f, 0.938410f, + 0.736584f, -0.084199f, -0.996449f, 0.963882f, 0.974360f, -0.224994f, + 0.010986f, 0.997618f, 0.068975f, 0.673350f, -0.463203f, -0.886252f, + 0.088136f, 0.850545f, 0.525902f, 0.716808f, -0.207044f, -0.978332f, + 0.520516f, -0.991703f, -0.128548f, 0.913832f, 0.856984f, -0.515343f, + 0.655772f, -0.558066f, -0.829796f, 0.097902f, 0.816695f, 0.577069f, + 0.431891f, -0.909823f, 0.414997f, 0.238041f, 0.075072f, 0.997178f, + 0.585458f, -0.859273f, -0.511517f, 0.318608f, -0.417851f, 0.908515f, + 0.642832f, -0.623613f, -0.781733f, 0.268315f, -0.114820f, 0.993386f, + 0.781018f, 0.193659f, -0.981069f, 0.582284f, -0.869302f, -0.494281f, + 0.944594f, 0.940015f, -0.341134f, 0.004883f, 0.999529f, 0.030675f, + 0.276371f, -0.164939f, 0.986304f, 0.373541f, -0.700594f, 0.713560f, + 0.189212f, 0.372724f, 0.927942f, 0.422126f, -0.882662f, 0.470008f, + 0.263188f, -0.082765f, 0.996569f, 0.561776f, -0.925610f, -0.378478f, + 0.211673f, 0.238494f, 0.971144f, 0.832532f, 0.495635f, -0.868531f, + 0.086915f, 0.854554f, 0.519363f, 0.145754f, 0.609156f, 0.793050f, + 0.668956f, -0.487494f, -0.873126f, 0.793469f, 0.269742f, -0.962933f, + 0.061769f, 0.925629f, 0.378433f, 0.540291f, -0.968126f, -0.250463f, + 0.425544f, -0.892552f, 0.450945f, 0.001221f, 0.999971f, 0.007670f, + 0.345464f, -0.564494f, 0.825437f, 0.682628f, -0.410784f, -0.911733f, + 0.186038f, 0.391154f, 0.920325f, 0.792737f, 0.265307f, -0.964164f, + 0.462898f, -0.972950f, 0.231015f, 0.156985f, 0.551725f, 0.834026f, + 0.837171f, 0.520735f, -0.853719f, 0.399664f, -0.807775f, 0.589490f, + 0.608652f, -0.775885f, -0.630875f, 0.077394f, 0.884078f, 0.467340f, + 0.367926f, -0.674988f, 0.737829f, 0.043946f, 0.962120f, 0.272625f, + 0.455085f, -0.960443f, 0.278478f, 0.986099f, 0.996188f, -0.087231f, + 0.232425f, 0.110200f, 0.993909f, 0.704845f, -0.279928f, -0.960021f, + 0.194583f, 0.341202f, 0.939990f, 0.433112f, -0.912979f, 0.408006f, + 0.856458f, 0.620122f, -0.784506f, 0.256840f, -0.042963f, 0.999077f, + 0.355230f, -0.614048f, 0.789268f, 0.966567f, 0.978018f, -0.208521f, + 0.502693f, -0.999857f, -0.016921f, 0.397711f, -0.800481f, 0.599359f, + 0.592050f, -0.837356f, -0.546658f, 0.813001f, 0.385588f, -0.922671f, + 0.885756f, 0.753243f, -0.657743f, 0.375006f, -0.707132f, 0.707081f, + 0.137697f, 0.648504f, 0.761211f, 0.456306f, -0.962550f, 0.271103f, + 0.275639f, -0.160399f, 0.987052f, 0.856703f, 0.621324f, -0.783553f, + 0.613535f, -0.756168f, -0.654378f, 0.398932f, -0.805054f, 0.593202f, + 0.042481f, 0.964589f, 0.263759f, 0.338384f, -0.527227f, 0.849725f, + 0.159915f, 0.536280f, 0.844040f, 0.541268f, -0.966571f, -0.256399f, + 0.934340f, 0.916101f, -0.400948f, 0.674083f, -0.459119f, -0.888375f, + 0.064210f, 0.919715f, 0.392587f, 0.827405f, 0.467403f, -0.884044f, + 0.414313f, -0.858537f, 0.512752f, 0.997818f, 0.999906f, -0.013710f, + 0.687999f, -0.379786f, -0.925074f, 0.393561f, -0.784580f, 0.620028f, + 0.320073f, -0.426196f, 0.904631f, 0.807630f, 0.354236f, -0.935156f, + 0.663828f, -0.515363f, -0.856972f, 0.857923f, 0.627316f, -0.778765f, + 0.600107f, -0.808622f, -0.588328f, 0.736339f, -0.085727f, -0.996319f, + 0.916762f, 0.866325f, -0.499481f, 0.458259f, -0.965805f, 0.259270f, + 0.630137f, -0.683921f, -0.729556f, 0.379644f, -0.727438f, 0.686174f, + 0.761242f, 0.070577f, -0.997506f, 0.504646f, -0.999574f, -0.029190f, + 0.884291f, 0.747157f, -0.664648f, 0.273930f, -0.149791f, 0.988718f, + 0.587900f, -0.851326f, -0.524638f, 0.872816f, 0.697337f, -0.716743f, + 0.157961f, 0.546597f, 0.837395f, 0.771008f, 0.131613f, -0.991301f, + 0.924575f, 0.889790f, -0.456370f, 0.594003f, -0.830585f, -0.556892f, + 0.272221f, -0.139165f, 0.990269f, 0.049073f, 0.952840f, 0.303472f, + 0.942397f, 0.935216f, -0.354079f, 0.584970f, -0.860838f, -0.508878f, + 0.344488f, -0.559418f, 0.828886f, 0.249760f, 0.001510f, 0.999999f, + 0.768566f, 0.116392f, -0.993203f, 0.716320f, -0.210045f, -0.977692f, + 0.815198f, 0.398289f, -0.917260f, 0.275395f, -0.158884f, 0.987297f, + 0.170413f, 0.479479f, 0.877553f, 0.557382f, -0.935707f, -0.352779f, + 0.093263f, 0.833165f, 0.553024f, 0.883314f, 0.743065f, -0.669220f, + 0.032227f, 0.979569f, 0.201108f, 0.941665f, 0.933576f, -0.358379f, + 0.721202f, -0.179955f, -0.983675f, 0.467536f, -0.979269f, 0.202563f, + 0.811048f, 0.374236f, -0.927333f, 0.297124f, -0.291780f, 0.956486f, + 0.743420f, -0.041334f, -0.999145f, 0.906020f, 0.830665f, -0.556773f, + 0.158938f, 0.541449f, 0.840734f, 0.333501f, -0.500913f, 0.865498f, + 0.077638f, 0.883360f, 0.468695f, 0.648447f, -0.595649f, -0.803245f, + 0.570565f, -0.903309f, -0.428991f, 0.918227f, 0.870885f, -0.491486f, + 0.784680f, 0.216180f, -0.976353f, 0.533211f, -0.978307f, -0.207161f, + 0.240238f, 0.061298f, 0.998120f, 0.977554f, 0.990071f, -0.140565f, + 0.828138f, 0.471467f, -0.881884f, 0.747082f, -0.018335f, -0.999832f, + 0.606455f, -0.784521f, -0.620103f, 0.865980f, 0.665918f, -0.746025f, + 0.286870f, -0.229592f, 0.973287f, 0.769543f, 0.122484f, -0.992471f, + 0.148684f, 0.594455f, 0.804129f, 0.895766f, 0.793094f, -0.609099f, + 0.474128f, -0.986817f, 0.161842f, 0.111330f, 0.765160f, 0.643840f, + 0.045167f, 0.960001f, 0.279997f, 0.183841f, 0.403822f, 0.914837f, + 0.904799f, 0.826370f, -0.563128f, 0.434577f, -0.916696f, 0.399586f, + 0.150149f, 0.587029f, 0.809566f, 0.498787f, -0.999971f, 0.007622f, + 0.035401f, 0.975364f, 0.220601f, 0.342290f, -0.547922f, 0.836530f, + 0.108888f, 0.774947f, 0.632027f, 0.806165f, 0.345614f, -0.938377f, + 0.299809f, -0.307877f, 0.951426f, 0.978286f, 0.990708f, -0.136008f, + 0.701915f, -0.297551f, -0.954706f, 0.193606f, 0.346963f, 0.937879f, + 0.349371f, -0.584581f, 0.811335f, 0.464607f, -0.975375f, 0.220554f, + 0.099611f, 0.810452f, 0.585806f, 0.696544f, -0.329595f, -0.944122f, + 0.490486f, -0.998214f, 0.059743f, 0.631846f, -0.676048f, -0.736858f, + 0.085695f, 0.858512f, 0.512793f, 0.448981f, -0.949059f, 0.315097f, + 0.898207f, 0.802344f, -0.596862f, 0.523934f, -0.988714f, -0.149814f, + 0.724865f, -0.157275f, -0.987555f, 0.423346f, -0.886241f, 0.463224f, + 0.020996f, 0.991311f, 0.131542f, 0.994644f, 0.999434f, -0.033646f, + 0.516121f, -0.994874f, -0.101119f, 0.195071f, 0.338316f, 0.941033f, + 0.573983f, -0.893888f, -0.448290f, 0.933852f, 0.914866f, -0.403757f, + 0.660655f, -0.532350f, -0.846525f, 0.748058f, -0.012200f, -0.999926f, + 0.502449f, -0.999882f, -0.015387f, 0.616709f, -0.742968f, -0.669327f, + 0.316899f, -0.408072f, 0.912950f, 0.388922f, -0.766178f, 0.642628f, + 0.542000f, -0.965381f, -0.260844f, 0.051514f, 0.948073f, 0.318053f, + 0.680674f, -0.421941f, -0.906623f, 0.574716f, -0.891816f, -0.452399f, + 0.010742f, 0.997723f, 0.067445f, 0.235355f, 0.091886f, 0.995769f, + 0.706065f, -0.272556f, -0.962140f, 0.950942f, 0.952869f, -0.303381f, + 0.485603f, -0.995911f, 0.090335f, 0.770275f, 0.127050f, -0.991896f, + 0.217533f, 0.202587f, 0.979264f, 0.695811f, -0.333937f, -0.942595f, + 0.062257f, 0.924463f, 0.381271f, 0.364019f, -0.656677f, 0.754172f, + 0.170657f, 0.478133f, 0.878288f, 0.444587f, -0.939998f, 0.341179f, + 0.112306f, 0.761195f, 0.648523f, 0.264897f, -0.093462f, 0.995623f, + 0.476570f, -0.989183f, 0.146685f, 0.001465f, 0.999958f, 0.009204f, + 0.402838f, -0.819370f, 0.573266f, 0.512947f, -0.996693f, -0.081260f, + 0.350347f, -0.589548f, 0.807733f, 0.207279f, 0.265215f, 0.964189f, + 0.560311f, -0.929055f, -0.369942f, 0.745129f, -0.030603f, -0.999532f, + 0.867201f, 0.671621f, -0.740895f, 0.537362f, -0.972572f, -0.232600f, + 0.625010f, -0.707064f, -0.707149f, 0.104005f, 0.793969f, 0.607958f, + 0.712657f, -0.232484f, -0.972600f, 0.959731f, 0.968162f, -0.250324f, + 0.242435f, 0.047512f, 0.998871f, 0.886732f, 0.757264f, -0.653108f, + 0.677745f, -0.438558f, -0.898703f, 0.162600f, 0.521962f, 0.852969f, + 0.050782f, 0.949527f, 0.313686f, 0.534676f, -0.976359f, -0.216157f, + 0.423590f, -0.886951f, 0.461864f, 0.020508f, 0.991710f, 0.128500f, + 0.942153f, 0.934671f, -0.355513f, 0.646494f, -0.605462f, -0.795874f, + 0.217777f, 0.201084f, 0.979574f, 0.845228f, 0.563266f, -0.826275f, + 0.365972f, -0.665882f, 0.746057f, 0.260014f, -0.062877f, 0.998021f, + 0.203861f, 0.285859f, 0.958272f, 0.742199f, -0.048997f, -0.998799f, + 0.386725f, -0.757233f, 0.653145f, 0.125978f, 0.702746f, 0.711441f, + 0.223636f, 0.164892f, 0.986312f, 0.812512f, 0.382755f, -0.923850f, + 0.658946f, -0.541409f, -0.840760f, 0.866712f, 0.669344f, -0.742952f, + 0.114748f, 0.751158f, 0.660123f, 0.323491f, -0.445524f, 0.895270f, + 0.412604f, -0.852981f, 0.521942f, 0.858167f, 0.628510f, -0.777802f, + 0.024170f, 0.988490f, 0.151283f, 0.356451f, -0.620084f, 0.784535f, + 0.250004f, -0.000024f, 1.000000f, 0.828626f, 0.474170f, -0.880433f, + 0.126711f, 0.699465f, 0.714667f, 0.778576f, 0.178587f, -0.983924f, + 0.216312f, 0.210092f, 0.977682f, 0.898451f, 0.803259f, -0.595630f, + 0.173342f, 0.463245f, 0.886230f, 0.418219f, -0.870862f, 0.491528f, + 0.851575f, 0.595765f, -0.803159f, 0.460700f, -0.969668f, 0.244425f, + 0.092531f, 0.835701f, 0.549184f, 0.548348f, -0.954212f, -0.299130f, + 0.282963f, -0.205637f, 0.978628f, 0.021729f, 0.990695f, 0.136103f, + 0.426764f, -0.895984f, 0.444085f, 0.323003f, -0.442775f, 0.896633f, + 0.124758f, 0.708182f, 0.706030f, 0.946792f, 0.944635f, -0.328124f, + 0.805188f, 0.339849f, -0.940480f, 0.653819f, -0.568207f, -0.822885f, + 0.576913f, -0.885485f, -0.464668f, 0.922621f, 0.884123f, -0.467255f, + 0.187747f, 0.381249f, 0.924472f, 0.709972f, -0.248862f, -0.968539f, + 0.968521f, 0.980503f, -0.196504f, 0.078859f, 0.879739f, 0.475457f, + 0.621103f, -0.724206f, -0.689584f, 0.701183f, -0.301942f, -0.953326f, + 0.955581f, 0.961306f, -0.275484f, 0.291752f, -0.259340f, 0.965786f, + 0.370123f, -0.685110f, 0.728440f, 0.243656f, 0.039850f, 0.999206f, + 0.468025f, -0.979886f, 0.199558f, 0.767346f, 0.108771f, -0.994067f, + 0.302983f, -0.326788f, 0.945098f, 0.546151f, -0.958251f, -0.285928f, + 0.387701f, -0.761226f, 0.648486f, 0.774182f, 0.151354f, -0.988480f, + 0.583749f, -0.864716f, -0.502261f, 0.483894f, -0.994884f, 0.101024f, + 0.927260f, 0.897364f, -0.441291f, 0.245853f, 0.026051f, 0.999661f, + 0.841077f, 0.541530f, -0.840682f, 0.573495f, -0.895259f, -0.445545f, + 0.132326f, 0.673820f, 0.738896f, 0.746593f, -0.021403f, -0.999771f, + 0.312505f, -0.382711f, 0.923868f, 0.980728f, 0.992678f, -0.120795f, + 0.787610f, 0.234115f, -0.972209f, 0.570809f, -0.902650f, -0.430376f, + 0.957778f, 0.965017f, -0.262186f, 0.829358f, 0.478217f, -0.878242f, + 0.326421f, -0.461928f, 0.886918f, 0.643565f, -0.620009f, -0.784595f, + 0.560555f, -0.928486f, -0.371367f, 0.298589f, -0.300571f, 0.953760f, + 0.166995f, 0.498214f, 0.867054f, 0.467048f, -0.978643f, 0.205567f, + 0.616220f, -0.745018f, -0.667044f, 0.061524f, 0.926208f, 0.377013f, + 0.699718f, -0.310703f, -0.950507f, 0.486580f, -0.996447f, 0.084222f, + 0.133303f, 0.669273f, 0.743017f, 0.915785f, 0.863244f, -0.504787f, + 0.435309f, -0.918525f, 0.395363f, 0.686290f, -0.389698f, -0.920943f, + 0.973159f, 0.985813f, -0.167846f, 0.480476f, -0.992485f, 0.122365f, + 0.284428f, -0.214635f, 0.976694f, 0.628916f, -0.689497f, -0.724289f, + 0.100587f, 0.806842f, 0.590767f, 0.987076f, 0.996705f, -0.081117f, + 0.319341f, -0.422028f, 0.906583f, 0.763684f, 0.085870f, -0.996306f, + 0.612802f, -0.759171f, -0.650891f, 0.389410f, -0.768146f, 0.640275f, + 0.804211f, 0.334072f, -0.942547f, 0.998550f, 0.999959f, -0.009108f, + 0.859876f, 0.636825f, -0.771008f, 0.617929f, -0.737813f, -0.675005f, + 0.492683f, -0.998943f, 0.045956f, 0.559823f, -0.930185f, -0.367090f, + 0.708507f, -0.257765f, -0.966208f, 0.023438f, 0.989176f, 0.146733f, + 0.318120f, -0.415062f, 0.909793f, 0.772473f, 0.140732f, -0.990048f, + 0.371099f, -0.689566f, 0.724223f, 0.641855f, -0.628398f, -0.777892f, + 0.838880f, 0.529872f, -0.848078f, 0.252445f, -0.015363f, 0.999882f, + 0.802502f, 0.323932f, -0.946080f, 0.437995f, -0.925065f, 0.379808f, + 0.016358f, 0.994723f, 0.102597f, 0.158450f, 0.544026f, 0.839069f, + 0.661143f, -0.529750f, -0.848154f, 0.815930f, 0.402506f, -0.915417f, + 0.982437f, 0.993917f, -0.110129f, 0.022705f, 0.989841f, 0.142179f, + 0.212406f, 0.234022f, 0.972231f, 0.840833f, 0.540239f, -0.841511f, + 0.054444f, 0.942058f, 0.335450f, 0.430182f, -0.905314f, 0.424742f, + 0.200687f, 0.304911f, 0.952381f, 0.328130f, -0.471424f, 0.881906f, + 0.740002f, -0.062781f, -0.998027f, 0.098634f, 0.814031f, 0.580822f, + 0.623301f, -0.714617f, -0.699516f, 0.291508f, -0.257858f, 0.966183f, + 0.895033f, 0.790283f, -0.612742f, 0.398688f, -0.804143f, 0.594436f, + 0.538338f, -0.971127f, -0.238564f, 0.028809f, 0.983662f, 0.180026f, + 0.139651f, 0.639114f, 0.769112f, 0.674327f, -0.457756f, -0.889078f, + 0.069825f, 0.905294f, 0.424786f, 0.497078f, -0.999831f, 0.018359f, + 0.016846f, 0.994404f, 0.105649f, 0.875013f, 0.707166f, -0.707047f, + 0.969986f, 0.982270f, -0.187471f, 0.082277f, 0.869326f, 0.494239f, + 0.750256f, 0.001606f, -0.999999f, 0.906996f, 0.834065f, -0.551665f, + 0.261967f, -0.075119f, 0.997175f, 0.955825f, 0.961727f, -0.274009f, + 0.802014f, 0.321028f, -0.947070f, 0.223392f, 0.166405f, 0.986058f, + 0.303716f, -0.331134f, 0.943584f, 0.770764f, 0.130092f, -0.991502f, + 0.592294f, -0.836517f, -0.547942f, 0.184329f, 0.401014f, 0.916072f, + 0.000488f, 0.999995f, 0.003068f, 0.562264f, -0.924445f, -0.381316f, + 0.731212f, -0.117772f, -0.993041f, 0.832776f, 0.496966f, -0.867770f, + 0.372320f, -0.695101f, 0.718912f, 0.519295f, -0.992660f, -0.120938f, + 0.660410f, -0.533647f, -0.845707f, 0.188968f, 0.374147f, 0.927369f, + 0.921157f, 0.879785f, -0.475373f, 0.120607f, 0.726351f, 0.687324f, + 0.669688f, -0.483471f, -0.875360f, 0.174319f, 0.457798f, 0.889056f, + 0.254154f, -0.026099f, 0.999659f, 0.725597f, -0.152728f, -0.988268f, + 0.900649f, 0.811405f, -0.584484f, 0.206058f, 0.272602f, 0.962127f, + 0.280278f, -0.189095f, 0.981959f, 0.405524f, -0.828926f, 0.559358f, + 0.869642f, 0.682906f, -0.730506f, 0.521736f, -0.990688f, -0.136150f, + 0.229984f, 0.125433f, 0.992102f, 0.095460f, 0.825451f, 0.564474f, + 0.550790f, -0.949512f, -0.313732f, 0.139162f, 0.641471f, 0.767147f, + 0.322515f, -0.440022f, 0.897987f, 0.928969f, 0.902051f, -0.431630f, + 0.599374f, -0.811321f, -0.584601f, 0.849134f, 0.583375f, -0.812203f, + 0.506844f, -0.999076f, -0.042987f, 0.094728f, 0.828040f, 0.560669f, + 0.333013f, -0.498255f, 0.867030f, 0.595712f, -0.824557f, -0.565779f, + 0.691417f, -0.359833f, -0.933017f, 0.925795f, 0.893264f, -0.449532f, + 0.631113f, -0.679432f, -0.733739f, 0.127443f, 0.696168f, 0.717879f, + 0.995865f, 0.999662f, -0.025979f, 0.653086f, -0.571988f, -0.820262f, + 0.870375f, 0.686261f, -0.727355f, 0.375250f, -0.708216f, 0.705996f, + 0.790295f, 0.250486f, -0.968120f, 0.496345f, -0.999736f, 0.022960f, + 0.706798f, -0.268126f, -0.963384f, 0.058839f, 0.932438f, 0.361331f, + 0.819104f, 0.420680f, -0.907209f, 0.453620f, -0.957839f, 0.287306f, + 0.902602f, 0.818517f, -0.574483f, 0.406500f, -0.832342f, 0.554262f, + 0.288334f, -0.238540f, 0.971133f, 0.702892f, -0.291688f, -0.956514f, + 0.178470f, 0.434461f, 0.900691f, 0.776379f, 0.164987f, -0.986296f, + 0.402106f, -0.816723f, 0.577030f, 0.508553f, -0.998556f, -0.053712f, + 0.354009f, -0.607977f, 0.793955f, 0.679698f, -0.427496f, -0.904017f, + 0.438483f, -0.926226f, 0.376968f, 0.553475f, -0.944083f, -0.329709f, + 0.369390f, -0.681750f, 0.731585f, 0.634775f, -0.662370f, -0.749177f, + 0.989029f, 0.997625f, -0.068880f, 0.530770f, -0.981369f, -0.192130f, + 0.083497f, 0.865510f, 0.500892f, 0.400153f, -0.809580f, 0.587009f, + 0.904067f, 0.823770f, -0.566925f, 0.346929f, -0.572067f, 0.820207f, + 0.062745f, 0.923289f, 0.384106f, 0.944839f, 0.940537f, -0.339692f, + 0.142580f, 0.624849f, 0.780746f, 0.789319f, 0.244541f, -0.969639f, + 0.255863f, -0.036832f, 0.999321f, 0.047364f, 0.956044f, 0.293224f, + 0.875990f, 0.711491f, -0.702695f, 0.350835f, -0.592024f, 0.805920f, + 0.449958f, -0.950975f, 0.309268f, 0.527596f, -0.985006f, -0.172523f, + 0.074952f, 0.891143f, 0.453724f, 0.385016f, -0.750176f, 0.661238f, + 0.036133f, 0.974339f, 0.225087f, 0.837903f, 0.524658f, -0.851313f, + 0.460945f, -0.970042f, 0.242937f, 0.953628f, 0.957853f, -0.287260f, + 0.151858f, 0.578302f, 0.815823f, 0.060060f, 0.929639f, 0.368472f, + 0.993912f, 0.999268f, -0.038245f, 0.448005f, -0.947108f, 0.320915f, + 0.897230f, 0.798667f, -0.601774f, 0.735363f, -0.091839f, -0.995774f, + 0.491707f, -0.998643f, 0.052085f, 0.070558f, 0.903329f, 0.428947f, + 0.386481f, -0.756230f, 0.654306f, 0.221195f, 0.180002f, 0.983666f, + 0.720226f, -0.185987f, -0.982552f, 0.411872f, -0.850570f, 0.525861f, + 0.912856f, 0.853806f, -0.520592f, 0.145022f, 0.612799f, 0.790239f, + 0.446540f, -0.944114f, 0.329618f, 0.359136f, -0.633233f, 0.773961f, + 0.501717f, -0.999942f, -0.010786f, 0.796399f, 0.287421f, -0.957804f, + 0.281010f, -0.193612f, 0.981078f, 0.542733f, -0.964170f, -0.265284f, + 0.009277f, 0.998301f, 0.058259f, 0.444343f, -0.939474f, 0.342621f, + 0.147463f, 0.600605f, 0.799546f, 0.204593f, 0.281446f, 0.959577f, + 0.970474f, 0.982841f, -0.184456f, 0.262943f, -0.081237f, 0.996695f, + 0.598398f, -0.814893f, -0.579611f, 0.191409f, 0.359878f, 0.932999f, + 0.733898f, -0.101000f, -0.994886f, 0.526619f, -0.986046f, -0.166476f, + 0.617441f, -0.739880f, -0.672739f, 0.931899f, 0.909843f, -0.414953f, + 0.445808f, -0.942587f, 0.333959f, 0.246830f, 0.019917f, 0.999802f, + 0.602792f, -0.798580f, -0.601888f, 0.049805f, 0.951434f, 0.307854f, + 0.834485f, 0.506256f, -0.862383f, 0.209964f, 0.248908f, 0.968527f, + 0.141848f, 0.628435f, 0.777862f, 0.012940f, 0.996697f, 0.081213f, + 0.745373f, -0.029070f, -0.999577f, 0.171878f, 0.471382f, 0.881929f, + 0.048341f, 0.954227f, 0.299084f, 0.714122f, -0.223522f, -0.974699f, + 0.867445f, 0.672756f, -0.739864f, 0.266117f, -0.101095f, 0.994877f, + 0.801282f, 0.316666f, -0.948537f, 0.671885f, -0.471340f, -0.881952f, + 0.450446f, -0.951919f, 0.306349f, 0.228763f, 0.133039f, 0.991111f, + 0.601328f, -0.804086f, -0.594513f, 0.427253f, -0.897343f, 0.441335f, + 0.721447f, -0.178446f, -0.983950f, 0.488289f, -0.997294f, 0.073518f, + 0.571542f, -0.900660f, -0.434525f, 0.224125f, 0.161865f, 0.986813f, + 0.747814f, -0.013734f, -0.999906f, 0.935317f, 0.918544f, -0.395319f, + 0.595224f, -0.826289f, -0.563246f, 0.792493f, 0.263828f, -0.964570f, + 0.328374f, -0.472777f, 0.881182f, 0.642588f, -0.624811f, -0.780776f, + 0.100832f, 0.805935f, 0.592004f, 0.750744f, 0.004674f, -0.999989f, + 0.683360f, -0.406583f, -0.913614f, 0.611582f, -0.764141f, -0.645049f, + 0.795666f, 0.283010f, -0.959117f, 0.392828f, -0.781718f, 0.623632f, + 0.281498f, -0.196621f, 0.980480f, 0.665293f, -0.507454f, -0.861679f, + 0.175296f, 0.452335f, 0.891848f, 0.773205f, 0.145286f, -0.989390f, + 0.546639f, -0.957369f, -0.288867f, 0.893568f, 0.784610f, -0.619990f, + 0.045655f, 0.959137f, 0.282941f, 0.787121f, 0.231132f, -0.972923f, + 0.567147f, -0.912313f, -0.409494f, 0.265629f, -0.098042f, 0.995182f, + 0.752453f, 0.015411f, -0.999881f, 0.065675f, 0.916062f, 0.401036f, + 0.188479f, 0.376991f, 0.926217f, 0.893324f, 0.783658f, -0.621193f, + 0.080323f, 0.875326f, 0.483534f, 0.713634f, -0.226512f, -0.974008f, + 0.227787f, 0.139118f, 0.990276f, 0.943374f, 0.937371f, -0.348334f, + 0.686778f, -0.386870f, -0.922134f, 0.352789f, -0.601869f, 0.798595f, + 0.082521f, 0.868567f, 0.495572f, 0.648692f, -0.594416f, -0.804157f, + 0.866224f, 0.667062f, -0.745002f, 0.336675f, -0.518072f, 0.855337f, + 0.995377f, 0.999578f, -0.029046f, 0.228031f, 0.137598f, 0.990488f, + 0.096925f, 0.820221f, 0.572047f, 0.843763f, 0.555637f, -0.831425f, + 0.342046f, -0.546638f, 0.837369f, 0.130861f, 0.680592f, 0.732663f, + 0.896498f, 0.795889f, -0.605443f, 0.717540f, -0.202540f, -0.979274f, + 0.289311f, -0.244495f, 0.969651f, 0.579110f, -0.878986f, -0.476848f, + 0.937514f, 0.923914f, -0.382600f, 0.850599f, 0.590825f, -0.806799f, + 0.501961f, -0.999924f, -0.012320f, 0.894057f, 0.786508f, -0.617580f, + 0.444831f, -0.940521f, 0.339737f, 0.340826f, -0.540199f, 0.841537f, + 0.209232f, 0.253363f, 0.967371f, 0.497810f, -0.999905f, 0.013758f, + 0.607919f, -0.778780f, -0.627297f, 0.154788f, 0.563187f, 0.826329f, + 0.309331f, -0.364212f, 0.931316f, 0.537606f, -0.972214f, -0.234092f, + 0.873060f, 0.698436f, -0.715672f, 0.088624f, 0.848928f, 0.528509f, + 0.292973f, -0.266740f, 0.963769f, 0.807874f, 0.355670f, -0.934612f, + 0.954360f, 0.959165f, -0.282849f, 0.005859f, 0.999322f, 0.036808f, + 0.312749f, -0.384128f, 0.923280f, 0.846448f, 0.569587f, -0.821931f, + 0.154299f, 0.565720f, 0.824598f, 0.480232f, -0.992296f, 0.123887f, + 0.978531f, 0.990915f, -0.134488f, 0.186282f, 0.389742f, 0.920924f, + 0.548836f, -0.953290f, -0.302056f, 0.251469f, -0.009228f, 0.999957f, + 0.488045f, -0.997180f, 0.075048f, 0.336187f, -0.515445f, 0.856922f, + 0.180667f, 0.421985f, 0.906603f, 0.563729f, -0.920896f, -0.389808f, + 0.034668f, 0.976369f, 0.216110f, 0.844007f, 0.556912f, -0.830571f, + 0.347662f, -0.575835f, 0.817566f, 0.979751f, 0.991918f, -0.126884f, + 0.260990f, -0.068999f, 0.997617f, 0.639902f, -0.637897f, -0.770122f, + 0.306401f, -0.347008f, 0.937862f, 0.178714f, 0.433078f, 0.901356f, + 0.485359f, -0.995772f, 0.091863f, 0.860853f, 0.641544f, -0.767086f, + 0.974136f, 0.986825f, -0.161794f, 0.650645f, -0.584503f, -0.811391f, + 0.315923f, -0.402462f, 0.915437f, 0.581552f, -0.871568f, -0.490275f, + 0.400641f, -0.811377f, 0.584523f, 0.470710f, -0.983114f, 0.182996f, + 0.814466f, 0.394064f, -0.919083f, 0.595956f, -0.823688f, -0.567043f, + 0.522713f, -0.989834f, -0.142226f, 0.905531f, 0.828953f, -0.559319f, + 0.410651f, -0.846512f, 0.532370f, 0.767834f, 0.111820f, -0.993728f, + 0.486336f, -0.996317f, 0.085751f, 0.102541f, 0.799531f, 0.600624f, + 0.809583f, 0.365685f, -0.930739f, 0.378912f, -0.724272f, 0.689514f, + 0.029786f, 0.982539f, 0.186058f, 0.762219f, 0.076697f, -0.997054f, + 0.552499f, -0.946088f, -0.323909f, 0.664317f, -0.512732f, -0.858549f, + 0.473884f, -0.986567f, 0.163355f, 0.986831f, 0.996579f, -0.082646f, + 0.113039f, 0.758203f, 0.652019f, 0.789807f, 0.247515f, -0.968884f, + 0.411139f, -0.848141f, 0.529770f, 0.318853f, -0.419245f, 0.907873f, + 0.255619f, -0.035299f, 0.999377f, 0.596445f, -0.821945f, -0.569568f, + 0.115724f, 0.747093f, 0.664719f, 0.827161f, 0.466047f, -0.884760f, + 0.651865f, -0.578263f, -0.815851f, 0.962173f, 0.971888f, -0.235443f, + 0.105715f, 0.787395f, 0.616448f, 0.761486f, 0.072107f, -0.997397f, + 0.925307f, 0.891881f, -0.452270f, 0.694835f, -0.339714f, -0.940529f, + 0.026123f, 0.986560f, 0.163402f, 0.976333f, 0.988964f, -0.148155f, + 0.651133f, -0.582011f, -0.813181f, 0.395270f, -0.791193f, 0.611567f, + 0.139406f, 0.640293f, 0.768131f, 0.625498f, -0.704892f, -0.709315f, + 0.704601f, -0.281400f, -0.959591f, 0.090333f, 0.843204f, 0.537594f, + 0.273686f, -0.148274f, 0.988946f, 0.678233f, -0.435799f, -0.900044f, + 0.419928f, -0.876090f, 0.482149f, 0.770520f, 0.128571f, -0.991700f, + 0.368902f, -0.679502f, 0.733673f, 0.926040f, 0.893953f, -0.448161f, + 0.008789f, 0.998476f, 0.055196f, 0.851331f, 0.594532f, -0.804072f, + 0.725353f, -0.154244f, -0.988033f, 0.914321f, 0.858561f, -0.512711f, + 0.111086f, 0.766147f, 0.642665f, 0.606943f, -0.782614f, -0.622507f, + 0.460212f, -0.968914f, 0.247399f, 0.699962f, -0.309245f, -0.950982f, + 0.125002f, 0.707098f, 0.707115f, 0.441413f, -0.933008f, 0.359856f, + 0.939467f, 0.928540f, -0.371234f, 0.687510f, -0.382623f, -0.923905f, + 0.377691f, -0.718962f, 0.695049f, 0.002930f, 0.999831f, 0.018407f, + 0.230716f, 0.120866f, 0.992669f, 0.517342f, -0.994069f, -0.108747f, + 0.834241f, 0.504932f, -0.863159f, 0.743664f, -0.039802f, -0.999208f, + 0.956313f, 0.962563f, -0.271057f, 0.165286f, 0.507495f, 0.861655f, + 0.337163f, -0.520694f, 0.853743f, 0.117189f, 0.740944f, 0.671567f, + 0.285893f, -0.223616f, 0.974677f, 0.826917f, 0.464689f, -0.885474f, + 0.019043f, 0.992850f, 0.119367f, 0.558358f, -0.933525f, -0.358513f, + 0.150881f, 0.583297f, 0.812259f, 0.293462f, -0.269695f, 0.962946f, + 0.576425f, -0.886907f, -0.461949f, 0.712413f, -0.233976f, -0.972242f, + 0.494392f, -0.999379f, 0.035227f, 0.964370f, 0.975046f, -0.222003f, + 0.283452f, -0.208638f, 0.977993f, 0.201419f, 0.300525f, 0.953774f, + 0.003418f, 0.999769f, 0.021474f, 0.368658f, -0.678376f, 0.734715f, + 0.529793f, -0.982530f, -0.186105f, 0.633799f, -0.666955f, -0.745098f, + 0.075196f, 0.890445f, 0.455090f, 0.724132f, -0.161818f, -0.986821f, + 0.665049f, -0.508775f, -0.860899f, 0.380377f, -0.730588f, 0.682819f, + 0.934096f, 0.915485f, -0.402353f, 0.541024f, -0.966963f, -0.254916f, + 0.292241f, -0.262302f, 0.964986f, 0.415778f, -0.863220f, 0.504829f, + 0.017823f, 0.993737f, 0.111748f, 0.847669f, 0.575875f, -0.817538f, + 0.387945f, -0.762220f, 0.647318f, 0.199710f, 0.310749f, 0.950492f, + 0.467292f, -0.978957f, 0.204065f, 0.345220f, -0.563227f, 0.826302f, + 0.179446f, 0.428926f, 0.903340f, 0.546395f, -0.957811f, -0.287398f, + 0.861830f, 0.646239f, -0.763135f, 0.442878f, -0.936281f, 0.351253f, + 0.363287f, -0.653199f, 0.757186f, 0.514900f, -0.995621f, -0.093485f, + 0.913344f, 0.855399f, -0.517970f, 0.567636f, -0.911052f, -0.412291f, + 0.041505f, 0.966189f, 0.257835f, 0.126467f, 0.700560f, 0.713593f, + 0.878676f, 0.723247f, -0.690590f, 0.586435f, -0.856118f, -0.516780f, + 0.436042f, -0.920335f, 0.391132f, 0.292485f, -0.263782f, 0.964582f, + 0.653574f, -0.569469f, -0.822013f, 0.240482f, 0.059767f, 0.998212f, + 0.508309f, -0.998638f, -0.052180f, 0.943618f, 0.937904f, -0.346896f, + 0.211429f, 0.239983f, 0.970777f, 0.011963f, 0.997176f, 0.075095f, + 0.876967f, 0.715790f, -0.698316f, 0.521981f, -0.990478f, -0.137670f, + 0.076173f, 0.887636f, 0.460545f, 0.828870f, 0.475520f, -0.879705f, + 0.597421f, -0.818434f, -0.574600f, 0.115480f, 0.748112f, 0.663572f, + 0.714855f, -0.219034f, -0.975717f, 0.424811f, -0.890467f, 0.455047f, + 0.140627f, 0.634383f, 0.773019f, 0.031006f, 0.981083f, 0.193589f, + 0.256352f, -0.039897f, 0.999204f, 0.667002f, -0.498172f, -0.867078f, + 0.876722f, 0.714717f, -0.699413f, 0.056641f, 0.937337f, 0.348424f, + 0.723888f, -0.163331f, -0.986571f, 0.632090f, -0.674917f, -0.737894f, + 0.237308f, 0.079660f, 0.996822f, 0.947524f, 0.946135f, -0.323773f, + 0.444099f, -0.938947f, 0.344061f, 0.664805f, -0.510095f, -0.860118f, + 0.053223f, 0.944603f, 0.328215f, 0.906508f, 0.832369f, -0.554222f, + 0.168948f, 0.487536f, 0.873103f, 0.426520f, -0.895302f, 0.445459f, + 0.612070f, -0.762158f, -0.647391f, 0.876234f, 0.712568f, -0.701603f, + 0.698009f, -0.320892f, -0.947116f, 0.821302f, 0.433165f, -0.901315f, + 0.232670f, 0.108675f, 0.994077f, 0.449470f, -0.950022f, 0.312184f, + 0.181643f, 0.416414f, 0.909175f, 0.977310f, 0.989855f, -0.142084f, + 0.029541f, 0.982823f, 0.184551f, 0.221683f, 0.176983f, 0.984214f, + 0.778332f, 0.177078f, -0.984197f, 0.063478f, 0.921512f, 0.388351f, + 0.693614f, -0.346918f, -0.937895f, 0.183108f, 0.408028f, 0.912969f, + 0.575937f, -0.888320f, -0.459226f, 0.489021f, -0.997622f, 0.068928f, + 0.257816f, -0.049092f, 0.998794f, 0.627207f, -0.697234f, -0.716843f, + 0.820813f, 0.430398f, -0.902639f, 0.754162f, 0.026147f, -0.999658f, + 0.910170f, 0.844900f, -0.534924f, 0.098878f, 0.813139f, 0.582070f, + 0.244633f, 0.033718f, 0.999431f, 0.778088f, 0.175568f, -0.984467f, + 0.983658f, 0.994733f, -0.102502f, 0.195315f, 0.336872f, 0.941550f, + 0.740734f, -0.058187f, -0.998306f, 0.238529f, 0.072012f, 0.997404f, + 0.834730f, 0.507578f, -0.861606f, 0.308110f, -0.357059f, 0.934082f, + 0.702159f, -0.296087f, -0.955161f, 0.213870f, 0.225064f, 0.974344f, + 0.082765f, 0.867806f, 0.496904f, 0.959243f, 0.967390f, -0.253293f, + 0.136965f, 0.652001f, 0.758218f, 0.415290f, -0.861667f, 0.507475f, + 0.808606f, 0.359967f, -0.932965f, 0.309575f, -0.365641f, 0.930756f, + 0.755138f, 0.032280f, -0.999479f, 0.383551f, -0.744058f, 0.668115f, + 0.800549f, 0.312298f, -0.949984f, 0.623545f, -0.713543f, -0.700611f, + 0.218021f, 0.199581f, 0.979881f, 0.333989f, -0.503566f, 0.863957f, + 0.765148f, 0.095037f, -0.995474f, 0.950698f, 0.952403f, -0.304842f, + 0.295171f, -0.280020f, 0.959994f, 0.616464f, -0.743994f, -0.668186f, + 0.909194f, 0.841602f, -0.540098f, 0.360845f, -0.641508f, 0.767117f, + 0.545418f, -0.959557f, -0.281515f, 0.772229f, 0.139213f, -0.990263f, + 0.493172f, -0.999080f, 0.042891f, 0.972915f, 0.985555f, -0.169358f, + 0.435065f, -0.917917f, 0.396772f, 0.172854f, 0.465962f, 0.884805f, + 0.330083f, -0.482211f, 0.876055f, 0.744396f, -0.035203f, -0.999380f, + 0.881849f, 0.736874f, -0.676030f, 0.210697f, 0.244448f, 0.969662f, + 0.339849f, -0.535025f, 0.844836f, 0.635264f, -0.660069f, -0.751205f, + 0.252934f, -0.018431f, 0.999830f, 0.101808f, 0.802287f, 0.596939f, + 0.793713f, 0.271218f, -0.962518f, 0.394537f, -0.788370f, 0.615202f, + 0.151614f, 0.579553f, 0.814935f, 0.942641f, 0.935758f, -0.352644f, + 0.327642f, -0.468717f, 0.883349f, 0.763195f, 0.082813f, -0.996565f, + 0.862074f, 0.647409f, -0.762143f, 0.555184f, -0.940488f, -0.339827f, + 0.478523f, -0.990909f, 0.134535f, 0.818860f, 0.419288f, -0.907853f, + 0.152102f, 0.577050f, 0.816709f, 0.454597f, -0.959584f, 0.281423f, + 0.746838f, -0.019869f, -0.999803f, 0.886488f, 0.756262f, -0.654269f, + 0.344976f, -0.561958f, 0.827165f, 0.997330f, 0.999859f, -0.016777f, + 0.710216f, -0.247376f, -0.968920f, 0.129641f, 0.686191f, 0.727421f, + 0.063722f, 0.920915f, 0.389764f, 0.584237f, -0.863171f, -0.504911f, + 0.280522f, -0.190601f, 0.981668f, 0.499031f, -0.999981f, 0.006088f, + 0.680430f, -0.423331f, -0.905975f, 0.028565f, 0.983937f, 0.178516f, + 0.590829f, -0.841524f, -0.540219f, 0.405035f, -0.827206f, 0.561899f, + 0.060304f, 0.929072f, 0.369898f, 0.650156f, -0.586990f, -0.809594f, + 0.450935f, -0.952855f, 0.303427f, 0.967300f, 0.978967f, -0.204018f, + 0.517586f, -0.993901f, -0.110272f, 0.635019f, -0.661220f, -0.750192f, + 0.819837f, 0.424851f, -0.905263f, 0.759289f, 0.058331f, -0.998297f, + 0.535409f, -0.975354f, -0.220648f, 0.357671f, -0.626083f, 0.779756f, + 0.053712f, 0.943592f, 0.331111f, 0.672862f, -0.465919f, -0.884827f, + 0.572519f, -0.897976f, -0.440044f, 0.155032f, 0.561919f, 0.827192f, + 0.287602f, -0.234069f, 0.972220f, 0.420905f, -0.879031f, 0.476764f, + 0.993423f, 0.999146f, -0.041310f, 0.144045f, 0.617636f, 0.786464f, + 0.454841f, -0.960014f, 0.279951f, 0.539559f, -0.969269f, -0.246005f, + 0.879652f, 0.727470f, -0.686139f, 0.197269f, 0.325292f, 0.945613f, + 0.688243f, -0.378367f, -0.925656f, 0.451667f, -0.954241f, 0.299039f, + 0.104494f, 0.792100f, 0.610391f, 0.610361f, -0.769066f, -0.639169f, + 0.205325f, 0.277027f, 0.960862f, 0.367681f, -0.673855f, 0.738864f, + 0.850111f, 0.588347f, -0.808608f, 0.575204f, -0.890424f, -0.455133f, + 0.508064f, -0.998717f, -0.050648f, 0.041260f, 0.966583f, 0.256353f, + 0.391608f, -0.776912f, 0.629609f, 0.832288f, 0.494302f, -0.869290f, + 0.524422f, -0.988250f, -0.152847f, 0.449714f, -0.950499f, 0.310726f, + 0.742687f, -0.045932f, -0.998945f, 0.939712f, 0.929108f, -0.369809f, + 0.312016f, -0.379875f, 0.925038f, 0.076661f, 0.886219f, 0.463266f, + 0.586191f, -0.856910f, -0.515466f, 0.507576f, -0.998867f, -0.047584f, + 0.035889f, 0.974683f, 0.223592f, 0.676524f, -0.445438f, -0.895313f, + 0.127932f, 0.693963f, 0.720011f, 0.287846f, -0.235560f, 0.971860f, + 0.896742f, 0.796817f, -0.604221f, 0.611826f, -0.763151f, -0.646221f, + 0.324224f, -0.449639f, 0.893210f, 0.970230f, 0.982557f, -0.185964f, + 0.244877f, 0.032185f, 0.999482f, 0.620371f, -0.727372f, -0.686244f, + 0.047608f, 0.955593f, 0.294690f, 0.797620f, 0.294758f, -0.955572f, + 0.311772f, -0.378455f, 0.925620f, 0.526864f, -0.985789f, -0.167988f, + 0.869154f, 0.680662f, -0.732598f, 0.421149f, -0.879762f, 0.475415f, + 0.729015f, -0.131471f, -0.991320f, 0.960220f, 0.968926f, -0.247352f, + 0.335943f, -0.514130f, 0.857712f, 0.839612f, 0.533769f, -0.845630f, + 0.145510f, 0.610372f, 0.792115f, 0.302007f, -0.320983f, 0.947085f, + 0.890150f, 0.771115f, -0.636696f, 0.801038f, 0.315211f, -0.949022f, + 0.352300f, -0.599416f, 0.800437f, 0.162112f, 0.524576f, 0.851363f, + 0.027588f, 0.985014f, 0.172476f, 0.380865f, -0.732679f, 0.680574f, + 0.473640f, -0.986316f, 0.164868f, 0.172366f, 0.468674f, 0.883371f, + 0.604501f, -0.792071f, -0.610429f, 0.885267f, 0.751221f, -0.660051f, + 0.976822f, 0.989414f, -0.145120f, 0.102052f, 0.801370f, 0.598169f, + 0.485847f, -0.996049f, 0.088807f, 0.928237f, 0.900055f, -0.435777f, + 0.733654f, -0.102526f, -0.994730f, 0.043458f, 0.962952f, 0.269672f, + 0.681651f, -0.416370f, -0.909195f, 0.578134f, -0.881895f, -0.471446f, + 0.258061f, -0.050624f, 0.998718f, 0.034180f, 0.977027f, 0.213114f, + 0.393805f, -0.785530f, 0.618823f, 0.065431f, 0.916677f, 0.399630f, + 0.782727f, 0.204182f, -0.978933f, 0.990005f, 0.998029f, -0.062757f, + 0.313481f, -0.388373f, 0.921502f, 0.924331f, 0.889089f, -0.457735f, + 0.007080f, 0.999011f, 0.044471f, 0.262211f, -0.076649f, 0.997058f, + 0.656016f, -0.556793f, -0.830651f, 0.785901f, 0.223662f, -0.974667f, + 0.125246f, 0.706013f, 0.708199f, 0.982681f, 0.994085f, -0.108604f, + 0.684581f, -0.399564f, -0.916705f, 0.084718f, 0.861642f, 0.507516f, + 0.961440f, 0.970794f, -0.239914f, 0.135256f, 0.660105f, 0.751174f, + 0.855238f, 0.614086f, -0.789239f, 0.667735f, -0.494177f, -0.869362f, + 0.544198f, -0.961688f, -0.274147f, 0.456550f, -0.962965f, 0.269626f, + 0.729503f, -0.128429f, -0.991719f, 0.267582f, -0.110248f, 0.993904f, + 0.882094f, 0.737910f, -0.674899f, 0.601572f, -0.803173f, -0.595746f, + 0.364263f, -0.657833f, 0.753164f, 0.417731f, -0.869350f, 0.494197f, + 0.086671f, 0.855349f, 0.518052f, 0.706554f, -0.269603f, -0.962972f, + 0.515145f, -0.995476f, -0.095013f, 0.385260f, -0.751190f, 0.660087f, + 0.117922f, 0.737845f, 0.674970f, 0.531502f, -0.980475f, -0.196645f, + 0.428229f, -0.900034f, 0.435820f, 0.097169f, 0.819342f, 0.573305f, + 0.224613f, 0.158837f, 0.987305f, 0.938979f, 0.927396f, -0.374081f, + 0.361089f, -0.642684f, 0.766132f, 0.156252f, 0.555558f, 0.831478f, + 0.045899f, 0.958702f, 0.284412f, 0.213138f, 0.229545f, 0.973298f, + 0.451423f, -0.953781f, 0.300502f, 0.637949f, -0.647299f, -0.762236f, + 0.923842f, 0.887680f, -0.460460f, 0.483162f, -0.994409f, 0.105601f, + 0.534920f, -0.976026f, -0.217654f, 0.110353f, 0.769097f, 0.639133f, + 0.610605f, -0.768085f, -0.640348f, 0.921645f, 0.881239f, -0.472671f, + 0.722179f, -0.173916f, -0.984761f, 0.262455f, -0.078178f, 0.996939f, + 0.865736f, 0.664773f, -0.747045f, 0.329351f, -0.478175f, 0.878265f, + 0.040040f, 0.968521f, 0.248931f, 0.710704f, -0.244402f, -0.969674f, + 0.440681f, -0.931342f, 0.364145f, 0.198245f, 0.319484f, 0.947592f, + 0.829847f, 0.480909f, -0.876770f, 0.248539f, 0.009180f, 0.999958f, + 0.540047f, -0.968509f, -0.248978f, 0.857435f, 0.624924f, -0.780686f, + 0.356939f, -0.622488f, 0.782629f, 0.901137f, 0.813195f, -0.581992f, + 0.811780f, 0.378500f, -0.925601f, 0.728527f, -0.134511f, -0.990912f, + 0.493660f, -0.999207f, 0.039826f, 0.846693f, 0.570847f, -0.821056f, + 0.246342f, 0.022984f, 0.999736f, 0.568856f, -0.907863f, -0.419266f, + 0.147707f, 0.599378f, 0.800466f, 0.819593f, 0.423462f, -0.905914f, + 0.709483f, -0.251832f, -0.967771f, 0.406744f, -0.833192f, 0.552984f, + 0.071290f, 0.901346f, 0.433100f, 0.907240f, 0.834911f, -0.550385f, + 0.297612f, -0.294713f, 0.955586f, 0.469245f, -0.981388f, 0.192036f, + 0.247562f, 0.015315f, 0.999883f, 0.585214f, -0.860057f, -0.510198f, + 0.771984f, 0.137693f, -0.990475f, 0.288579f, -0.240030f, 0.970766f, + 0.372564f, -0.696203f, 0.717845f, 0.202884f, 0.291734f, 0.956500f, + 0.052735f, 0.945606f, 0.325315f, 0.825696f, 0.457884f, -0.889012f, + 0.992935f, 0.999015f, -0.044376f, 0.175051f, 0.453702f, 0.891153f, + 0.430671f, -0.906613f, 0.421963f, 0.795911f, 0.284481f, -0.958682f, + 0.207523f, 0.263735f, 0.964595f, 0.960952f, 0.970054f, -0.242891f, + 0.757092f, 0.044543f, -0.999007f, 0.259281f, -0.058283f, 0.998300f, + 0.012207f, 0.997060f, 0.076625f, 0.830579f, 0.484939f, -0.874548f, + 0.673106f, -0.464562f, -0.885541f, 0.945815f, 0.942603f, -0.333914f, + 0.856947f, 0.622526f, -0.782599f, 0.759533f, 0.059862f, -0.998207f, + 0.649180f, -0.591947f, -0.805977f, 0.462165f, -0.971877f, 0.235490f, + 0.684825f, -0.398157f, -0.917317f, 0.905776f, 0.829810f, -0.558046f, + 0.619394f, -0.731569f, -0.681768f, 0.553231f, -0.944587f, -0.328260f, + 0.805921f, 0.344174f, -0.938906f, 0.078370f, 0.881194f, 0.472756f, + 0.182620f, 0.410827f, 0.911713f, 0.696300f, -0.331043f, -0.943616f, + 0.765881f, 0.099617f, -0.995026f, 0.215091f, 0.217584f, 0.976042f, + 0.282231f, -0.201131f, 0.979564f, 0.565194f, -0.917269f, -0.398267f, + 0.783459f, 0.208685f, -0.977983f, 0.079347f, 0.878276f, 0.478154f, + 0.990249f, 0.998124f, -0.061226f, 0.668223f, -0.491507f, -0.870874f, + 0.219974f, 0.187541f, 0.982257f, 0.283207f, -0.207138f, 0.978312f, + 0.776623f, 0.166499f, -0.986042f, 0.589120f, -0.847277f, -0.531152f, + 0.340581f, -0.538907f, 0.842365f, 0.656260f, -0.555518f, -0.831505f, + 0.093019f, 0.834013f, 0.551745f, 0.470222f, -0.982548f, 0.186011f, + 0.196780f, 0.328192f, 0.944611f, 0.103273f, 0.796759f, 0.604297f, + 0.632334f, -0.673784f, -0.738928f, 0.163088f, 0.519343f, 0.854566f, + 0.324956f, -0.453745f, 0.891132f, 0.661631f, -0.527145f, -0.849775f, + 0.097658f, 0.817579f, 0.575816f, 0.379889f, -0.728489f, 0.685057f, + 0.512459f, -0.996938f, -0.078202f, 0.637217f, -0.650800f, -0.759249f, + 0.458747f, -0.966596f, 0.256306f, 0.883558f, 0.744090f, -0.668079f, + 0.542245f, -0.964980f, -0.262325f, 0.160647f, 0.532390f, 0.846499f, + 0.727550f, -0.140589f, -0.990068f, 0.618662f, -0.734699f, -0.678394f, + 0.815686f, 0.401102f, -0.916034f, 0.182864f, 0.409428f, 0.912342f, + 0.692638f, -0.352666f, -0.935749f, 0.008301f, 0.998640f, 0.052132f, + 0.500252f, -0.999999f, -0.001582f, 0.606699f, -0.783568f, -0.621306f, + 0.907973f, 0.837435f, -0.546537f, 0.240970f, 0.056704f, 0.998391f, + 0.348638f, -0.580841f, 0.814017f, 0.645762f, -0.609118f, -0.793080f, + 0.106447f, 0.784550f, 0.620065f, 0.918959f, 0.873138f, -0.487473f, + 0.042725f, 0.964183f, 0.265238f, 0.485115f, -0.995630f, 0.093390f, + 0.635508f, -0.658915f, -0.752217f, 0.166506f, 0.500872f, 0.865522f, + 0.909682f, 0.843255f, -0.537514f, 0.572274f, -0.898650f, -0.438666f, + 0.204837f, 0.279974f, 0.960008f, 0.301274f, -0.316621f, 0.948552f, + 0.161135f, 0.529791f, 0.848129f, 0.377447f, -0.717895f, 0.696151f, + 0.581308f, -0.872319f, -0.488938f, 0.004395f, 0.999619f, 0.027609f, + 0.195804f, 0.333982f, 0.942579f, 0.826184f, 0.460609f, -0.887603f, + 0.300542f, -0.312252f, 0.949999f, 0.386236f, -0.755226f, 0.655465f, + 0.749279f, -0.004530f, -0.999990f, 0.260746f, -0.067469f, 0.997721f, + 0.368170f, -0.676119f, 0.736793f, 0.995621f, 0.999621f, -0.027513f, + 0.428473f, -0.900701f, 0.434439f, 0.002197f, 0.999905f, 0.013806f, + 0.871839f, 0.692926f, -0.721008f, 0.398444f, -0.803230f, 0.595669f, + 0.495857f, -0.999661f, 0.026027f, 0.133059f, 0.670412f, 0.741989f, + 0.432136f, -0.910458f, 0.413601f, 0.558602f, -0.932974f, -0.359945f, + 0.919203f, 0.873885f, -0.486133f, 0.512215f, -0.997056f, -0.076673f, + 0.120363f, 0.727405f, 0.686209f, 0.869886f, 0.684026f, -0.729457f, + 0.402350f, -0.817607f, 0.575777f, 0.026368f, 0.986308f, 0.164916f, + 0.974380f, 0.987072f, -0.160280f, 0.787854f, 0.235606f, -0.971849f, + 0.300053f, -0.309336f, 0.950953f, 0.519051f, -0.992844f, -0.119415f, + 0.931167f, 0.907924f, -0.419136f, 0.419440f, -0.874606f, 0.484834f, + 0.969009f, 0.981101f, -0.193494f, 0.593271f, -0.833139f, -0.553064f, + 0.892836f, 0.781748f, -0.623594f, 0.755871f, 0.036880f, -0.999320f, + 0.185794f, 0.392565f, 0.919724f, 0.274174f, -0.151307f, 0.988487f, + 0.083742f, 0.864740f, 0.502219f, 0.763928f, 0.087398f, -0.996173f, + 0.220706f, 0.183019f, 0.983109f, 0.357916f, -0.627279f, 0.778795f, + 0.932876f, 0.912372f, -0.409363f, 0.035645f, 0.975025f, 0.222097f, + 0.327398f, -0.467361f, 0.884067f, 0.406012f, -0.830638f, 0.556813f, + 0.875502f, 0.709332f, -0.704875f, 0.930678f, 0.906633f, -0.421919f, + 0.093507f, 0.832316f, 0.554302f, 0.422370f, -0.883382f, 0.468653f, + 0.708263f, -0.259247f, -0.965811f, 0.775158f, 0.157417f, -0.987532f, + 0.017090f, 0.994240f, 0.107174f, 0.497322f, -0.999858f, 0.016825f, + 0.567391f, -0.911684f, -0.410893f, 0.311284f, -0.375614f, 0.926776f, + 0.697765f, -0.322344f, -0.946622f, 0.536873f, -0.973281f, -0.229615f, + 0.853040f, 0.603132f, -0.797642f, 0.335454f, -0.511496f, 0.859285f, + 0.437507f, -0.923896f, 0.382645f, 0.788586f, 0.240076f, -0.970754f, + 0.475837f, -0.988498f, 0.151236f, 0.038819f, 0.970402f, 0.241495f, + 0.726818f, -0.145144f, -0.989411f, 0.500984f, -0.999981f, -0.006184f, + 0.982925f, 0.994251f, -0.107079f, 0.278813f, -0.180049f, 0.983658f, + 0.771252f, 0.133134f, -0.991098f, 0.091554f, 0.839055f, 0.544046f, + 0.484871f, -0.995485f, 0.094917f, 0.967056f, 0.978653f, -0.205520f, + 0.021241f, 0.991108f, 0.133063f, 0.865492f, 0.663626f, -0.748064f, + 0.581796f, -0.870815f, -0.491611f, 0.101564f, 0.803202f, 0.595707f, + 0.629160f, -0.688385f, -0.725345f, 0.334966f, -0.508858f, 0.860851f, + 0.947280f, 0.945637f, -0.325224f, 0.679454f, -0.428882f, -0.903360f, + 0.188724f, 0.375569f, 0.926794f, 0.637705f, -0.648468f, -0.761242f, + 0.839124f, 0.531172f, -0.847264f, 0.738048f, -0.075024f, -0.997182f, + 0.388190f, -0.763212f, 0.646148f, 0.007568f, 0.998870f, 0.047536f, + 0.632822f, -0.671514f, -0.740992f, 0.948745f, 0.948590f, -0.316507f, + 0.173587f, 0.461885f, 0.886940f, 0.726329f, -0.148179f, -0.988961f, + 0.432380f, -0.911092f, 0.412203f, 0.609628f, -0.771999f, -0.635623f, + 0.695323f, -0.336827f, -0.941567f, 0.378424f, -0.722153f, 0.691733f, + 0.010498f, 0.997825f, 0.065914f, 0.772961f, 0.143768f, -0.989611f, + 0.216068f, 0.211591f, 0.977358f, 0.285649f, -0.222120f, 0.975019f, + 0.028077f, 0.984480f, 0.175497f, 0.428717f, -0.901367f, 0.433057f, + 0.932143f, 0.910478f, -0.413557f, 0.833997f, 0.503607f, -0.863933f, + 0.332036f, -0.492926f, 0.870071f, 0.976577f, 0.989190f, -0.146638f, + 0.600595f, -0.806814f, -0.590806f, 0.505135f, -0.999480f, -0.032256f, + 0.432624f, -0.911723f, 0.410805f, 0.846204f, 0.568326f, -0.822804f, + 0.113771f, 0.755194f, 0.655501f, 0.555428f, -0.939966f, -0.341269f, + 0.231693f, 0.114773f, 0.993392f, 0.635752f, -0.657761f, -0.753227f, + 0.812024f, 0.379919f, -0.925020f, 0.317632f, -0.412269f, 0.911062f, + 0.537118f, -0.972928f, -0.231108f, 0.141115f, 0.632008f, 0.774962f, + 0.397955f, -0.801399f, 0.598130f, 0.948989f, 0.949075f, -0.315052f, + 0.843030f, 0.551805f, -0.833973f, 0.739025f, -0.068904f, -0.997623f, + 0.226566f, 0.146709f, 0.989180f, 0.387213f, -0.759233f, 0.650818f, + 0.062013f, 0.925047f, 0.379853f, 0.991470f, 0.998564f, -0.053569f, + 0.105959f, 0.786449f, 0.617655f, 0.711925f, -0.236957f, -0.971520f, + 0.360113f, -0.637970f, 0.770061f, 0.609140f, -0.773946f, -0.633252f, + 0.892348f, 0.779831f, -0.625990f, 0.239506f, 0.065890f, 0.997827f, + 0.121096f, 0.724239f, 0.689549f, 0.845472f, 0.564533f, -0.825410f, + 0.545663f, -0.959124f, -0.282987f, 0.413825f, -0.856959f, 0.515384f, + 0.707530f, -0.263689f, -0.964608f, 0.138430f, 0.644994f, 0.764187f, + 0.661875f, -0.525841f, -0.850583f, 0.507332f, -0.998939f, -0.046052f, + 0.308598f, -0.359923f, 0.932982f, 0.732677f, -0.108628f, -0.994083f, + 0.843275f, 0.553084f, -0.833125f, 0.473152f, -0.985805f, 0.167894f, + 0.058106f, 0.934091f, 0.357036f, 0.802747f, 0.325383f, -0.945582f, + 0.253178f, -0.019965f, 0.999801f, 0.354253f, -0.609194f, 0.793021f, + 0.068849f, 0.907883f, 0.419223f, 0.300786f, -0.313709f, 0.949519f, + 0.158694f, 0.542738f, 0.839902f, 0.821790f, 0.435928f, -0.899982f, + 0.472663f, -0.985285f, 0.170917f, 0.314458f, -0.394020f, 0.919102f, + 0.554208f, -0.942555f, -0.334050f, 0.269291f, -0.120914f, 0.992663f, + 0.892592f, 0.780791f, -0.624793f, 0.142824f, 0.623650f, 0.781703f, + 0.227543f, 0.140637f, 0.990061f, 0.849378f, 0.584620f, -0.811307f, + 0.558114f, -0.934073f, -0.357081f, 0.118166f, 0.736809f, 0.676101f, + 0.464118f, -0.974693f, 0.223546f, 0.687755f, -0.381205f, -0.924491f, + 0.538582f, -0.970760f, -0.240053f, 0.719982f, -0.187494f, -0.982266f, + 0.057618f, 0.935182f, 0.354169f, 0.572763f, -0.897300f, -0.441421f, + 0.675059f, -0.453659f, -0.891175f, 0.128420f, 0.691750f, 0.722137f, + 0.015625f, 0.995185f, 0.098019f, 0.702403f, -0.294621f, -0.955614f, + 0.267338f, -0.108723f, 0.994072f, 0.651377f, -0.580763f, -0.814073f, + 0.996841f, 0.999803f, -0.019845f, 0.465827f, -0.977038f, 0.213067f, + 0.360357f, -0.639151f, 0.769081f, 0.734874f, -0.094893f, -0.995487f, + 0.181399f, 0.417808f, 0.908535f, 0.974868f, 0.987559f, -0.157251f, + 0.264652f, -0.091934f, 0.995765f, 0.885023f, 0.750208f, -0.661202f, + 0.676036f, -0.448183f, -0.893942f, 0.187015f, 0.385500f, 0.922708f, + 0.274662f, -0.154339f, 0.988018f, 0.446052f, -0.943099f, 0.332513f, + 0.132570f, 0.672685f, 0.739929f, 0.610117f, -0.770046f, -0.637989f, + 0.765637f, 0.098090f, -0.995178f, 0.279789f, -0.186082f, 0.982534f, + 0.655528f, -0.559339f, -0.828939f, 0.231205f, 0.117820f, 0.993035f, + 0.929946f, 0.904682f, -0.426087f, 0.074464f, 0.892530f, 0.450987f, + 0.812757f, 0.384172f, -0.923261f, 0.643076f, -0.622413f, -0.782689f, + 0.445319f, -0.941558f, 0.336850f, 0.351568f, -0.595726f, 0.803187f, + 0.949233f, 0.949557f, -0.313595f, 0.604257f, -0.793007f, -0.609213f, + 0.245121f, 0.030651f, 0.999530f, 0.889418f, 0.768177f, -0.640238f, + 0.203372f, 0.288798f, 0.957390f, 0.440436f, -0.930782f, 0.365574f, + 0.928725f, 0.901387f, -0.433014f, 0.155764f, 0.558106f, 0.829770f, + 0.233646f, 0.102574f, 0.994725f, 0.550301f, -0.950470f, -0.310817f, + 0.125490f, 0.704926f, 0.709281f, 0.718029f, -0.199534f, -0.979891f, + 0.972671f, 0.985294f, -0.170870f, 0.524910f, -0.987776f, -0.155878f, + 0.896254f, 0.794959f, -0.606663f, 0.587655f, -0.852129f, -0.523331f, + 0.963149f, 0.973314f, -0.229475f, 0.237064f, 0.081189f, 0.996699f, + 0.760510f, 0.065986f, -0.997821f, 0.671397f, -0.474044f, -0.880501f, + 0.067628f, 0.911072f, 0.412247f, 0.817151f, 0.409516f, -0.912303f, + 0.510750f, -0.997720f, -0.067493f, 0.050294f, 0.950485f, 0.310772f, + 0.953872f, 0.958292f, -0.285790f, 0.732921f, -0.107103f, -0.994248f, + 0.641123f, -0.631971f, -0.774992f, 0.347173f, -0.573324f, 0.819328f, + 0.878920f, 0.724305f, -0.689480f, 0.809094f, 0.362828f, -0.931856f, + 0.143557f, 0.620046f, 0.784565f, 0.962417f, 0.972248f, -0.233952f, + 0.364996f, -0.661292f, 0.750129f, 0.236820f, 0.082718f, 0.996573f, + 0.486091f, -0.996184f, 0.087279f, 0.403082f, -0.820248f, 0.572008f, + 0.874037f, 0.702814f, -0.711373f, 0.804456f, 0.335518f, -0.942034f, + 0.198734f, 0.316575f, 0.948567f, 0.056153f, 0.938402f, 0.345546f, + 0.758068f, 0.050672f, -0.998715f, 0.146731f, 0.604278f, 0.796773f, + 0.516365f, -0.994718f, -0.102645f, 0.027100f, 0.985538f, 0.169453f, + 0.443366f, -0.937354f, 0.348379f, 0.109377f, 0.773004f, 0.634401f, + 0.622568f, -0.717828f, -0.696220f, 0.476326f, -0.988957f, 0.148203f, + 0.067140f, 0.912333f, 0.409450f, 0.594736f, -0.828013f, -0.560709f, + 0.801526f, 0.318121f, -0.948050f, 0.024659f, 0.988022f, 0.154315f, + 0.886244f, 0.755257f, -0.655429f, 0.938247f, 0.925665f, -0.378344f, + 0.182132f, 0.413622f, 0.910449f, 0.562020f, -0.925029f, -0.379897f, + 0.838392f, 0.527267f, -0.849699f, 0.511727f, -0.997287f, -0.073613f, + 0.150393f, 0.585786f, 0.810466f, 0.412116f, -0.851376f, 0.524556f, + 0.540780f, -0.967353f, -0.253432f, 0.303960f, -0.332581f, 0.943075f, + 0.029297f, 0.983105f, 0.183043f, 0.740246f, -0.061250f, -0.998122f, + 0.177249f, 0.441356f, 0.897332f, 0.071534f, 0.900680f, 0.434482f, + 0.328618f, -0.474128f, 0.880456f, 0.813977f, 0.391242f, -0.920288f, + 0.557626f, -0.935165f, -0.354214f, 0.046143f, 0.958265f, 0.285882f, + 0.788342f, 0.238587f, -0.971121f, 0.404303f, -0.824611f, 0.565700f, + 0.666270f, -0.502157f, -0.864776f, 0.903578f, 0.822026f, -0.569449f, + 0.296391f, -0.287375f, 0.957818f, 0.596933f, -0.820193f, -0.572087f, + 0.438972f, -0.927378f, 0.374125f, 0.025879f, 0.986809f, 0.161889f, + 0.207034f, 0.266694f, 0.963781f, 0.459236f, -0.967377f, 0.253339f, + 0.697276f, -0.325247f, -0.945629f, 0.087892f, 0.851351f, 0.524597f, + 0.358892f, -0.632045f, 0.774931f, 0.884779f, 0.749193f, -0.662352f, + 0.202152f, 0.296132f, 0.955147f, 0.390631f, -0.773034f, 0.634364f, + 0.595468f, -0.825424f, -0.564513f, 0.341558f, -0.544066f, 0.839042f, + 0.476814f, -0.989407f, 0.145168f, 0.280766f, -0.192107f, 0.981374f, + 0.179690f, 0.427540f, 0.903997f, 0.999283f, 0.999990f, -0.004506f, + 0.072267f, 0.898671f, 0.438622f, 0.506111f, -0.999263f, -0.038389f, + 0.319829f, -0.424807f, 0.905284f, 0.199222f, 0.313664f, 0.949534f, + 0.621592f, -0.722087f, -0.691802f, 0.899184f, 0.805991f, -0.591927f, + 0.786877f, 0.229639f, -0.973276f, 0.170901f, 0.476785f, 0.879020f, + 0.304936f, -0.338361f, 0.941016f, 0.953140f, 0.956967f, -0.290197f, + 0.543221f, -0.963352f, -0.268241f, 0.383307f, -0.743033f, 0.669255f, + 0.594247f, -0.829729f, -0.558166f, 0.286137f, -0.225111f, 0.974333f, + 0.662852f, -0.520612f, -0.853793f, 0.950454f, 0.951934f, -0.306303f, + 0.568368f, -0.909145f, -0.416479f, 0.763439f, 0.084342f, -0.996437f, + 0.830335f, 0.483597f, -0.875291f, 0.366461f, -0.668168f, 0.744010f, + 0.726574f, -0.146662f, -0.989187f, 0.322759f, -0.441399f, 0.897311f, + 0.980972f, 0.992862f, -0.119272f, 0.514412f, -0.995903f, -0.090430f, + 0.663584f, -0.516677f, -0.856180f, 0.339361f, -0.532431f, 0.846474f, + 0.480964f, -0.992856f, 0.119319f, 0.403326f, -0.821125f, 0.570749f, + 0.006104f, 0.999265f, 0.038341f, 0.321538f, -0.434504f, 0.900670f, + 0.962661f, 0.972606f, -0.232461f, 0.773938f, 0.149838f, -0.988711f, + 0.192386f, 0.354146f, 0.935190f, 0.916274f, 0.864788f, -0.502137f, + 0.690929f, -0.362694f, -0.931908f, 0.864515f, 0.659024f, -0.752122f, + 0.512703f, -0.996816f, -0.079731f, 0.651621f, -0.579514f, -0.814963f, + 0.755383f, 0.033814f, -0.999428f, 0.377203f, -0.716826f, 0.697252f, + 0.982193f, 0.993747f, -0.111653f, 0.626474f, -0.700526f, -0.713627f, + 0.277836f, -0.174010f, 0.984744f, 0.080812f, 0.873838f, 0.486217f, + 0.518074f, -0.993559f, -0.113320f, 0.820569f, 0.429012f, -0.903299f, + 0.179202f, 0.430311f, 0.902681f, 0.390387f, -0.772060f, 0.635549f, + 0.764416f, 0.090454f, -0.995901f, 0.659434f, -0.538827f, -0.842417f, + 0.859632f, 0.635642f, -0.771984f, 0.793225f, 0.268264f, -0.963345f, + 0.400397f, -0.810480f, 0.585767f, 0.539071f, -0.970019f, -0.243030f, + 0.611337f, -0.765130f, -0.643876f, 0.132815f, 0.671550f, 0.740960f, + 0.987564f, 0.996949f, -0.078059f, 0.781750f, 0.198172f, -0.980167f, + 0.682872f, -0.409384f, -0.912362f, 0.905287f, 0.828094f, -0.560590f, + 0.094240f, 0.829756f, 0.558126f, 0.826429f, 0.461970f, -0.886896f, + 0.430426f, -0.905965f, 0.423353f, 0.591806f, -0.838194f, -0.545373f, + 0.244388f, 0.035251f, 0.999378f, 0.397467f, -0.799560f, 0.600586f, + 0.663096f, -0.519302f, -0.854591f, 0.853285f, 0.604355f, -0.796715f, + 0.440192f, -0.930221f, 0.367001f, 0.099367f, 0.811349f, 0.584562f, + 0.531746f, -0.980172f, -0.198148f, 0.733410f, -0.104052f, -0.994572f, + 0.630869f, -0.680557f, -0.732695f, 0.455573f, -0.961293f, 0.275530f, + 0.095705f, 0.824584f, 0.565739f, 0.917250f, 0.867853f, -0.496821f, + 0.797864f, 0.296224f, -0.955119f, 0.888685f, 0.765222f, -0.643766f, + 0.192874f, 0.351275f, 0.936272f, 0.851820f, 0.596996f, -0.802244f, + 0.333257f, -0.499585f, 0.866265f, 0.236088f, 0.087303f, 0.996182f, + 0.040528f, 0.967753f, 0.251902f, 0.924086f, 0.888386f, -0.459098f, + 0.214115f, 0.223569f, 0.974688f, 0.557137f, -0.936247f, -0.351343f, + 0.085939f, 0.857724f, 0.514110f, 0.412360f, -0.852180f, 0.523249f, + 0.249271f, 0.004578f, 0.999990f, 0.789563f, 0.246028f, -0.969263f, + 0.116945f, 0.741973f, 0.670430f, 0.876478f, 0.713644f, -0.700509f, + 0.734630f, -0.096420f, -0.995341f, 0.598642f, -0.814003f, -0.580861f, + 0.670909f, -0.476743f, -0.879043f, 0.463386f, -0.973654f, 0.228029f, + 0.083253f, 0.866277f, 0.499564f, 0.379156f, -0.725329f, 0.688402f, + 0.583505f, -0.865486f, -0.500934f, 0.128176f, 0.692857f, 0.721075f, + 0.274418f, -0.152823f, 0.988254f, 0.927504f, 0.898040f, -0.439914f, + 0.009522f, 0.998211f, 0.059790f, 0.461677f, -0.971150f, 0.238471f, + 0.115236f, 0.749129f, 0.662424f, 0.705577f, -0.275507f, -0.961299f, + 0.353765f, -0.606758f, 0.794887f, 0.948257f, 0.947615f, -0.319416f, + 0.738293f, -0.073494f, -0.997296f, 0.015137f, 0.995481f, 0.094965f, + 0.340093f, -0.536320f, 0.844014f, 0.933120f, 0.912999f, -0.407962f, + 0.103517f, 0.795831f, 0.605519f, 0.272465f, -0.140684f, 0.990055f, + 0.147219f, 0.601831f, 0.798623f, 0.317876f, -0.413666f, 0.910429f, + 0.053468f, 0.944099f, 0.329663f, 0.937758f, 0.924500f, -0.381183f, + 0.265873f, -0.099569f, 0.995031f, 0.504891f, -0.999528f, -0.030723f, + 0.439216f, -0.927951f, 0.372702f, 0.011231f, 0.997511f, 0.070506f, + 0.246586f, 0.021450f, 0.999770f, 0.170169f, 0.480825f, 0.876817f, + 0.753185f, 0.020013f, -0.999800f, 0.529549f, -0.982814f, -0.184598f, + 0.034913f, 0.976036f, 0.217608f, 0.703136f, -0.290220f, -0.956960f, + 0.790784f, 0.253455f, -0.967347f, 0.938003f, 0.925083f, -0.379764f, + 0.000977f, 0.999981f, 0.006136f, 0.752697f, 0.016945f, -0.999856f, + 0.291997f, -0.260821f, 0.965387f, 0.046387f, 0.957825f, 0.287352f, + 0.989273f, 0.997729f, -0.067349f, 0.257572f, -0.047560f, 0.998868f, + 0.115969f, 0.746073f, 0.665865f, 0.349859f, -0.587068f, 0.809538f, + 0.683116f, -0.407984f, -0.912989f, 0.239017f, 0.068951f, 0.997620f, + 0.482429f, -0.993912f, 0.110176f, 0.069581f, 0.905944f, 0.423397f, + 0.715343f, -0.216040f, -0.976385f, 0.122805f, 0.716793f, 0.697286f, + 0.399908f, -0.808679f, 0.588251f, 0.684337f, -0.400970f, -0.916091f, + 0.509529f, -0.998208f, -0.059838f, 0.149660f, 0.589510f, 0.807761f, + 0.439460f, -0.928522f, 0.371278f, 0.871595f, 0.691820f, -0.722070f, + 0.760998f, 0.069047f, -0.997613f, 0.169680f, 0.483513f, 0.875337f, + 0.712902f, -0.230992f, -0.972956f, 0.041749f, 0.965792f, 0.259317f, + 0.621347f, -0.723147f, -0.690694f, 0.972427f, 0.985030f, -0.172381f, + 0.210208f, 0.247422f, 0.968908f, 0.066407f, 0.914207f, 0.405247f, + 0.270268f, -0.127002f, 0.991902f, 0.881605f, 0.735836f, -0.677160f, + 0.744884f, -0.032137f, -0.999483f, 0.233890f, 0.101048f, 0.994882f, + 0.991714f, 0.998645f, -0.052037f, 0.476081f, -0.988729f, 0.149719f, + 0.416754f, -0.866301f, 0.499522f, 0.200931f, 0.303450f, 0.952847f, + 0.839857f, 0.535066f, -0.844810f, 0.535653f, -0.975014f, -0.222144f, + 0.251225f, -0.007694f, 0.999970f, 0.172610f, 0.467319f, 0.884089f, + 0.863294f, 0.653236f, -0.757155f, 0.577157f, -0.884771f, -0.466025f, + 0.213382f, 0.228052f, 0.973649f, 0.463142f, -0.973303f, 0.229522f, + 0.618906f, -0.733657f, -0.679520f, 0.844984f, 0.561998f, -0.827139f, + 0.496590f, -0.999770f, 0.021426f, 0.557870f, -0.934620f, -0.355648f, + 0.993179f, 0.999082f, -0.042843f, 0.623789f, -0.712467f, -0.701705f, + 0.739269f, -0.067373f, -0.997728f, 0.184817f, 0.398201f, 0.917298f, + 0.842054f, 0.546678f, -0.837343f, 0.643320f, -0.621212f, -0.783643f, + 0.732189f, -0.111677f, -0.993745f, 0.307622f, -0.354191f, 0.935173f, + 0.565927f, -0.915427f, -0.402484f, 0.949722f, 0.950514f, -0.310681f, + 0.399420f, -0.806870f, 0.590729f, 0.656504f, -0.554242f, -0.832356f, + 0.305180f, -0.339804f, 0.940496f, 0.898939f, 0.805082f, -0.593163f, + 0.124025f, 0.711424f, 0.702763f, 0.536141f, -0.974328f, -0.225134f, + 0.175784f, 0.449596f, 0.893232f, 0.580331f, -0.875302f, -0.483576f, + 0.481209f, -0.993038f, 0.117796f, 0.823011f, 0.442818f, -0.896612f, + 0.655039f, -0.561879f, -0.827219f, 0.391119f, -0.774977f, 0.631990f, + 0.585946f, -0.857700f, -0.514151f, 0.857191f, 0.623725f, -0.781644f, + 0.033448f, 0.977998f, 0.208615f, 0.737804f, -0.076553f, -0.997065f, + 0.317144f, -0.409472f, 0.912323f, 0.424323f, -0.889067f, 0.457777f, + 0.548104f, -0.954670f, -0.297666f, 0.271000f, -0.131566f, 0.991307f, + 0.896010f, 0.794028f, -0.607882f, 0.599863f, -0.809524f, -0.587087f, + 0.992447f, 0.998874f, -0.047440f, 0.783948f, 0.211685f, -0.977338f, + 0.654795f, -0.563147f, -0.826356f, 0.278080f, -0.175521f, 0.984476f, + 0.605966f, -0.786419f, -0.617693f, 0.358404f, -0.629665f, 0.776867f, + 0.919936f, 0.876113f, -0.482107f, 0.530037f, -0.982243f, -0.187612f, + 0.286625f, -0.228099f, 0.973638f, 0.443610f, -0.937887f, 0.346941f, + 0.376471f, -0.713610f, 0.700543f, 0.811536f, 0.377079f, -0.926181f, + 0.134768f, 0.662406f, 0.749145f, 0.556405f, -0.937854f, -0.347030f, + 0.334234f, -0.504891f, 0.863183f, 0.830091f, 0.482253f, -0.876032f, + 0.035157f, 0.975701f, 0.219105f, 0.633310f, -0.669237f, -0.743049f, + 0.798840f, 0.302079f, -0.953283f, 0.321294f, -0.433122f, 0.901336f, + 0.685801f, -0.392521f, -0.919743f, 0.597910f, -0.816667f, -0.577108f, + 0.910658f, 0.846537f, -0.532329f, 0.776867f, 0.168012f, -0.985785f, + 0.492439f, -0.998872f, 0.047488f, 0.413336f, -0.855374f, 0.518011f, + 0.131594f, 0.677213f, 0.735787f, 0.975357f, 0.988036f, -0.154221f, + 0.689952f, -0.368405f, -0.929665f, 0.069093f, 0.907239f, 0.420615f, + 0.221439f, 0.178493f, 0.983941f, 0.713146f, -0.229499f, -0.973309f, + 0.364752f, -0.660141f, 0.751142f, 0.469734f, -0.981972f, 0.189024f, + 0.893080f, 0.782704f, -0.622394f, 0.420661f, -0.878299f, 0.478112f, + 0.038087f, 0.971503f, 0.237027f, 0.343755f, -0.555598f, 0.831451f, + 0.108644f, 0.775915f, 0.630837f, 0.870619f, 0.687376f, -0.726302f, + 0.464851f, -0.975712f, 0.219058f, 0.626719f, -0.699430f, -0.714701f, + 0.136721f, 0.653163f, 0.757217f, 0.852308f, 0.599455f, -0.800409f, + 0.206302f, 0.271126f, 0.962544f, 0.369879f, -0.683991f, 0.729490f, + 0.462409f, -0.972237f, 0.233999f, 0.268070f, -0.113296f, 0.993561f, + 0.723644f, -0.164845f, -0.986320f, 0.892103f, 0.778870f, -0.627185f, + 0.351080f, -0.593259f, 0.805011f, 0.220462f, 0.184527f, 0.982827f, + 0.915053f, 0.860912f, -0.508755f, 0.164553f, 0.511455f, 0.859310f, + 0.779065f, 0.181605f, -0.983372f, 0.948013f, 0.947124f, -0.320869f, + 0.528328f, -0.984201f, -0.177054f, 0.149905f, 0.588270f, 0.808665f, + 0.981216f, 0.993043f, -0.117749f, 0.624521f, -0.709231f, -0.704977f, + 0.013428f, 0.996443f, 0.084270f, 0.756115f, 0.038413f, -0.999262f, + 0.468513f, -0.980494f, 0.196551f, 0.075685f, 0.889045f, 0.457820f, + 0.301762f, -0.319529f, 0.947576f, 0.380133f, -0.729539f, 0.683939f, + 0.001709f, 0.999942f, 0.010738f, 0.112795f, 0.759202f, 0.650855f, + 0.949966f, 0.950990f, -0.309222f, 0.463874f, -0.974349f, 0.225041f, + 0.806897f, 0.349929f, -0.936776f, 0.137209f, 0.650837f, 0.759218f, + 0.848890f, 0.582128f, -0.813097f, 0.698741f, -0.316530f, -0.948583f, + 0.579843f, -0.876782f, -0.480888f, 0.944350f, 0.939490f, -0.342576f, + 0.500008f, -1.000000f, -0.000048f, 0.410407f, -0.845694f, 0.533668f, + 0.654063f, -0.566944f, -0.823756f, 0.164797f, 0.510137f, 0.860093f, + 0.521248f, -0.991101f, -0.133110f, 0.720958f, -0.181464f, -0.983398f, + 0.089601f, 0.845669f, 0.533708f, 0.961685f, 0.971161f, -0.238424f, + 0.141604f, 0.629628f, 0.776897f, 0.391363f, -0.775945f, 0.630800f, + 0.038331f, 0.971138f, 0.238517f, 0.297368f, -0.293246f, 0.956037f, + 0.073243f, 0.895963f, 0.444128f, 0.669932f, -0.482128f, -0.876101f, + 0.322026f, -0.437265f, 0.899333f, 0.783703f, 0.210185f, -0.977662f, + 0.266361f, -0.102621f, 0.994721f, 0.423835f, -0.887658f, 0.460503f, + 0.915297f, 0.861691f, -0.507433f, 0.788830f, 0.241565f, -0.970385f, + 0.005127f, 0.999481f, 0.032209f, 0.119875f, 0.729507f, 0.683974f, + 0.234623f, 0.096468f, 0.995336f, 0.580087f, -0.876043f, -0.482232f, + 0.784436f, 0.214682f, -0.976684f, 0.687022f, -0.385455f, -0.922727f, + 0.971206f, 0.983679f, -0.179931f, 0.216556f, 0.208592f, 0.978003f, + 0.799817f, 0.307923f, -0.951411f, 0.351324f, -0.594494f, 0.804100f, + 0.072511f, 0.897998f, 0.440001f, 0.490974f, -0.998392f, 0.056680f, + 0.978775f, 0.991120f, -0.132968f, 0.771740f, 0.136174f, -0.990685f, + 0.614023f, -0.754156f, -0.656695f, 0.084474f, 0.862420f, 0.506194f, + 0.967544f, 0.979279f, -0.202516f, 0.406989f, -0.834039f, 0.551705f, + 0.130617f, 0.681715f, 0.731618f, 0.701671f, -0.299016f, -0.954248f, + 0.514656f, -0.995763f, -0.091958f, 0.015381f, 0.995334f, 0.096492f, + 0.466072f, -0.977363f, 0.211568f, 0.278569f, -0.178540f, 0.983933f, + 0.208743f, 0.256329f, 0.966590f, 0.816663f, 0.406715f, -0.913555f, + 0.371344f, -0.690676f, 0.723164f, 0.844739f, 0.560729f, -0.828000f, + 0.227054f, 0.143673f, 0.989625f, 0.954604f, 0.959597f, -0.281377f, + 0.159426f, 0.538867f, 0.842391f, 0.814221f, 0.392653f, -0.919686f, + 0.205570f, 0.275553f, 0.961286f, 0.552987f, -0.945090f, -0.326811f, + 0.842786f, 0.550525f, -0.834818f, 0.700938f, -0.303404f, -0.952862f, + 0.520760f, -0.991505f, -0.130069f, 0.232181f, 0.111725f, 0.993739f, + 0.073487f, 0.895281f, 0.445502f, 0.665782f, -0.504808f, -0.863232f, + 0.331060f, -0.487578f, 0.873080f, 0.173098f, 0.464604f, 0.885519f, + 0.018555f, 0.993212f, 0.116320f, 0.248051f, 0.012248f, 0.999925f, + 0.719493f, -0.190507f, -0.981686f, 0.896986f, 0.797743f, -0.602998f, + 0.055177f, 0.940504f, 0.339782f, 0.951919f, 0.954713f, -0.297529f, + 0.278325f, -0.177030f, 0.984205f, 0.367437f, -0.672721f, 0.739896f, + 0.563241f, -0.922088f, -0.386981f, 0.241459f, 0.053640f, 0.998560f, + 0.855726f, 0.616505f, -0.787351f, 0.448493f, -0.948088f, 0.318007f, + 0.743175f, -0.042867f, -0.999081f, 0.998795f, 0.999971f, -0.007574f, + 0.615244f, -0.749097f, -0.662460f, 0.818372f, 0.416501f, -0.909135f, + 0.887953f, 0.762251f, -0.647281f, 0.031983f, 0.979876f, 0.199605f, + 0.522957f, -0.989615f, -0.143745f, 0.592782f, -0.834832f, -0.550505f, + 0.166262f, 0.502199f, 0.864752f, 0.306157f, -0.345569f, 0.938393f, + 0.669444f, -0.484813f, -0.874618f, 0.829114f, 0.476869f, -0.878974f, + 0.528573f, -0.983928f, -0.178564f, 0.294438f, -0.275599f, 0.961273f, + 0.927016f, 0.896686f, -0.442668f, 0.482918f, -0.994245f, 0.107126f, + 0.165530f, 0.506173f, 0.862432f, 0.544686f, -0.960842f, -0.277096f, + 0.031495f, 0.980484f, 0.196598f, 0.916518f, 0.865558f, -0.500809f, + 0.738781f, -0.070434f, -0.997516f, 0.250736f, -0.004626f, 0.999989f, + 0.571786f, -0.899992f, -0.435906f, 0.020020f, 0.992099f, 0.125457f, + 0.689464f, -0.371256f, -0.928531f, 0.329107f, -0.476827f, 0.878997f, + 0.826673f, 0.463330f, -0.886186f, 0.644053f, -0.617599f, -0.786493f, + 0.061036f, 0.927360f, 0.374169f, 0.808362f, 0.358536f, -0.933516f, + 0.574228f, -0.893200f, -0.449661f, 0.333745f, -0.502240f, 0.864728f, + 0.719738f, -0.189001f, -0.981977f, 0.411383f, -0.848953f, 0.528469f, + 0.660899f, -0.531050f, -0.847340f, 0.590585f, -0.842352f, -0.538928f, + 0.085451f, 0.859298f, 0.511476f, 0.489509f, -0.997828f, 0.065867f, + 0.644785f, -0.613973f, -0.789327f, 0.341070f, -0.541489f, 0.840708f, + 0.416266f, -0.864764f, 0.502178f, 0.691905f, -0.356969f, -0.934116f, + 0.626230f, -0.701620f, -0.712551f, 0.482185f, -0.993742f, 0.111701f, + 0.966323f, 0.977697f, -0.210021f, 0.338872f, -0.529831f, 0.848103f, + 0.180911f, 0.420593f, 0.907249f, 0.884535f, 0.748176f, -0.663501f, + 0.417975f, -0.870107f, 0.492863f, 0.561288f, -0.926767f, -0.375636f, + 0.996353f, 0.999737f, -0.022912f, 0.487556f, -0.996945f, 0.078107f, + 0.768322f, 0.114868f, -0.993381f, 0.355962f, -0.617674f, 0.786434f, + 0.092775f, 0.834858f, 0.550465f, 0.601083f, -0.804997f, -0.593279f, + 0.218997f, 0.193565f, 0.981087f, 0.785657f, 0.222167f, -0.975009f, + 0.447272f, -0.945621f, 0.325270f, 0.883070f, 0.742037f, -0.670359f, + 0.761730f, 0.073637f, -0.997285f, 0.024414f, 0.988257f, 0.152799f, + 0.510018f, -0.998020f, -0.062901f, 0.647471f, -0.600567f, -0.799575f, + 0.192142f, 0.355580f, 0.934646f, 0.361578f, -0.645031f, 0.764156f, + 0.532967f, -0.978623f, -0.205660f, 0.229496f, 0.128476f, 0.991713f, + 0.157717f, 0.547881f, 0.836556f, 0.383062f, -0.742005f, 0.670394f, + 0.744640f, -0.033670f, -0.999433f, 0.110597f, 0.768115f, 0.640312f, + 0.858412f, 0.629702f, -0.776837f, 0.487800f, -0.997064f, 0.076577f, + 0.392340f, -0.779801f, 0.626027f, 0.968276f, 0.980201f, -0.198007f, + 0.727062f, -0.143626f, -0.989632f, 0.151125f, 0.582050f, 0.813153f, + 0.077882f, 0.882640f, 0.470050f, 0.396490f, -0.795860f, 0.605481f, + 0.263432f, -0.084294f, 0.996441f, 0.608408f, -0.776852f, -0.629684f, + 0.435554f, -0.919130f, 0.393954f, 0.291020f, -0.254893f, 0.966969f, + 0.668711f, -0.488833f, -0.872377f, 0.823743f, 0.446939f, -0.894564f, + 0.154055f, 0.566984f, 0.823729f, 0.425299f, -0.891859f, 0.452313f, + 0.865003f, 0.661328f, -0.750097f, 0.189456f, 0.371300f, 0.928513f, + 0.503914f, -0.999698f, -0.024590f, 0.241947f, 0.050577f, 0.998720f, + 0.451911f, -0.954699f, 0.297574f, 0.295415f, -0.281492f, 0.959564f, + 0.979507f, 0.991722f, -0.128405f, 0.091066f, 0.840721f, 0.541469f, + 0.868177f, 0.676154f, -0.736760f, 0.931655f, 0.909205f, -0.416348f, + 0.052247f, 0.946599f, 0.322412f, 0.768078f, 0.113344f, -0.993556f, + 0.297856f, -0.296178f, 0.955133f, 0.913100f, 0.854603f, -0.519281f, + 0.106691f, 0.783598f, 0.621268f, 0.572030f, -0.899322f, -0.437286f, + 0.868910f, 0.679537f, -0.733641f, 0.061280f, 0.926785f, 0.375592f, + 0.919448f, 0.874629f, -0.484792f, 0.130373f, 0.682836f, 0.730571f, + 0.246098f, 0.024518f, 0.999699f, 0.740978f, -0.056656f, -0.998394f, + 0.032959f, 0.978633f, 0.205614f, 0.636240f, -0.655447f, -0.755241f, + 0.774670f, 0.154386f, -0.988011f, 0.269535f, -0.122436f, 0.992476f, + 0.051759f, 0.947584f, 0.319507f, 0.875257f, 0.708250f, -0.705962f, + 0.631601f, -0.677178f, -0.735820f, 0.930190f, 0.905335f, -0.424699f, + 0.459480f, -0.967765f, 0.251855f, 0.841810f, 0.545393f, -0.838181f, + 0.314702f, -0.395429f, 0.918496f, 0.685069f, -0.396750f, -0.917927f, + 0.123781f, 0.712501f, 0.701671f, 0.615976f, -0.746041f, -0.665900f, + 0.183597f, 0.405225f, 0.914217f, 0.337896f, -0.524617f, 0.851338f, + 0.926284f, 0.894639f, -0.446789f, 0.810559f, 0.371389f, -0.928477f, + 0.270024f, -0.125481f, 0.992096f, 0.107668f, 0.779771f, 0.626064f, + 0.903090f, 0.820276f, -0.571969f, 0.435798f, -0.919734f, 0.392543f, + 0.567880f, -0.910419f, -0.413688f, 0.964614f, 0.975385f, -0.220507f, + 0.658213f, -0.545272f, -0.838259f, 0.337652f, -0.523311f, 0.852142f, + 0.937270f, 0.923326f, -0.384017f, 0.636484f, -0.654287f, -0.756246f, + 0.197513f, 0.323841f, 0.946111f, 0.055665f, 0.939457f, 0.342666f, + 0.602548f, -0.799503f, -0.600663f, 0.350591f, -0.590787f, 0.806828f, + 0.879164f, 0.725362f, -0.688368f, 0.657481f, -0.549124f, -0.835741f, + 0.761975f, 0.075167f, -0.997171f, 0.848402f, 0.579631f, -0.814879f, + 0.717052f, -0.205543f, -0.978648f, 0.096437f, 0.821972f, 0.569528f, + 0.518807f, -0.993026f, -0.117891f, 0.385992f, -0.754219f, 0.656623f, + 0.941176f, 0.932472f, -0.361242f, 0.298100f, -0.297643f, 0.954677f, + 0.542977f, -0.963762f, -0.266763f, 0.921889f, 0.881963f, -0.471319f, + 0.039307f, 0.969656f, 0.244472f, 0.593027f, -0.833986f, -0.551785f, + 0.887465f, 0.760262f, -0.649617f, 0.749035f, -0.006064f, -0.999982f, + 0.184573f, 0.399608f, 0.916686f, 0.626963f, -0.698333f, -0.715773f, + 0.244144f, 0.036784f, 0.999323f, 0.140871f, 0.633196f, 0.773991f, + 0.523445f, -0.989169f, -0.146780f, 0.445075f, -0.941041f, 0.338294f, + 0.185306f, 0.395385f, 0.918515f, 0.708751f, -0.256283f, -0.966602f, + 0.798596f, 0.300616f, -0.953745f, 0.510262f, -0.997922f, -0.064431f, + 0.260502f, -0.065938f, 0.997824f, 0.730480f, -0.122341f, -0.992488f, + 0.313237f, -0.386959f, 0.922097f, 0.400885f, -0.812273f, 0.583277f, + 0.794446f, 0.275645f, -0.961259f, 0.586923f, -0.854529f, -0.519404f, + 0.452644f, -0.956058f, 0.293178f, 0.372076f, -0.693997f, 0.719978f, + 0.924819f, 0.890489f, -0.455005f, 0.711437f, -0.239937f, -0.970789f, + 0.209476f, 0.251878f, 0.967759f, 0.407721f, -0.836569f, 0.547861f, + 0.293706f, -0.271172f, 0.962531f, 0.125734f, 0.703837f, 0.710362f, + 0.193118f, 0.349839f, 0.936810f, 0.539315f, -0.969645f, -0.244518f, + 0.395514f, -0.792130f, 0.610353f, 0.000732f, 0.999989f, 0.004602f, + 0.494881f, -0.999483f, 0.032161f, 0.986587f, 0.996451f, -0.084175f, + 0.416022f, -0.863993f, 0.503504f, 0.699474f, -0.312161f, -0.950029f, + 0.584482f, -0.862396f, -0.506235f, 0.059571f, 0.930765f, 0.365618f, + 0.479255f, -0.991517f, 0.129974f, 0.683604f, -0.405181f, -0.914236f, + 0.730968f, -0.119296f, -0.992859f, 0.044190f, 0.961701f, 0.274101f, + 0.291264f, -0.256376f, 0.966577f, 0.840101f, 0.536361f, -0.843989f, + 0.454353f, -0.959151f, 0.282895f, 0.240726f, 0.058235f, 0.998303f, + 0.022950f, 0.989622f, 0.143697f, 0.556649f, -0.937320f, -0.348469f, + 0.277348f, -0.170988f, 0.985273f, 0.908705f, 0.839941f, -0.542678f, + 0.443854f, -0.938418f, 0.345501f, 0.816419f, 0.405313f, -0.914178f, + 0.499275f, -0.999990f, 0.004554f, 0.010254f, 0.997925f, 0.064384f, + 0.951186f, 0.953334f, -0.301919f, 0.121584f, 0.722120f, 0.691768f, + 0.359380f, -0.634420f, 0.772989f, 0.983902f, 0.994889f, -0.100976f, + 0.201663f, 0.299061f, 0.954234f, 0.058350f, 0.933542f, 0.358469f, + 0.627451f, -0.696134f, -0.717912f, 0.725109f, -0.155760f, -0.987795f, + 0.116213f, 0.745050f, 0.667008f, 0.370855f, -0.688455f, 0.725279f, + 0.793957f, 0.272695f, -0.962101f, 0.685313f, -0.395341f, -0.918534f, + 0.144533f, 0.615221f, 0.788355f, 0.346441f, -0.569548f, 0.821958f, + 0.534188f, -0.977017f, -0.213160f, 0.393072f, -0.782674f, 0.622432f, + 0.831556f, 0.490296f, -0.871556f, 0.691173f, -0.361264f, -0.932464f, + 0.344244f, -0.558146f, 0.829743f, 0.996109f, 0.999701f, -0.024446f, + 0.852064f, 0.598226f, -0.801327f, 0.389899f, -0.770107f, 0.637915f, + 0.047852f, 0.955140f, 0.296155f, 0.971695f, 0.984227f, -0.176913f, + 0.194339f, 0.342643f, 0.939466f, 0.448249f, -0.947599f, 0.319461f, + 0.021973f, 0.990485f, 0.137622f, 0.543954f, -0.962107f, -0.272672f, + 0.889662f, 0.769158f, -0.639059f, 0.093996f, 0.830611f, 0.556853f, + 0.286381f, -0.226605f, 0.973987f, 0.834974f, 0.508899f, -0.860826f, + 0.153323f, 0.570769f, 0.821111f, 0.109133f, 0.773976f, 0.633215f, + 0.510506f, -0.997822f, -0.065962f, 0.588632f, -0.848902f, -0.528550f, + 0.739757f, -0.064312f, -0.997930f, 0.802258f, 0.322480f, -0.946576f, + 0.658701f, -0.542698f, -0.839928f, 0.961929f, 0.971526f, -0.236934f, + 0.731456f, -0.116249f, -0.993220f, 0.901381f, 0.814087f, -0.580744f, + 0.251957f, -0.012296f, 0.999924f, 0.797131f, 0.291825f, -0.956472f, + 0.087648f, 0.852155f, 0.523290f, 0.301518f, -0.318075f, 0.948065f, + 0.159182f, 0.540159f, 0.841563f, 0.873793f, 0.701722f, -0.712451f, + 0.399176f, -0.805963f, 0.591966f, 0.959976f, 0.968545f, -0.248838f, + 0.145998f, 0.607939f, 0.793984f, 0.633555f, -0.668097f, -0.744074f, + 0.764172f, 0.088927f, -0.996038f, 0.196048f, 0.332536f, 0.943091f, + 0.080568f, 0.874583f, 0.484876f, 0.708995f, -0.254800f, -0.966994f, + 0.811292f, 0.375658f, -0.926758f, 0.407965f, -0.837409f, 0.546577f, + 0.753429f, 0.021546f, -0.999768f, 0.103029f, 0.797685f, 0.603074f, + 0.692882f, -0.351231f, -0.936289f, 0.243900f, 0.038317f, 0.999266f, + 0.180179f, 0.424764f, 0.905304f, 0.554696f, -0.941526f, -0.336940f, + 0.313725f, -0.389786f, 0.920906f, 0.227298f, 0.142155f, 0.989844f, + 0.474372f, -0.987064f, 0.160328f, 0.583261f, -0.866253f, -0.499606f, + 0.785168f, 0.219175f, -0.975686f, 0.879896f, 0.728522f, -0.685022f, + 0.455818f, -0.961714f, 0.274055f, 0.229252f, 0.129997f, 0.991514f, + 0.764660f, 0.091982f, -0.995761f, 0.481697f, -0.993395f, 0.114749f, + 0.266850f, -0.105673f, 0.994401f, 0.958511f, 0.966214f, -0.257742f, + 0.429938f, -0.904662f, 0.426131f, 0.022217f, 0.990273f, 0.139141f, + 0.925551f, 0.892574f, -0.450902f, 0.772717f, 0.142250f, -0.989831f, + 0.467781f, -0.979579f, 0.201061f, 0.598154f, -0.815781f, -0.578361f, + 0.003906f, 0.999699f, 0.024542f, 0.264408f, -0.090407f, 0.995905f, + 0.562509f, -0.923859f, -0.382733f, 0.148440f, 0.595688f, 0.803216f, + 0.325200f, -0.455111f, 0.890435f, 0.674815f, -0.455026f, -0.890478f, + 0.594491f, -0.828872f, -0.559438f, 0.825208f, 0.455154f, -0.890413f, + 0.944106f, 0.938964f, -0.344016f, 0.648203f, -0.596881f, -0.802330f, + 0.167483f, 0.495551f, 0.868579f, 0.688975f, -0.374103f, -0.927387f, + 0.974624f, 0.987316f, -0.158766f, 0.532723f, -0.978938f, -0.204159f, + 0.614267f, -0.753148f, -0.657851f, 0.343267f, -0.553044f, 0.833152f, + 0.956069f, 0.962146f, -0.272533f, 0.844495f, 0.559458f, -0.828859f, + 0.027344f, 0.985277f, 0.170964f, 0.375738f, -0.710379f, 0.703820f, + 0.264164f, -0.088879f, 0.996042f, 0.068605f, 0.908525f, 0.417830f, + 0.167727f, 0.494218f, 0.869338f, 0.587411f, -0.852931f, -0.522023f, + 0.344732f, -0.560689f, 0.828027f, 0.649668f, -0.589471f, -0.807790f, + 0.535164f, -0.975691f, -0.219151f, 0.938735f, 0.926821f, -0.375503f, + 0.750500f, 0.003140f, -0.999995f, 0.235111f, 0.093414f, 0.995627f, + 0.556893f, -0.936785f, -0.349906f, 0.324468f, -0.451009f, 0.892520f, + 0.823987f, 0.448311f, -0.893878f, 0.486824f, -0.996575f, 0.082694f, + 0.366949f, -0.670448f, 0.741957f, 0.917494f, 0.868614f, -0.495489f, + 0.516854f, -0.994398f, -0.105696f, 0.604746f, -0.791134f, -0.611643f, + 0.979263f, 0.991524f, -0.129926f, 0.153567f, 0.569508f, 0.821986f, + 0.871351f, 0.690711f, -0.723131f, 0.525643f, -0.987048f, -0.160422f, + 0.325689f, -0.457841f, 0.889034f, 0.997574f, 0.999884f, -0.015244f, + 0.775891f, 0.161960f, -0.986797f, 0.629404f, -0.687272f, -0.726401f, + 0.424079f, -0.888364f, 0.459140f, 0.690684f, -0.364123f, -0.931351f, + 0.901625f, 0.814976f, -0.579494f, 0.161379f, 0.528489f, 0.848940f, + 0.652842f, -0.573246f, -0.819383f, 0.331548f, -0.490254f, 0.871580f, + 0.017578f, 0.993907f, 0.110224f, 0.569833f, -0.905274f, -0.424829f, + 0.991958f, 0.998724f, -0.050505f, 0.068360f, 0.909165f, 0.416436f, + 0.648936f, -0.593182f, -0.805068f, 0.196292f, 0.331089f, 0.943600f, + 0.560800f, -0.927915f, -0.372791f, 0.713878f, -0.225017f, -0.974355f, + 0.080079f, 0.876066f, 0.482190f, 0.285405f, -0.220624f, 0.975359f, + 0.116701f, 0.743000f, 0.669291f, 0.209720f, 0.250394f, 0.968144f, + 0.894789f, 0.789342f, -0.613954f, 0.728283f, -0.136031f, -0.990705f, + 0.638193f, -0.646129f, -0.763228f, 0.463630f, -0.974003f, 0.226535f, + 0.766857f, 0.105720f, -0.994396f, 0.880140f, 0.729572f, -0.683904f, + 0.123537f, 0.713577f, 0.700577f, 0.366217f, -0.667026f, 0.745034f, + 0.753674f, 0.023080f, -0.999734f, 0.228275f, 0.136079f, 0.990698f, + 0.335698f, -0.512814f, 0.858500f, 0.477302f, -0.989848f, 0.142132f, + 0.057862f, 0.934637f, 0.355603f, 0.217044f, 0.205590f, 0.978638f, + 0.800793f, 0.313755f, -0.949504f, 0.429450f, -0.903350f, 0.428904f, + 0.680186f, -0.424721f, -0.905324f, 0.090578f, 0.842378f, 0.538887f, + 0.466316f, -0.977687f, 0.210068f, 0.565682f, -0.916043f, -0.401080f, + 0.868421f, 0.677283f, -0.735722f, 0.511238f, -0.997508f, -0.070553f, + 0.434821f, -0.917308f, 0.398179f, 0.821546f, 0.434547f, -0.900649f, + 0.047120f, 0.956493f, 0.291757f, 0.208988f, 0.254846f, 0.966982f, + 0.848646f, 0.580880f, -0.813989f, 0.438727f, -0.926803f, 0.375547f, + 0.014893f, 0.995625f, 0.093438f, 0.629648f, -0.686156f, -0.727454f, + 0.782483f, 0.202681f, -0.979245f, 0.075929f, 0.888342f, 0.459183f, + 0.211185f, 0.241472f, 0.970408f, 0.588876f, -0.848090f, -0.529852f, + 0.003174f, 0.999801f, 0.019941f, 0.861341f, 0.643895f, -0.765114f, + 0.131838f, 0.676083f, 0.736825f, 0.305669f, -0.342688f, 0.939449f, + 0.357427f, -0.624886f, 0.780716f, 0.481941f, -0.993569f, 0.113225f, + 0.222416f, 0.172452f, 0.985018f, 0.657725f, -0.547841f, -0.836582f, + 0.025391f, 0.987301f, 0.158861f, 0.390143f, -0.771084f, 0.636733f, + 0.126955f, 0.698368f, 0.715739f, 0.935073f, 0.917936f, -0.396728f, + 0.055421f, 0.939982f, 0.341224f, 0.803479f, 0.329731f, -0.944075f, + 0.089845f, 0.844849f, 0.535005f, 0.531258f, -0.980775f, -0.195140f, + 0.252201f, -0.013830f, 0.999904f, 0.413581f, -0.856168f, 0.516698f, + 0.822278f, 0.438687f, -0.898640f, 0.675547f, -0.450923f, -0.892563f, + 0.168704f, 0.488875f, 0.872354f, 0.845960f, 0.567063f, -0.823675f, + 0.406256f, -0.831491f, 0.555538f, 0.308843f, -0.361353f, 0.932429f, + 0.814710f, 0.395473f, -0.918478f, 0.878431f, 0.722186f, -0.691698f, + 0.501228f, -0.999970f, -0.007718f, 0.657237f, -0.550405f, -0.834898f, + 0.956802f, 0.963390f, -0.268102f, 0.798352f, 0.299153f, -0.954205f, + 0.413092f, -0.854579f, 0.519322f, 0.094972f, 0.827179f, 0.561939f, + 0.939956f, 0.929674f, -0.368383f, 0.228519f, 0.134559f, 0.990906f, + 0.019287f, 0.992666f, 0.120890f, 0.407233f, -0.834884f, 0.550425f, + 0.494148f, -0.999324f, 0.036760f, 0.283696f, -0.210138f, 0.977672f, + 0.072999f, 0.896643f, 0.442754f, 0.522469f, -0.990051f, -0.140708f, + 0.859388f, 0.634457f, -0.772958f, 0.409186f, -0.841576f, 0.540138f, + 0.912123f, 0.851401f, -0.524515f, 0.757824f, 0.049140f, -0.998792f, + 0.005615f, 0.999378f, 0.035275f, 0.261234f, -0.070530f, 0.997510f, + 0.900893f, 0.812301f, -0.583238f, 0.316655f, -0.406671f, 0.913575f, + 0.226810f, 0.145191f, 0.989404f, 0.980240f, 0.992302f, -0.123840f, + 0.134524f, 0.663555f, 0.748128f, 0.690440f, -0.365551f, -0.930791f, + 0.289555f, -0.245982f, 0.969274f, 0.751965f, 0.012344f, -0.999924f, + 0.965835f, 0.977048f, -0.213020f, 0.384527f, -0.748144f, 0.663537f, + 0.140139f, 0.636752f, 0.771069f, 0.722911f, -0.169382f, -0.985550f, + 0.513680f, -0.996308f, -0.085846f, 0.353033f, -0.603094f, 0.797670f, + 0.920424f, 0.877588f, -0.479416f, 0.453376f, -0.957397f, 0.288775f, + 0.279545f, -0.184574f, 0.982819f, 0.985367f, 0.995776f, -0.091815f, + 0.698497f, -0.317985f, -0.948096f, 0.421637f, -0.881216f, 0.472713f, + 0.250248f, -0.001558f, 0.999999f, 0.667979f, -0.492842f, -0.870119f, + 0.741711f, -0.052061f, -0.998644f, 0.048585f, 0.953767f, 0.300548f, + 0.790539f, 0.251971f, -0.967735f, 0.578378f, -0.881171f, -0.472798f, + 0.891371f, 0.775976f, -0.630763f, 0.469978f, -0.982261f, 0.187518f, + 0.728038f, -0.137551f, -0.990495f, 0.276127f, -0.163426f, 0.986556f, + 0.591562f, -0.839029f, -0.544086f, 0.852552f, 0.600682f, -0.799488f, + 0.383795f, -0.745082f, 0.666973f, 0.750988f, 0.006208f, -0.999981f, + 0.952895f, 0.956521f, -0.291665f, 0.131106f, 0.679467f, 0.733706f, + 0.895277f, 0.791222f, -0.611529f, 0.284672f, -0.216133f, 0.976364f, + 0.358160f, -0.628472f, 0.777832f, 0.517098f, -0.994235f, -0.107222f, + 0.904555f, 0.825505f, -0.564395f, 0.121828f, 0.721058f, 0.692875f, + 0.617685f, -0.738847f, -0.673873f, 0.225589f, 0.152776f, 0.988261f, + 0.368414f, -0.677248f, 0.735755f, 0.155520f, 0.559378f, 0.828912f, + 0.569345f, -0.906573f, -0.422050f, 0.304448f, -0.335473f, 0.942050f, + 0.513191f, -0.996567f, -0.082789f, 0.355474f, -0.615258f, 0.788325f, + 0.824231f, 0.449682f, -0.893189f, 0.535897f, -0.974672f, -0.223639f, + 0.624033f, -0.711390f, -0.702797f, 0.920668f, 0.878322f, -0.478070f, + 0.183352f, 0.406627f, 0.913594f, 0.697520f, -0.323796f, -0.946127f, + 0.993668f, 0.999209f, -0.039778f, 0.615000f, -0.750113f, -0.661310f, + 0.133791f, 0.666990f, 0.745066f, 0.720714f, -0.182972f, -0.983118f, + 0.301030f, -0.315165f, 0.949037f, 0.640146f, -0.636715f, -0.771100f, + 0.496834f, -0.999802f, 0.019893f, 0.576181f, -0.887614f, -0.460588f, + 0.168460f, 0.490212f, 0.871603f, 0.722667f, -0.170894f, -0.985289f, + 0.623056f, -0.715689f, -0.698419f, 0.775647f, 0.160446f, -0.987045f, + 0.346685f, -0.570808f, 0.821084f, 0.897719f, 0.800509f, -0.599320f, + 0.612558f, -0.760169f, -0.649726f, 0.098390f, 0.814921f, 0.579572f, + 0.555673f, -0.939441f, -0.342711f, 0.479011f, -0.991317f, 0.131495f, + 0.678965f, -0.431652f, -0.902040f, 0.266606f, -0.104147f, 0.994562f, + 0.973892f, 0.986575f, -0.163308f, 0.184085f, 0.402418f, 0.915456f, + 0.116457f, 0.744026f, 0.668150f, 0.656992f, -0.551685f, -0.834052f, + 0.847181f, 0.573364f, -0.819301f, 0.524666f, -0.988014f, -0.154363f, + 0.166018f, 0.503525f, 0.863981f, 0.778820f, 0.180096f, -0.983649f, + 0.941421f, 0.933025f, -0.359811f, 0.561044f, -0.927342f, -0.374214f, + 0.108156f, 0.777847f, 0.628454f, 0.913588f, 0.856193f, -0.516657f, + 0.427741f, -0.898692f, 0.438579f, 0.289799f, -0.247469f, 0.968896f, + 0.161868f, 0.525882f, 0.850558f, 0.839368f, 0.532471f, -0.846448f, + 0.534432f, -0.976689f, -0.214659f, 0.198001f, 0.320937f, 0.947100f, + 0.341802f, -0.545352f, 0.838207f, 0.494636f, -0.999432f, 0.033694f, + 0.025147f, 0.987544f, 0.157346f, 0.304692f, -0.336917f, 0.941534f, + 0.703868f, -0.285813f, -0.958285f, 0.465339f, -0.976379f, 0.216063f, + 0.550057f, -0.950945f, -0.309359f, 0.089357f, 0.846486f, 0.532410f, + 0.720470f, -0.184480f, -0.982836f, 0.600839f, -0.805906f, -0.592043f, + 0.006592f, 0.999142f, 0.041406f, 0.740490f, -0.059719f, -0.998215f, + 0.474861f, -0.987551f, 0.157298f, 0.046632f, 0.957383f, 0.288821f, + 0.981460f, 0.993223f, -0.116225f, 0.441657f, -0.933559f, 0.358424f, + 0.854994f, 0.612875f, -0.790180f, 0.747570f, -0.015268f, -0.999883f, + 0.031250f, 0.980785f, 0.195093f, 0.677989f, -0.437179f, -0.899375f, + 0.163577f, 0.516718f, 0.856155f, 0.277592f, -0.172499f, 0.985010f, + 0.717296f, -0.204042f, -0.978962f, 0.083009f, 0.867042f, 0.498235f, + 0.566415f, -0.914188f, -0.405291f, 0.794934f, 0.278593f, -0.960409f, + 0.436530f, -0.921530f, 0.388306f, 0.016114f, 0.994879f, 0.101071f, + 0.809339f, 0.364257f, -0.931298f, 0.554452f, -0.942042f, -0.335495f, + 0.186770f, 0.386914f, 0.922116f, 0.369146f, -0.680627f, 0.732630f, + 0.985611f, 0.995916f, -0.090287f, 0.119387f, 0.731602f, 0.681732f, + 0.862562f, 0.649744f, -0.760153f, 0.395026f, -0.790253f, 0.612780f, + 0.070069f, 0.904641f, 0.426174f, 0.495125f, -0.999531f, 0.030627f, + 0.199466f, 0.312207f, 0.950014f, 0.012696f, 0.996820f, 0.079684f, + 0.404791f, -0.826343f, 0.563167f, 0.241215f, 0.055172f, 0.998477f, + 0.862806f, 0.650909f, -0.759155f, 0.322271f, -0.438644f, 0.898661f, + 0.904311f, 0.824638f, -0.565660f, 0.040284f, 0.968138f, 0.250417f, + 0.600351f, -0.807719f, -0.589568f, 0.408942f, -0.840747f, 0.541429f, + 0.880873f, 0.732712f, -0.680539f, 0.735119f, -0.093366f, -0.995632f, + 0.036378f, 0.973992f, 0.226582f, 0.389166f, -0.767163f, 0.641452f, + 0.327886f, -0.470071f, 0.882629f, 0.618173f, -0.736776f, -0.676136f, + 0.054200f, 0.942571f, 0.334005f, 0.456794f, -0.963378f, 0.268149f, + 0.827649f, 0.468759f, -0.883326f, 0.193362f, 0.348401f, 0.937345f, + 0.634531f, -0.663519f, -0.748160f, 0.957534f, 0.964614f, -0.263666f, + 0.365728f, -0.664737f, 0.747077f, 0.079591f, 0.877542f, 0.479500f, + 0.677012f, -0.442689f, -0.896675f, 0.917739f, 0.869373f, -0.494156f, + 0.114504f, 0.752170f, 0.658970f, 0.645029f, -0.612761f, -0.790268f, + 0.987808f, 0.997067f, -0.076529f, 0.219242f, 0.192060f, 0.981383f, + 0.613291f, -0.757170f, -0.653217f, 0.043214f, 0.963365f, 0.268195f, + 0.767102f, 0.107246f, -0.994233f, 0.200443f, 0.306372f, 0.951912f, + 0.967788f, 0.979588f, -0.201014f, 0.446784f, -0.944619f, 0.328169f, + 0.242924f, 0.044448f, 0.999012f, 0.936294f, 0.920952f, -0.389676f, + 0.343023f, -0.551765f, 0.833999f, 0.780285f, 0.189142f, -0.981950f, + 0.670420f, -0.479437f, -0.877576f, 0.259525f, -0.059814f, 0.998210f, + 0.067872f, 0.910439f, 0.413644f, 0.614755f, -0.751126f, -0.660159f, + 0.199954f, 0.309291f, 0.950968f, 0.887221f, 0.759265f, -0.650782f, + 0.432868f, -0.912352f, 0.409406f, 0.981704f, 0.993400f, -0.114701f, + 0.362554f, -0.649708f, 0.760184f, 0.852796f, 0.601908f, -0.798566f, + 0.225345f, 0.154292f, 0.988025f, 0.320317f, -0.427583f, 0.903976f, + 0.888441f, 0.764234f, -0.644939f, 0.376715f, -0.714684f, 0.699448f, + 0.253422f, -0.021498f, 0.999769f, 0.933608f, 0.914246f, -0.405159f, + 0.090822f, 0.841550f, 0.540179f, 0.828382f, 0.472819f, -0.881160f, + 0.694347f, -0.342598f, -0.939482f, 0.452399f, -0.955607f, 0.294644f, + 0.789075f, 0.243054f, -0.970013f, 0.537850f, -0.971854f, -0.235583f, + 0.917006f, 0.867090f, -0.498151f, 0.662608f, -0.521921f, -0.852994f, + 0.837659f, 0.523352f, -0.852117f, 0.455329f, -0.960869f, 0.277004f, + 0.940688f, 0.931360f, -0.364101f, 0.704112f, -0.284343f, -0.958723f, + 0.176272f, 0.446854f, 0.894607f, 0.641611f, -0.629590f, -0.776927f, + 0.110109f, 0.770076f, 0.637952f, 0.757580f, 0.047608f, -0.998866f, + 0.803235f, 0.328283f, -0.944580f, 0.310063f, -0.368494f, 0.929630f, + 0.492927f, -0.999013f, 0.044424f, 0.239261f, 0.067421f, 0.997725f, + 0.576669f, -0.886197f, -0.463309f, 0.806653f, 0.348491f, -0.937312f, + 0.101320f, 0.804115f, 0.594474f, 0.219486f, 0.190554f, 0.981677f, + 0.882826f, 0.741008f, -0.671496f, 0.374273f, -0.703871f, 0.710328f, + 0.523690f, -0.988943f, -0.148297f, 0.259037f, -0.056752f, 0.998388f, + 0.714611f, -0.220531f, -0.975380f, 0.033692f, 0.977677f, 0.210115f, + 0.605234f, -0.789254f, -0.614067f, 0.805676f, 0.342733f, -0.939433f, + 0.247318f, 0.016849f, 0.999858f, 0.409918f, -0.844053f, 0.536260f, + 0.769299f, 0.120961f, -0.992657f, 0.880629f, 0.731667f, -0.681662f, + 0.436286f, -0.920934f, 0.389720f, 0.148928f, 0.593221f, 0.805040f, + 0.509041f, -0.998387f, -0.056776f, 0.934829f, 0.917327f, -0.398135f, + 0.370611f, -0.687341f, 0.726335f, 0.644541f, -0.615183f, -0.788384f, + 0.809827f, 0.367113f, -0.930177f, 0.318364f, -0.416457f, 0.909155f, + 0.147951f, 0.598149f, 0.801385f, 0.545174f, -0.959988f, -0.280043f, + 0.836439f, 0.516800f, -0.856106f, 0.178958f, 0.431695f, 0.902020f, + 0.521492f, -0.990896f, -0.134630f, 0.719005f, -0.193518f, -0.981097f, + 0.394049f, -0.786479f, 0.617618f, 0.948501f, 0.948104f, -0.317962f, + 0.484627f, -0.995338f, 0.096444f, 0.784924f, 0.217678f, -0.976021f, + 0.590341f, -0.843178f, -0.537635f, 0.113527f, 0.756199f, 0.654342f, + 0.770031f, 0.125528f, -0.992090f, 0.457771f, -0.965005f, 0.262232f, + 0.040772f, 0.967365f, 0.253386f, 0.634043f, -0.665811f, -0.746121f, + 0.511971f, -0.997173f, -0.075143f, 0.160159f, 0.534985f, 0.844862f, + 0.675792f, -0.449553f, -0.893253f, 0.469490f, -0.981681f, 0.190531f, + 0.603281f, -0.796730f, -0.604336f, 0.039063f, 0.970030f, 0.242984f, + 0.282475f, -0.202634f, 0.979255f, 0.210452f, 0.245935f, 0.969286f, + 0.336431f, -0.516759f, 0.856131f, 0.023926f, 0.988721f, 0.149767f, + 0.265385f, -0.096516f, 0.995331f, 0.155276f, 0.560649f, 0.828053f, + 0.307378f, -0.352756f, 0.935715f, 0.580819f, -0.873815f, -0.486259f, + 0.765393f, 0.096563f, -0.995327f, 0.062501f, 0.923877f, 0.382689f, + 0.813489f, 0.388417f, -0.921484f, 0.526131f, -0.986552f, -0.163450f, + 0.373297f, -0.699499f, 0.714634f, 0.216800f, 0.207091f, 0.978322f, + 0.559579f, -0.930747f, -0.365663f, 0.070314f, 0.903986f, 0.427561f, + 0.703380f, -0.288752f, -0.957404f, 0.143801f, 0.618842f, 0.785515f, + 0.903334f, 0.821152f, -0.570710f, 0.441169f, -0.932455f, 0.361286f, + 0.962905f, 0.972961f, -0.230968f, 0.684092f, -0.402375f, -0.915475f, + 0.737560f, -0.078083f, -0.996947f, 0.295903f, -0.284435f, 0.958695f, + 0.990494f, 0.998217f, -0.059695f, 0.128664f, 0.690642f, 0.723197f, + 0.777111f, 0.169524f, -0.985526f, 0.324712f, -0.452377f, 0.891827f, + 0.509773f, -0.998115f, -0.061370f, 0.447761f, -0.946615f, 0.322367f, + 0.969497f, 0.981690f, -0.190484f, 0.002686f, 0.999858f, 0.016873f, + 0.546883f, -0.956925f, -0.290335f, 0.267094f, -0.107198f, 0.994238f, + 0.713390f, -0.228005f, -0.973660f, 0.800061f, 0.309382f, -0.950938f, + 0.323247f, -0.444150f, 0.895952f, 0.845716f, 0.565799f, -0.824543f, + 0.260258f, -0.064408f, 0.997924f, 0.418463f, -0.871615f, 0.490192f, + 0.057374f, 0.935724f, 0.352734f, 0.877211f, 0.716860f, -0.697217f, + 0.701427f, -0.300479f, -0.953788f, 0.630625f, -0.681680f, -0.731651f, + 0.408453f, -0.839082f, 0.544006f, 0.287114f, -0.231085f, 0.972934f, + 0.100099f, 0.808651f, 0.588289f, 0.919692f, 0.875372f, -0.483450f, + 0.139895f, 0.637934f, 0.770091f, 0.339605f, -0.533729f, 0.845656f, + 0.239994f, 0.062829f, 0.998024f, 0.049317f, 0.952374f, 0.304934f, + 0.310796f, -0.372769f, 0.927924f, 0.521004f, -0.991304f, -0.131590f +}; + #endif /* __EEVEE_LUT_H__ */ diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c new file mode 100644 index 00000000000..23f87a41b24 --- /dev/null +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -0,0 +1,434 @@ +/* + * Copyright 2016, Blender Foundation. + * + * 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. + * + * Contributor(s): Blender Institute + * + */ + +/** \file eevee_materials.c + * \ingroup draw_engine + */ + +#include "DRW_render.h" + +#include "DNA_world_types.h" + +#include "BLI_dynstr.h" + +#include "GPU_material.h" + +#include "eevee_engine.h" +#include "eevee_lut.h" +#include "eevee_private.h" + +#define SHADER_DEFINES \ + "#define EEVEE_ENGINE\n" \ + "#define MAX_LIGHT " STRINGIFY(MAX_LIGHT) "\n" \ + "#define MAX_SHADOW_CUBE " STRINGIFY(MAX_SHADOW_CUBE) "\n" \ + "#define MAX_SHADOW_MAP " STRINGIFY(MAX_SHADOW_MAP) "\n" \ + "#define MAX_SHADOW_CASCADE " STRINGIFY(MAX_SHADOW_CASCADE) "\n" \ + "#define MAX_CASCADE_NUM " STRINGIFY(MAX_CASCADE_NUM) "\n" + +/* World shader variations */ +enum { + VAR_WORLD_BACKGROUND, + VAR_WORLD_PROBE, +}; + +/* Material shader variations */ +enum { + VAR_MAT_MESH = (1 << 0), + VAR_MAT_PROBE = (1 << 1), +}; + +/* *********** STATIC *********** */ +static struct { + char *frag_shader_lib; + + struct GPUShader *default_lit; + struct GPUShader *default_lit_flat; + + struct GPUShader *default_background; + + /* 64*64 array texture containing all LUTs and other utilitarian arrays. + * Packing enables us to same precious textures slots. */ + struct GPUTexture *util_tex; +} e_data = {NULL}; /* Engine data */ + +extern char datatoc_default_frag_glsl[]; +extern char datatoc_default_world_frag_glsl[]; +extern char datatoc_ltc_lib_glsl[]; +extern char datatoc_bsdf_lut_frag_glsl[]; +extern char datatoc_bsdf_common_lib_glsl[]; +extern char datatoc_bsdf_direct_lib_glsl[]; +extern char datatoc_bsdf_sampling_lib_glsl[]; +extern char datatoc_lit_surface_frag_glsl[]; +extern char datatoc_lit_surface_vert_glsl[]; +extern char datatoc_shadow_frag_glsl[]; +extern char datatoc_shadow_geom_glsl[]; +extern char datatoc_shadow_vert_glsl[]; +extern char datatoc_probe_filter_frag_glsl[]; +extern char datatoc_probe_sh_frag_glsl[]; +extern char datatoc_probe_geom_glsl[]; +extern char datatoc_probe_vert_glsl[]; +extern char datatoc_background_vert_glsl[]; + +extern Material defmaterial; +extern GlobalsUboStorage ts; + +/* *********** FUNCTIONS *********** */ + +#if 0 /* Used only to generate the LUT values */ +static struct GPUTexture *create_ggx_lut_texture(int UNUSED(w), int UNUSED(h)) +{ + struct GPUTexture *tex; + struct GPUFrameBuffer *fb = NULL; + static float samples_ct = 8192.0f; + static float inv_samples_ct = 1.0f / 8192.0f; + + char *lib_str = NULL; + + DynStr *ds_vert = BLI_dynstr_new(); + BLI_dynstr_append(ds_vert, datatoc_bsdf_common_lib_glsl); + BLI_dynstr_append(ds_vert, datatoc_bsdf_sampling_lib_glsl); + lib_str = BLI_dynstr_get_cstring(ds_vert); + BLI_dynstr_free(ds_vert); + + struct GPUShader *sh = DRW_shader_create_with_lib( + datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, datatoc_bsdf_lut_frag_glsl, lib_str, + "#define HAMMERSLEY_SIZE 8192\n" + "#define BRDF_LUT_SIZE 64\n" + "#define NOISE_SIZE 64\n"); + + DRWPass *pass = DRW_pass_create("Probe Filtering", DRW_STATE_WRITE_COLOR); + DRWShadingGroup *grp = DRW_shgroup_create(sh, pass); + DRW_shgroup_uniform_float(grp, "sampleCount", &samples_ct, 1); + DRW_shgroup_uniform_float(grp, "invSampleCount", &inv_samples_ct, 1); + DRW_shgroup_uniform_texture(grp, "texHammersley", e_data.hammersley); + DRW_shgroup_uniform_texture(grp, "texJitter", e_data.jitter); + + struct Batch *geom = DRW_cache_fullscreen_quad_get(); + DRW_shgroup_call_add(grp, geom, NULL); + + float *texels = MEM_mallocN(sizeof(float[2]) * w * h, "lut"); + + tex = DRW_texture_create_2D(w, h, DRW_TEX_RG_16, DRW_TEX_FILTER, (float *)texels); + + DRWFboTexture tex_filter = {&tex, DRW_TEX_RG_16, DRW_TEX_FILTER}; + DRW_framebuffer_init(&fb, &draw_engine_eevee_type, w, h, &tex_filter, 1); + + DRW_framebuffer_bind(fb); + DRW_draw_pass(pass); + + float *data = MEM_mallocN(sizeof(float[3]) * w * h, "lut"); + glReadBuffer(GL_COLOR_ATTACHMENT0); + glReadPixels(0, 0, w, h, GL_RGB, GL_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]); + } + printf("}"); + + MEM_freeN(texels); + MEM_freeN(data); + + return tex; +} +#endif + +void EEVEE_materials_init(void) +{ + if (!e_data.frag_shader_lib) { + char *frag_str = NULL; + + /* Shaders */ + DynStr *ds_frag = BLI_dynstr_new(); + BLI_dynstr_append(ds_frag, datatoc_bsdf_common_lib_glsl); + BLI_dynstr_append(ds_frag, datatoc_ltc_lib_glsl); + BLI_dynstr_append(ds_frag, datatoc_bsdf_direct_lib_glsl); + BLI_dynstr_append(ds_frag, datatoc_lit_surface_frag_glsl); + e_data.frag_shader_lib = BLI_dynstr_get_cstring(ds_frag); + BLI_dynstr_free(ds_frag); + + ds_frag = BLI_dynstr_new(); + BLI_dynstr_append(ds_frag, e_data.frag_shader_lib); + BLI_dynstr_append(ds_frag, datatoc_default_frag_glsl); + frag_str = BLI_dynstr_get_cstring(ds_frag); + BLI_dynstr_free(ds_frag); + + e_data.default_background = DRW_shader_create_fullscreen( + datatoc_default_world_frag_glsl, NULL); + + e_data.default_lit = DRW_shader_create( + datatoc_lit_surface_vert_glsl, NULL, frag_str, + SHADER_DEFINES + "#define MESH_SHADER\n"); + e_data.default_lit_flat = DRW_shader_create( + datatoc_lit_surface_vert_glsl, NULL, frag_str, + SHADER_DEFINES + "#define MESH_SHADER\n" + "#define USE_FLAT_NORMAL\n"); + + MEM_freeN(frag_str); + + /* Textures */ + const int layers = 3; + float (*texels)[4] = MEM_mallocN(sizeof(float[4]) * 64 * 64 * layers, "utils texels"); + float (*texels_layer)[4] = texels; + + /* Copy ltc_mat_ggx into 1st layer */ + memcpy(texels_layer, ltc_mat_ggx, sizeof(float[4]) * 64 * 64); + texels_layer += 64 * 64; + + /* Copy bsdf_split_sum_ggx into 2nd layer red and green channels. + Copy ltc_mag_ggx into 2nd layer blue 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][2] = ltc_mag_ggx[i]; + } + texels_layer += 64 * 64; + + /* Copy ltc_mag_ggx into 2nd layer blue channel */ + for (int i = 0; i < 64 * 64; i++) { + texels_layer[i][0] = blue_noise[i*3 + 0]; + texels_layer[i][1] = blue_noise[i*3 + 1]; + texels_layer[i][2] = blue_noise[i*3 + 2]; + } + + e_data.util_tex = DRW_texture_create_2D_array(64, 64, layers, DRW_TEX_RGBA_16, DRW_TEX_FILTER, (float *)texels); + MEM_freeN(texels); + } +} + +struct GPUMaterial *EEVEE_material_world_probe_get(struct Scene *scene, World *wo) +{ + return GPU_material_from_nodetree( + scene, wo->nodetree, &wo->gpumaterial, &DRW_engine_viewport_eevee_type, + VAR_WORLD_PROBE, + datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, e_data.frag_shader_lib, + SHADER_DEFINES "#define PROBE_CAPTURE\n"); +} + +struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, World *wo) +{ + return GPU_material_from_nodetree( + scene, wo->nodetree, &wo->gpumaterial, &DRW_engine_viewport_eevee_type, + VAR_WORLD_BACKGROUND, + datatoc_background_vert_glsl, NULL, e_data.frag_shader_lib, + SHADER_DEFINES "#define WORLD_BACKGROUND\n"); +} + +struct GPUMaterial *EEVEE_material_mesh_probe_get(struct Scene *scene, Material *ma) +{ + return GPU_material_from_nodetree( + scene, ma->nodetree, &ma->gpumaterial, &DRW_engine_viewport_eevee_type, + VAR_MAT_MESH | VAR_MAT_PROBE, + datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, e_data.frag_shader_lib, + SHADER_DEFINES "#define MESH_SHADER\n" "#define PROBE_CAPTURE\n"); +} + +struct GPUMaterial *EEVEE_material_mesh_get(struct Scene *scene, Material *ma) +{ + return GPU_material_from_nodetree( + scene, ma->nodetree, &ma->gpumaterial, &DRW_engine_viewport_eevee_type, + VAR_MAT_MESH, + datatoc_lit_surface_vert_glsl, NULL, e_data.frag_shader_lib, + SHADER_DEFINES "#define MESH_SHADER\n"); +} + +static void add_standard_uniforms(DRWShadingGroup *shgrp, EEVEE_SceneLayerData *sldata) +{ + DRW_shgroup_uniform_block(shgrp, "light_block", sldata->light_ubo); + DRW_shgroup_uniform_block(shgrp, "shadow_block", sldata->shadow_ubo); + DRW_shgroup_uniform_int(shgrp, "light_count", &sldata->lamps->num_light, 1); + DRW_shgroup_uniform_texture(shgrp, "utilTex", e_data.util_tex); + DRW_shgroup_uniform_buffer(shgrp, "probeCubes", &sldata->probe_pool); + DRW_shgroup_uniform_float(shgrp, "lodMax", &sldata->probes->lodmax, 1); + DRW_shgroup_uniform_buffer(shgrp, "shadowCubes", &sldata->shadow_depth_cube_pool); + DRW_shgroup_uniform_buffer(shgrp, "shadowCascades", &sldata->shadow_depth_cascade_pool); +} + +void EEVEE_materials_cache_init(EEVEE_Data *vedata) +{ + EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; + EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; + EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get(); + + { + psl->background_pass = DRW_pass_create("Background Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR); + + struct Batch *geom = DRW_cache_fullscreen_quad_get(); + DRWShadingGroup *grp = NULL; + + const DRWContextState *draw_ctx = DRW_context_state_get(); + Scene *scene = draw_ctx->scene; + World *wo = scene->world; + + float *col = ts.colorBackground; + + if (wo) { + col = &wo->horr; + + if (wo->use_nodes && wo->nodetree) { + struct GPUMaterial *gpumat = EEVEE_material_world_background_get(scene, wo); + grp = DRW_shgroup_material_create(gpumat, psl->background_pass); + + if (grp) { + DRW_shgroup_call_add(grp, geom, NULL); + } + else { + /* Shader failed : pink background */ + static float pink[3] = {1.0f, 0.0f, 1.0f}; + col = pink; + } + } + } + + /* Fallback if shader fails or if not using nodetree. */ + if (grp == NULL) { + grp = DRW_shgroup_create(e_data.default_background, psl->background_pass); + DRW_shgroup_uniform_vec3(grp, "color", col, 1); + DRW_shgroup_call_add(grp, geom, NULL); + } + } + + { + struct GPUShader *depth_sh = DRW_shader_create_3D_depth_only(); + DRWState state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS; + psl->depth_pass = DRW_pass_create("Depth Pass", state); + stl->g_data->depth_shgrp = DRW_shgroup_create(depth_sh, psl->depth_pass); + + state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK; + psl->depth_pass_cull = DRW_pass_create("Depth Pass Cull", state); + stl->g_data->depth_shgrp_cull = DRW_shgroup_create(depth_sh, psl->depth_pass_cull); + } + + { + DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL; + psl->default_pass = DRW_pass_create("Default Lit Pass", state); + DRWShadingGroup *shgrp = DRW_shgroup_create(e_data.default_lit, psl->default_pass); + add_standard_uniforms(shgrp, sldata); + + psl->default_flat_pass = DRW_pass_create("Default Flat Lit Pass", state); + shgrp = DRW_shgroup_create(e_data.default_lit_flat, psl->default_flat_pass); + add_standard_uniforms(shgrp, sldata); + } + + { + DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL; + psl->material_pass = DRW_pass_create("Material Shader Pass", state); + } +} + +/* Macro to call the right */ +#define ADD_MATERIAL_CALL(shgrp, ob, geom) do { \ + if (is_sculpt_mode) { \ + DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat); \ + } \ + else { \ + DRW_shgroup_call_object_add(shgrp, geom, ob); \ + } \ +} while (0) + +void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sldata, Object *ob, struct Batch *geom) +{ + EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; + EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; + const DRWContextState *draw_ctx = DRW_context_state_get(); + + IDProperty *ces_mode_ob = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_OBJECT, ""); + const bool do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling"); + const bool is_active = (ob == draw_ctx->obact); + const bool is_sculpt_mode = is_active && (ob->mode & OB_MODE_SCULPT) != 0; + const bool is_default_mode_shader = is_sculpt_mode; + + /* Depth Prepass */ + DRWShadingGroup *depth_shgrp = do_cull ? stl->g_data->depth_shgrp_cull : stl->g_data->depth_shgrp; + ADD_MATERIAL_CALL(depth_shgrp, ob, geom); + + /* Get per-material split surface */ + struct Batch **mat_geom = DRW_cache_object_surface_material_get(ob); + if (mat_geom) { + struct GPUShader *default_shader = e_data.default_lit; + struct DRWPass *default_pass = psl->default_pass; + + if (is_default_mode_shader) { + if (is_sculpt_mode) { + bool use_flat = DRW_object_is_flat_normal(ob); + default_shader = use_flat ? e_data.default_lit_flat : e_data.default_lit; + } + } + + for (int i = 0; i < MAX2(1, (is_sculpt_mode ? 1 : ob->totcol)); ++i) { + DRWShadingGroup *shgrp = NULL; + Material *ma = give_current_material(ob, i + 1); + + if (ma == NULL) + ma = &defmaterial; + + float *color_p = &ma->r; + float *metal_p = &ma->ray_mirror; + float *spec_p = &ma->spec; + float *rough_p = &ma->gloss_mir; + + if (ma->use_nodes && ma->nodetree) { + Scene *scene = draw_ctx->scene; + struct GPUMaterial *gpumat = EEVEE_material_mesh_get(scene, ma); + + shgrp = DRW_shgroup_material_create(gpumat, psl->material_pass); + if (shgrp) { + add_standard_uniforms(shgrp, sldata); + + ADD_MATERIAL_CALL(shgrp, ob, mat_geom[i]); + } + else { + /* Shader failed : pink color */ + static float col[3] = {1.0f, 0.0f, 1.0f}; + static float half = 0.5f; + + color_p = col; + metal_p = spec_p = rough_p = ½ + } + } + + /* Fallback to default shader */ + if (shgrp == NULL) { + shgrp = DRW_shgroup_create(default_shader, default_pass); + DRW_shgroup_uniform_vec3(shgrp, "basecol", color_p, 1); + DRW_shgroup_uniform_float(shgrp, "metallic", metal_p, 1); + DRW_shgroup_uniform_float(shgrp, "specular", spec_p, 1); + DRW_shgroup_uniform_float(shgrp, "roughness", rough_p, 1); + + ADD_MATERIAL_CALL(shgrp, ob, mat_geom[i]); + } + } + } +} + +void EEVEE_materials_free(void) +{ + MEM_SAFE_FREE(e_data.frag_shader_lib); + DRW_SHADER_FREE_SAFE(e_data.default_lit); + DRW_SHADER_FREE_SAFE(e_data.default_lit_flat); + DRW_SHADER_FREE_SAFE(e_data.default_background); + DRW_TEXTURE_FREE_SAFE(e_data.util_tex); +}
\ No newline at end of file diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 39adf1bdfe7..3e4547e76ac 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -31,6 +31,7 @@ struct Object; extern struct DrawEngineType draw_engine_eevee_type; /* Minimum UBO is 16384 bytes */ +#define MAX_PROBE 128 /* TODO : find size by dividing UBO max size by probe data size */ #define MAX_LIGHT 128 /* TODO : find size by dividing UBO max size by light data size */ #define MAX_SHADOW_CUBE 42 /* TODO : Make this depends on GL_MAX_ARRAY_TEXTURE_LAYERS */ #define MAX_SHADOW_MAP 64 @@ -64,6 +65,7 @@ typedef struct EEVEE_PassList { struct DRWPass *depth_pass; struct DRWPass *depth_pass_cull; struct DRWPass *default_pass; + struct DRWPass *default_flat_pass; struct DRWPass *material_pass; struct DRWPass *background_pass; } EEVEE_PassList; @@ -162,8 +164,15 @@ enum { LIGHT_UPDATE_SHADOW_CUBE = (1 << 0), }; +/* ************ PROBE UBO ************* */ +typedef struct EEVEE_Probe { + float position[3], dist; +} EEVEE_Probe; + /* ************ PROBE DATA ************* */ typedef struct EEVEE_ProbesInfo { + int num_cube, cache_num_cube; + int update_flag; /* For rendering probes */ float probemat[6][4][4]; int layer; @@ -178,8 +187,18 @@ typedef struct EEVEE_ProbesInfo { int shnbr; float shcoefs[9][3]; /* Temp */ struct GPUTexture *backgroundtex; + /* List of probes in the scene. */ + /* XXX This is fragile, can get out of sync quickly. */ + struct Object *probes_ref[MAX_PROBE]; + /* UBO Storage : data used by UBO */ + struct EEVEE_Probe probe_data[MAX_PROBE]; } EEVEE_ProbesInfo; +/* EEVEE_ProbesInfo->update_flag */ +enum { + PROBE_UPDATE_CUBE = (1 << 0), +}; + /* ************ EFFECTS DATA ************* */ typedef struct EEVEE_EffectsInfo { int enabled_effects; @@ -255,6 +274,8 @@ typedef struct EEVEE_SceneLayerData { struct GPUTexture *probe_depth_rt; struct GPUTexture *probe_pool; struct GPUTexture *probe_sh; + + struct ListBase probe_queue; /* List of probes to update */ } EEVEE_SceneLayerData; /* ************ OBJECT DATA ************ */ @@ -289,6 +310,17 @@ EEVEE_SceneLayerData *EEVEE_scene_layer_data_get(void); EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob); EEVEE_LampEngineData *EEVEE_lamp_data_get(Object *ob); + +/* eevee_materials.c */ +void EEVEE_materials_init(void); +void EEVEE_materials_cache_init(EEVEE_Data *vedata); +void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sldata, Object *ob, struct Batch *geom); +struct GPUMaterial *EEVEE_material_world_probe_get(struct Scene *scene, struct World *wo); +struct GPUMaterial *EEVEE_material_world_background_get(struct Scene *scene, struct World *wo); +struct GPUMaterial *EEVEE_material_mesh_probe_get(struct Scene *scene, Material *ma); +struct GPUMaterial *EEVEE_material_mesh_get(struct Scene *scene, Material *ma); +void EEVEE_materials_free(void); + /* eevee_lights.c */ void EEVEE_lights_init(EEVEE_SceneLayerData *sldata); void EEVEE_lights_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl); @@ -304,8 +336,7 @@ void EEVEE_probes_init(EEVEE_SceneLayerData *sldata); void EEVEE_probes_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl); void EEVEE_probes_cache_add(EEVEE_SceneLayerData *sldata, Object *ob); void EEVEE_probes_cache_finish(EEVEE_SceneLayerData *sldata); -void EEVEE_probes_update(EEVEE_SceneLayerData *sldata); -void EEVEE_refresh_probe(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl); +void EEVEE_probes_refresh(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl); void EEVEE_probes_free(void); /* eevee_effects.c */ diff --git a/source/blender/draw/engines/eevee/eevee_probes.c b/source/blender/draw/engines/eevee/eevee_probes.c index 3368b9ea4f3..a5097080646 100644 --- a/source/blender/draw/engines/eevee/eevee_probes.c +++ b/source/blender/draw/engines/eevee/eevee_probes.c @@ -31,28 +31,32 @@ #include "DRW_render.h" -#include "eevee_engine.h" -#include "eevee_private.h" +#include "GPU_material.h" #include "GPU_texture.h" #include "GPU_glew.h" -typedef struct EEVEE_ProbeData { - short probe_id, shadow_id; -} EEVEE_ProbeData; +#include "eevee_engine.h" +#include "eevee_private.h" + +typedef struct EEVEE_ProbeCubeData { + short probe_id; +} EEVEE_ProbeCubeData; /* TODO Option */ #define PROBE_CUBE_SIZE 512 #define PROBE_SIZE 1024 static struct { + struct GPUShader *probe_default_sh; struct GPUShader *probe_filter_sh; struct GPUShader *probe_spherical_harmonic_sh; struct GPUTexture *hammersley; - float camera_pos[3]; + bool update_world; } e_data = {NULL}; /* Engine data */ +extern char datatoc_default_world_frag_glsl[]; extern char datatoc_probe_filter_frag_glsl[]; extern char datatoc_probe_sh_frag_glsl[]; extern char datatoc_probe_geom_glsl[]; @@ -60,6 +64,8 @@ extern char datatoc_probe_vert_glsl[]; extern char datatoc_bsdf_common_lib_glsl[]; extern char datatoc_bsdf_sampling_lib_glsl[]; +extern GlobalsUboStorage ts; + /* *********** FUNCTIONS *********** */ /* Van der Corput sequence */ @@ -108,21 +114,23 @@ void EEVEE_probes_init(EEVEE_SceneLayerData *sldata) "#define HAMMERSLEY_SIZE 1024\n" "#define NOISE_SIZE 64\n"); + e_data.probe_default_sh = DRW_shader_create( + datatoc_probe_vert_glsl, datatoc_probe_geom_glsl, datatoc_default_world_frag_glsl, NULL); + MEM_freeN(shader_str); } + /* Shaders */ if (!e_data.hammersley) { e_data.hammersley = create_hammersley_sample_texture(1024); - } - - if (!e_data.probe_spherical_harmonic_sh) { e_data.probe_spherical_harmonic_sh = DRW_shader_create_fullscreen(datatoc_probe_sh_frag_glsl, NULL); } if (!sldata->probes) { - sldata->probes = MEM_callocN(sizeof(EEVEE_ProbesInfo), "EEVEE_ProbesInfo"); + sldata->probes = MEM_callocN(sizeof(EEVEE_ProbesInfo), "EEVEE_ProbesInfo"); } + /* Setup Render Target Cubemap */ if (!sldata->probe_rt) { sldata->probe_rt = DRW_texture_create_cube(PROBE_CUBE_SIZE, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP, NULL); sldata->probe_depth_rt = DRW_texture_create_cube(PROBE_CUBE_SIZE, DRW_TEX_DEPTH_24, DRW_TEX_FILTER, NULL); @@ -133,15 +141,6 @@ void EEVEE_probes_init(EEVEE_SceneLayerData *sldata) DRW_framebuffer_init(&sldata->probe_fb, &draw_engine_eevee_type, PROBE_CUBE_SIZE, PROBE_CUBE_SIZE, tex_probe, 2); - if (!sldata->probe_pool) { - /* TODO array */ - sldata->probe_pool = DRW_texture_create_2D(PROBE_SIZE, PROBE_SIZE, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP, NULL); - } - - DRWFboTexture tex_filter = {&sldata->probe_pool, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP}; - - DRW_framebuffer_init(&sldata->probe_filter_fb, &draw_engine_eevee_type, PROBE_SIZE, PROBE_SIZE, &tex_filter, 1); - /* Spherical Harmonic Buffer */ DRWFboTexture tex_sh = {&sldata->probe_sh, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP}; @@ -150,6 +149,58 @@ void EEVEE_probes_init(EEVEE_SceneLayerData *sldata) void EEVEE_probes_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl) { + EEVEE_ProbesInfo *pinfo = sldata->probes; + + pinfo->num_cube = 0; + memset(pinfo->probes_ref, 0, sizeof(pinfo->probes_ref)); + + { + psl->probe_background = DRW_pass_create("World Probe Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR); + + struct Batch *geom = DRW_cache_fullscreen_quad_get(); + DRWShadingGroup *grp = NULL; + + const DRWContextState *draw_ctx = DRW_context_state_get(); + Scene *scene = draw_ctx->scene; + World *wo = scene->world; + + static int zero = 0; + float *col = ts.colorBackground; + if (wo) { + col = &wo->horr; + e_data.update_world = (wo->update_flag != 0); + wo->update_flag = 0; + + if (wo->use_nodes && wo->nodetree) { + struct GPUMaterial *gpumat = EEVEE_material_world_probe_get(scene, wo); + + grp = DRW_shgroup_material_instance_create(gpumat, psl->probe_background, geom); + + if (grp) { + DRW_shgroup_uniform_int(grp, "Layer", &zero, 1); + + for (int i = 0; i < 6; ++i) + DRW_shgroup_call_dynamic_add_empty(grp); + } + else { + /* Shader failed : pink background */ + static float pink[3] = {1.0f, 0.0f, 1.0f}; + col = pink; + } + } + } + + /* Fallback if shader fails or if not using nodetree. */ + if (grp == NULL) { + grp = DRW_shgroup_instance_create(e_data.probe_default_sh, psl->probe_background, geom); + DRW_shgroup_uniform_vec3(grp, "color", col, 1); + DRW_shgroup_uniform_int(grp, "Layer", &zero, 1); + + for (int i = 0; i < 6; ++i) + DRW_shgroup_call_dynamic_add_empty(grp); + } + } + { psl->probe_prefilter = DRW_pass_create("Probe Filtering", DRW_STATE_WRITE_COLOR); @@ -189,33 +240,74 @@ void EEVEE_probes_cache_add(EEVEE_SceneLayerData *UNUSED(sldata), Object *UNUSED return; } -void EEVEE_probes_cache_finish(EEVEE_SceneLayerData *UNUSED(sldata)) +void EEVEE_probes_cache_finish(EEVEE_SceneLayerData *sldata) { - return; -} + EEVEE_ProbesInfo *pinfo = sldata->probes; -void EEVEE_probes_update(EEVEE_SceneLayerData *UNUSED(sldata)) -{ - return; + /* Setup enough layers. */ + /* Free textures if number mismatch. */ + if (pinfo->num_cube != pinfo->cache_num_cube) { + DRW_TEXTURE_FREE_SAFE(sldata->probe_pool); + pinfo->cache_num_cube = pinfo->num_cube; + pinfo->update_flag |= PROBE_UPDATE_CUBE; + } + + if (!sldata->probe_pool) { + sldata->probe_pool = DRW_texture_create_2D_array(PROBE_SIZE, PROBE_SIZE, max_ff(1, pinfo->num_cube), + DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP, NULL); + } + + DRWFboTexture tex_filter = {&sldata->probe_pool, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP}; + + DRW_framebuffer_init(&sldata->probe_filter_fb, &draw_engine_eevee_type, PROBE_SIZE, PROBE_SIZE, &tex_filter, 1); } -void EEVEE_refresh_probe(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl) +/* Renders the probe with index probe_idx. + * Renders the world probe if probe_idx = -1. */ +void render_one_probe(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl, int probe_idx) { EEVEE_ProbesInfo *pinfo = sldata->probes; + Object *ob = NULL; + bool is_object_probe = (probe_idx != -1); + + float projmat[4][4], posmat[4][4]; + float near, far; + float clear_color[4] = {0.5, 0.5, 0.5, 0.0f}; - float projmat[4][4]; + unit_m4(posmat); + + if (is_object_probe) { + ob = pinfo->probes_ref[probe_idx]; + near = 0.1f; + far = 100.0f; + + /* Move to capture position */ + negate_v3_v3(posmat[3], ob->obmat[3]); + } + else { + /* World cubemap */ + near = 0.1f; + far = 100.0f; + } /* 1 - Render to cubemap target using geometry shader. */ - /* We don't need to clear since we render the background. */ + /* For world probe, we don't need to clear since we render the background directly. */ pinfo->layer = 0; - perspective_m4(projmat, -0.1f, 0.1f, -0.1f, 0.1f, 0.1f, 100.0f); + perspective_m4(projmat, -near, near, -near, near, near, far); + for (int i = 0; i < 6; ++i) { - mul_m4_m4m4(pinfo->probemat[i], projmat, cubefacemat[i]); + float tmp[4][4]; + mul_m4_m4m4(tmp, cubefacemat[i], posmat); + mul_m4_m4m4(pinfo->probemat[i], projmat, tmp); } DRW_framebuffer_bind(sldata->probe_fb); DRW_draw_pass(psl->probe_background); + if (is_object_probe) { + DRW_framebuffer_clear(true, true, false, clear_color, 1.0); + } + /* 2 - Let gpu create Mipmaps for Filtered Importance Sampling. */ /* Bind next framebuffer to be able to gen. mips for probe_rt. */ DRW_framebuffer_bind(sldata->probe_filter_fb); @@ -245,7 +337,7 @@ void EEVEE_refresh_probe(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl) else if (pinfo->padding_size > 4) { pinfo->padding_size += 1; } - pinfo->layer = 0; + pinfo->layer = probe_idx + 1; /* 0 is world */ pinfo->roughness = (float)i / ((float)maxlevel - 4.0f); pinfo->roughness *= pinfo->roughness; /* Disney Roughness */ pinfo->roughness *= pinfo->roughness; /* Distribute Roughness accros lod more evenly */ @@ -289,8 +381,17 @@ void EEVEE_refresh_probe(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl) DRW_framebuffer_read_data(0, 0, 9, 1, 3, 0, (float *)pinfo->shcoefs); } +void EEVEE_probes_refresh(EEVEE_SceneLayerData *sldata, EEVEE_PassList *psl) +{ + if (e_data.update_world) { + render_one_probe(sldata, psl, -1); + e_data.update_world = false; + } +} + void EEVEE_probes_free(void) { + DRW_SHADER_FREE_SAFE(e_data.probe_default_sh); DRW_SHADER_FREE_SAFE(e_data.probe_filter_sh); DRW_SHADER_FREE_SAFE(e_data.probe_spherical_harmonic_sh); DRW_TEXTURE_FREE_SAFE(e_data.hammersley); diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl index e91c4a4411b..a1a5fab03af 100644 --- a/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/bsdf_direct_lib.glsl @@ -112,8 +112,8 @@ vec3 direct_ggx_sphere(LightData ld, ShadingData sd, float roughness, vec3 f0) vec3 Py = cross(Px, L); vec2 uv = lut_coords(dot(sd.N, sd.V), sqrt(roughness)); - vec3 brdf_lut = texture(brdfLut, uv).rgb; - vec4 ltc_lut = texture(ltcMat, uv).rgba; + vec3 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rgb; + vec4 ltc_lut = texture(utilTex, vec3(uv, 0.0)).rgba; mat3 ltc_mat = ltc_matrix(ltc_lut); // #define HIGHEST_QUALITY @@ -160,8 +160,8 @@ vec3 direct_ggx_rectangle(LightData ld, ShadingData sd, float roughness, vec3 f0 corners[3] = sd.l_vector + ld.l_right * ld.l_sizex + ld.l_up * ld.l_sizey; vec2 uv = lut_coords(dot(sd.N, sd.V), sqrt(roughness)); - vec3 brdf_lut = texture(brdfLut, uv).rgb; - vec4 ltc_lut = texture(ltcMat, uv).rgba; + vec3 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rgb; + vec4 ltc_lut = texture(utilTex, vec3(uv, 0.0)).rgba; mat3 ltc_mat = ltc_matrix(ltc_lut); float bsdf = ltc_evaluate(sd.N, sd.V, ltc_mat, corners); bsdf *= brdf_lut.b; /* Bsdf intensity */ diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl index 1461b04a41c..b8eb84f24de 100644 --- a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl @@ -3,13 +3,15 @@ uniform int light_count; uniform mat4 ProjectionMatrix; uniform mat4 ViewMatrixInverse; -uniform sampler2D probeFiltered; +uniform sampler2DArray probeCubes; uniform float lodMax; uniform vec3 shCoefs[9]; -#ifndef USE_LTC -uniform sampler2D brdfLut; -#endif +#ifndef __UTIL_TEX__ +#define __UTIL_TEX__ +uniform sampler2DArray utilTex; +#endif /* __UTIL_TEX__ */ + uniform sampler2DArray shadowCubes; uniform sampler2DArrayShadow shadowCascades; @@ -64,13 +66,13 @@ vec2 mapping_octahedron(vec3 cubevec, vec2 texel_size) return uvs; } -vec4 textureLod_octahedron(sampler2D tex, vec3 cubevec, float lod) +vec4 textureLod_octahedron(sampler2DArray tex, vec4 cubevec, float lod) { vec2 texelSize = 1.0 / vec2(textureSize(tex, int(lodMax))); - vec2 uvs = mapping_octahedron(cubevec, texelSize); + vec2 uvs = mapping_octahedron(cubevec.xyz, texelSize); - return textureLod(tex, uvs, lod); + return textureLod(tex, vec3(uvs, cubevec.w), lod); } vec4 texture_octahedron(sampler2DArray tex, vec4 cubevec) @@ -221,9 +223,9 @@ vec3 eevee_surface_lit(vec3 world_normal, vec3 albedo, vec3 f0, float roughness, /* Envmaps */ vec2 uv = lut_coords(dot(sd.N, sd.V), roughness); - vec3 brdf_lut = texture(brdfLut, uv).rgb; - vec3 Li = textureLod_octahedron(probeFiltered, spec_dir, roughness * lodMax).rgb; - indirect_radiance += Li * F_ibl(f0, brdf_lut.rg); + vec2 brdf_lut = texture(utilTex, vec3(uv, 1.0)).rg; + vec3 Li = textureLod_octahedron(probeCubes, vec4(spec_dir, 0.0), roughness * lodMax).rgb; + indirect_radiance += Li * F_ibl(f0, brdf_lut); indirect_radiance += spherical_harmonics(sd.N, shCoefs) * albedo; return radiance + indirect_radiance * ao; diff --git a/source/blender/draw/engines/eevee/shaders/ltc_lib.glsl b/source/blender/draw/engines/eevee/shaders/ltc_lib.glsl index 4b02e8c222f..cd16203703f 100644 --- a/source/blender/draw/engines/eevee/shaders/ltc_lib.glsl +++ b/source/blender/draw/engines/eevee/shaders/ltc_lib.glsl @@ -2,8 +2,10 @@ #define USE_LTC -uniform sampler2D ltcMat; -uniform sampler2D brdfLut; +#ifndef __UTIL_TEX__ +#define __UTIL_TEX__ +uniform sampler2DArray utilTex; +#endif /* __UTIL_TEX__ */ /* from Real-Time Area Lighting: a Journey from Research to Production * Stephen Hill and Eric Heitz */ |