From deebf4f8f0d79169a0e6c2a391670419b6492bfe Mon Sep 17 00:00:00 2001 From: Joseph Eagar Date: Wed, 16 Sep 2009 17:43:09 +0000 Subject: [PATCH] merge with 2.5/trunk at r23271 --- CMakeLists.txt | 674 +- SConstruct | 17 +- blenderplayer/CMakeLists.txt | 133 - config/win32-mingw-config.py | 2 +- config/win32-vc-config.py | 1 + config/win64-vc-config.py | 1 + extern/CMakeLists.txt | 6 +- extern/Makefile | 9 - extern/binreloc/SConscript | 2 +- extern/bullet2/CMakeLists.txt | 20 +- .../src/BulletCollision/CMakeLists.txt | 4 +- .../bullet2/src/BulletSoftBody/CMakeLists.txt | 2 +- extern/bullet2/src/SConscript | 16 +- extern/glew/CMakeLists.txt | 4 +- extern/glew/SConscript | 2 +- extern/libopenjpeg/SConscript | 4 +- extern/libredcode/SConscript | 4 +- intern/CMakeLists.txt | 2 +- intern/audaspace/CMakeLists.txt | 38 +- intern/audaspace/FX/AUD_DoubleReader.cpp | 2 +- intern/audaspace/FX/AUD_PingPongFactory.cpp | 2 +- intern/audaspace/OpenAL/AUD_OpenALDevice.cpp | 14 +- intern/audaspace/SConscript | 2 +- intern/audaspace/SDL/AUD_SDLMixerReader.cpp | 2 +- intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp | 8 +- intern/audaspace/intern/AUD_C-API.cpp | 50 +- intern/audaspace/jack/AUD_JackDevice.cpp | 8 +- .../audaspace/make/msvc_9_0/audaspace.vcproj | 28 +- intern/elbeem/CMakeLists.txt | 4 +- intern/ghost/CMakeLists.txt | 46 +- intern/ghost/SConscript | 2 +- intern/ghost/intern/GHOST_WindowX11.cpp | 14 +- intern/guardedalloc/CMakeLists.txt | 4 +- intern/guardedalloc/SConscript | 2 +- intern/iksolver/SConscript | 2 +- intern/iksolver/intern/TNT/tntmath.h | 4 +- intern/memutil/SConscript | 2 +- intern/moto/SConscript | 2 +- intern/smoke/CMakeLists.txt | 6 +- intern/smoke/extern/smoke_API.h | 6 +- intern/smoke/intern/FLUID_3D.cpp | 123 +- intern/smoke/intern/FLUID_3D.h | 2 +- intern/smoke/intern/FLUID_3D_STATIC.cpp | 168 +- intern/smoke/intern/WTURBULENCE.cpp | 594 +- intern/smoke/intern/WTURBULENCE.h | 37 +- intern/smoke/intern/smoke_API.cpp | 16 +- intern/smoke/intern/tnt/tnt_math_utils.h | 4 +- intern/string/SConscript | 2 +- intern/string/STR_String.h | 4 + po/Makefile | 2 + projectfiles_vc9/blender/blender.vcproj | 12 +- .../blender/blenkernel/BKE_blenkernel.vcproj | 16 +- .../blender/blenlib/BLI_blenlib.vcproj | 16 - .../blender/editors/ED_editors.vcproj | 70 +- projectfiles_vc9/blender/gpu/BL_gpu.vcproj | 12 +- .../blender/imbuf/BL_imbuf.vcproj | 12 +- .../blender/loader/BLO_loader.vcproj | 234 +- .../blender/makesrna/RNA_makesrna.vcproj | 8 + .../blender/makesrna/RNA_rna.vcproj | 4 + projectfiles_vc9/blender/nodes/nodes.vcproj | 12 + .../gameengine/videotexture/TEX_Video.vcproj | 4 +- release/datafiles/blenderbuttons | Bin 179274 -> 182512 bytes release/datafiles/datatoc.c | 102 - release/datafiles/datatoc.py | 75 + release/datafiles/splash.jpg | Bin 197158 -> 0 bytes release/datafiles/splash.png | Bin 0 -> 197165 bytes release/io/engine_render_pov.py | 28 +- release/io/netrender/__init__.py | 17 + release/io/netrender/client.py | 204 + release/io/netrender/master.py | 635 + release/io/netrender/model.py | 162 + release/io/netrender/operators.py | 356 + release/io/netrender/slave.py | 180 + release/io/netrender/ui.py | 293 + release/io/netrender/utils.py | 72 + release/scripts/import_edl.py | 961 ++ release/test/rna_array.py | 279 + release/ui/bpy_ops.py | 34 +- release/ui/buttons_data_armature.py | 23 +- release/ui/buttons_data_bone.py | 44 +- release/ui/buttons_data_camera.py | 4 +- release/ui/buttons_data_curve.py | 211 +- release/ui/buttons_data_empty.py | 4 +- release/ui/buttons_data_lamp.py | 43 +- release/ui/buttons_data_lattice.py | 2 +- release/ui/buttons_data_mesh.py | 4 +- release/ui/buttons_data_modifier.py | 18 +- release/ui/buttons_data_text.py | 115 +- release/ui/buttons_game.py | 30 +- release/ui/buttons_material.py | 342 +- release/ui/buttons_object.py | 12 +- release/ui/buttons_object_constraint.py | 15 +- release/ui/buttons_particle.py | 216 +- release/ui/buttons_physics_cloth.py | 91 +- release/ui/buttons_physics_field.py | 10 +- release/ui/buttons_physics_fluid.py | 26 +- release/ui/buttons_physics_smoke.py | 164 +- release/ui/buttons_physics_softbody.py | 217 +- release/ui/buttons_scene.py | 47 +- release/ui/buttons_texture.py | 109 +- release/ui/buttons_world.py | 43 +- release/ui/space_console.py | 6 +- release/ui/space_image.py | 74 +- release/ui/space_info.py | 52 +- release/ui/space_logic.py | 20 +- release/ui/space_node.py | 21 +- release/ui/space_sequencer.py | 50 +- release/ui/space_text.py | 14 +- release/ui/space_time.py | 4 +- release/ui/space_userpref.py | 11 +- release/ui/space_view3d.py | 347 +- release/ui/space_view3d_toolbar.py | 289 +- release/windows/inno/blender.iss | 92 + release/windows/inno/copyright.txt | 56 + release/windows/inno/header.bmp | Bin 0 -> 25818 bytes release/windows/inno/installer.bmp | Bin 0 -> 154542 bytes release/windows/inno/installer.ico | Bin 0 -> 25214 bytes source/CMakeLists.txt | 4 +- source/Makefile | 3 +- source/SConscript | 5 +- source/blender/CMakeLists.txt | 8 +- source/blender/avi/CMakeLists.txt | 4 +- source/blender/avi/SConscript | 3 +- source/blender/blenfont/CMakeLists.txt | 10 +- source/blender/blenfont/SConscript | 2 +- source/blender/blenfont/intern/blf.c | 2 +- source/blender/blenfont/intern/blf_dir.c | 2 +- source/blender/blenfont/intern/blf_font.c | 2 +- source/blender/blenfont/intern/blf_glyph.c | 2 +- source/blender/blenkernel/BKE_anim.h | 2 +- source/blender/blenkernel/BKE_animsys.h | 3 + source/blender/blenkernel/BKE_armature.h | 1 - source/blender/blenkernel/BKE_blender.h | 2 +- source/blender/blenkernel/BKE_cloth.h | 3 +- source/blender/blenkernel/BKE_constraint.h | 1 + source/blender/blenkernel/BKE_curve.h | 4 +- source/blender/blenkernel/BKE_depsgraph.h | 18 +- source/blender/blenkernel/BKE_global.h | 1 - source/blender/blenkernel/BKE_group.h | 1 + source/blender/blenkernel/BKE_key.h | 5 +- source/blender/blenkernel/BKE_library.h | 4 + source/blender/blenkernel/BKE_node.h | 7 +- source/blender/blenkernel/BKE_paint.h | 39 + source/blender/blenkernel/BKE_particle.h | 56 +- source/blender/blenkernel/BKE_pointcache.h | 80 +- source/blender/blenkernel/BKE_sca.h | 1 - source/blender/blenkernel/BKE_scene.h | 2 - source/blender/blenkernel/BKE_screen.h | 6 +- source/blender/blenkernel/BKE_sculpt.h | 72 - source/blender/blenkernel/BKE_shrinkwrap.h | 4 +- source/blender/blenkernel/BKE_smoke.h | 4 +- source/blender/blenkernel/BKE_sound.h | 2 + source/blender/blenkernel/BKE_text.h | 6 +- source/blender/blenkernel/BKE_utildefines.h | 1 + source/blender/blenkernel/CMakeLists.txt | 51 +- source/blender/blenkernel/SConscript | 2 +- .../blender/blenkernel/intern/DerivedMesh.c | 2 +- source/blender/blenkernel/intern/action.c | 6 +- source/blender/blenkernel/intern/anim.c | 96 +- source/blender/blenkernel/intern/anim_sys.c | 37 +- source/blender/blenkernel/intern/armature.c | 21 +- source/blender/blenkernel/intern/boids.c | 198 +- source/blender/blenkernel/intern/booleanops.c | 2 +- source/blender/blenkernel/intern/brush.c | 2 +- source/blender/blenkernel/intern/cloth.c | 78 +- source/blender/blenkernel/intern/collision.c | 16 +- source/blender/blenkernel/intern/colortools.c | 4 +- source/blender/blenkernel/intern/constraint.c | 104 +- source/blender/blenkernel/intern/curve.c | 773 +- source/blender/blenkernel/intern/depsgraph.c | 144 +- source/blender/blenkernel/intern/displist.c | 50 +- source/blender/blenkernel/intern/fcurve.c | 6 +- source/blender/blenkernel/intern/fluidsim.c | 1 + source/blender/blenkernel/intern/font.c | 9 +- source/blender/blenkernel/intern/gpencil.c | 7 +- source/blender/blenkernel/intern/group.c | 10 + source/blender/blenkernel/intern/image.c | 5 + source/blender/blenkernel/intern/implicit.c | 110 +- source/blender/blenkernel/intern/ipo.c | 2 +- source/blender/blenkernel/intern/key.c | 117 +- source/blender/blenkernel/intern/lattice.c | 31 +- source/blender/blenkernel/intern/library.c | 237 +- source/blender/blenkernel/intern/material.c | 57 +- source/blender/blenkernel/intern/mesh.c | 4 +- source/blender/blenkernel/intern/modifier.c | 82 +- .../blenkernel/intern/modifiers_bmesh.c | 151 +- source/blender/blenkernel/intern/multires.c | 6 +- source/blender/blenkernel/intern/nla.c | 2 +- source/blender/blenkernel/intern/node.c | 9 +- source/blender/blenkernel/intern/object.c | 72 +- source/blender/blenkernel/intern/packedFile.c | 10 +- source/blender/blenkernel/intern/particle.c | 757 +- .../blenkernel/intern/particle_system.c | 723 +- source/blender/blenkernel/intern/pointcache.c | 204 +- source/blender/blenkernel/intern/sca.c | 26 - source/blender/blenkernel/intern/scene.c | 20 +- source/blender/blenkernel/intern/screen.c | 21 + source/blender/blenkernel/intern/sequence.c | 22 +- source/blender/blenkernel/intern/shrinkwrap.c | 2 +- source/blender/blenkernel/intern/smoke.c | 1003 +- source/blender/blenkernel/intern/softbody.c | 323 +- source/blender/blenkernel/intern/sound.c | 97 +- source/blender/blenkernel/intern/text.c | 125 +- source/blender/blenkernel/intern/texture.c | 6 +- .../blender/blenkernel/intern/writeffmpeg.c | 2 +- source/blender/blenlib/BLI_arithb.h | 80 +- source/blender/blenlib/BLI_fileops.h | 3 +- source/blender/blenlib/BLI_voxel.h | 3 +- source/blender/blenlib/BLI_winstuff.h | 31 +- source/blender/blenlib/CMakeLists.txt | 12 +- source/blender/blenlib/MTC_matrixops.h | 162 - source/blender/blenlib/MTC_vectorops.h | 58 - source/blender/blenlib/SConscript | 2 +- source/blender/blenlib/intern/BLI_kdopbvh.c | 4 +- source/blender/blenlib/intern/BLI_kdtree.c | 2 +- source/blender/blenlib/intern/BLI_mempool.c | 5 +- source/blender/blenlib/intern/arithb.c | 743 +- source/blender/blenlib/intern/bpath.c | 34 +- source/blender/blenlib/intern/fileops.c | 39 +- source/blender/blenlib/intern/freetypefont.c | 7 +- source/blender/blenlib/intern/graph.c | 6 +- source/blender/blenlib/intern/matrixops.c | 438 - source/blender/blenlib/intern/noise.c | 12 +- source/blender/blenlib/intern/storage.c | 18 +- source/blender/blenlib/intern/threads.c | 21 +- source/blender/blenlib/intern/util.c | 7 +- source/blender/blenlib/intern/vectorops.c | 166 - source/blender/blenlib/intern/voxel.c | 347 +- source/blender/blenloader/BLO_readfile.h | 19 +- source/blender/blenloader/CMakeLists.txt | 10 +- source/blender/blenloader/SConscript | 2 +- .../blender/blenloader/intern/readblenentry.c | 26 +- source/blender/blenloader/intern/readfile.c | 418 +- source/blender/blenloader/intern/readfile.h | 2 +- source/blender/blenloader/intern/writefile.c | 29 +- source/blender/blenpluginapi/CMakeLists.txt | 6 +- source/blender/blenpluginapi/SConscript | 2 +- source/blender/bmesh/bmesh_marking.h | 2 + source/blender/bmesh/intern/bmesh_marking.c | 31 + source/blender/bmesh/intern/bmesh_queries.c | 5 +- source/blender/bmesh/operators/subdivideop.c | 15 +- source/blender/editors/Makefile | 1 + source/blender/editors/SConscript | 1 + .../editors/animation/anim_channels_defines.c | 6 + source/blender/editors/animation/anim_deps.c | 14 +- .../blender/editors/animation/anim_filter.c | 2 +- .../blender/editors/animation/anim_intern.h | 30 +- source/blender/editors/animation/anim_ops.c | 10 +- source/blender/editors/animation/drivers.c | 32 +- .../editors/animation/keyframes_draw.c | 37 +- .../editors/animation/keyframes_edit.c | 31 +- .../editors/animation/keyframes_general.c | 76 +- source/blender/editors/animation/keyframing.c | 82 +- source/blender/editors/animation/keyingsets.c | 185 +- .../blender/editors/armature/editarmature.c | 152 +- .../editors/armature/editarmature_generate.c | 1 + .../editors/armature/editarmature_retarget.c | 6 +- .../blender/editors/armature/meshlaplacian.c | 24 +- source/blender/editors/armature/poselib.c | 83 +- source/blender/editors/armature/poseobject.c | 130 +- source/blender/editors/curve/curve_ops.c | 3 +- source/blender/editors/curve/editcurve.c | 314 +- source/blender/editors/curve/editfont.c | 33 +- source/blender/editors/datafiles/B.blend.c | 5665 ++++---- .../editors/datafiles/blenderbuttons.c | 11309 ++++++++-------- .../datafiles/{splash.jpg.c => splash.png.c} | 6 +- source/blender/editors/gpencil/drawgpencil.c | 381 +- .../blender/editors/gpencil/gpencil_buttons.c | 281 + source/blender/editors/gpencil/gpencil_edit.c | 1756 +-- .../blender/editors/gpencil/gpencil_intern.h | 32 +- source/blender/editors/gpencil/gpencil_ops.c | 86 + .../blender/editors/gpencil/gpencil_paint.c | 1434 ++ source/blender/editors/include/ED_anim_api.h | 6 +- source/blender/editors/include/ED_armature.h | 4 +- source/blender/editors/include/ED_datafiles.h | 4 +- source/blender/editors/include/ED_gpencil.h | 36 +- .../editors/include/ED_keyframes_draw.h | 6 +- .../editors/include/ED_keyframes_edit.h | 4 +- .../blender/editors/include/ED_keyframing.h | 11 +- source/blender/editors/include/ED_mball.h | 6 + source/blender/editors/include/ED_mesh.h | 42 +- source/blender/editors/include/ED_object.h | 7 +- source/blender/editors/include/ED_particle.h | 11 +- source/blender/editors/include/ED_screen.h | 4 +- .../blender/editors/include/ED_screen_types.h | 2 +- source/blender/editors/include/ED_sound.h | 35 + source/blender/editors/include/UI_icons.h | 14 +- source/blender/editors/include/UI_interface.h | 6 +- source/blender/editors/interface/interface.c | 3 + .../editors/interface/interface_anim.c | 28 + .../editors/interface/interface_handlers.c | 60 +- .../editors/interface/interface_icons.c | 1 + .../editors/interface/interface_intern.h | 2 + .../editors/interface/interface_layout.c | 95 +- .../editors/interface/interface_panel.c | 1 + .../editors/interface/interface_regions.c | 2 +- .../editors/interface/interface_templates.c | 122 +- .../editors/interface/interface_utils.c | 66 +- .../editors/interface/interface_widgets.c | 69 +- source/blender/editors/interface/resources.c | 12 + source/blender/editors/interface/view2d_ops.c | 13 + source/blender/editors/mesh/bmesh_select.c | 51 +- .../editors/mesh/bmesh_selecthistory.c | 2 - source/blender/editors/mesh/bmesh_tools.c | 147 +- source/blender/editors/mesh/bmeshutils.c | 10 +- source/blender/editors/mesh/editmesh.c | 168 +- source/blender/editors/mesh/editmesh_add.c | 69 +- source/blender/editors/mesh/editmesh_loop.c | 19 +- source/blender/editors/mesh/editmesh_mods.c | 598 +- source/blender/editors/mesh/editmesh_tools.c | 273 +- source/blender/editors/mesh/mesh_intern.h | 3 + source/blender/editors/mesh/mesh_layers.c | 88 +- source/blender/editors/mesh/mesh_ops.c | 26 +- source/blender/editors/mesh/meshtools.c | 3 +- .../metaball/{editmball.c => mball_edit.c} | 37 +- source/blender/editors/metaball/mball_ops.c | 1 + source/blender/editors/object/object_add.c | 1450 ++ .../{editconstraint.c => object_constraint.c} | 51 +- source/blender/editors/object/object_edit.c | 5299 +------- .../object/{editgroup.c => object_group.c} | 191 +- source/blender/editors/object/object_hook.c | 608 + source/blender/editors/object/object_intern.h | 79 +- .../{editlattice.c => object_lattice.c} | 17 +- .../blender/editors/object/object_modifier.c | 136 +- source/blender/editors/object/object_ops.c | 58 +- .../blender/editors/object/object_relations.c | 1765 +++ source/blender/editors/object/object_select.c | 1024 ++ .../object/{editkey.c => object_shapekey.c} | 107 +- .../blender/editors/object/object_transform.c | 926 ++ source/blender/editors/object/object_vgroup.c | 1533 +-- source/blender/editors/physics/ed_fluidsim.c | 22 + .../blender/editors/physics/ed_pointcache.c | 31 +- source/blender/editors/physics/editparticle.c | 2321 ++-- .../blender/editors/preview/previewrender.c | 13 +- source/blender/editors/screen/CMakeLists.txt | 40 +- source/blender/editors/screen/area.c | 232 +- .../blender/editors/screen/screen_context.c | 6 + source/blender/editors/screen/screen_edit.c | 19 +- source/blender/editors/screen/screen_ops.c | 71 +- source/blender/editors/screen/screendump.c | 22 +- .../editors/sculpt_paint/paint_image.c | 2 +- .../blender/editors/sculpt_paint/paint_ops.c | 1 + .../editors/sculpt_paint/paint_utils.c | 1 + .../editors/sculpt_paint/paint_vertex.c | 146 +- source/blender/editors/sculpt_paint/sculpt.c | 1 - .../editors/sculpt_paint/sculpt_intern.h | 1 - source/blender/editors/sound/Makefile | 51 + source/blender/editors/sound/SConscript | 14 + source/blender/editors/sound/sound_intern.h | 37 + source/blender/editors/sound/sound_ops.c | 293 + .../editors/space_action/action_edit.c | 138 +- .../editors/space_action/action_header.c | 20 +- .../editors/space_action/action_intern.h | 1 + .../blender/editors/space_action/action_ops.c | 2 + .../editors/space_action/space_action.c | 4 + source/blender/editors/space_api/spacetypes.c | 7 +- .../editors/space_buttons/buttons_context.c | 2 +- .../editors/space_buttons/buttons_intern.h | 2 + .../editors/space_buttons/buttons_ops.c | 413 +- .../editors/space_buttons/space_buttons.c | 27 +- .../editors/space_console/console_ops.c | 8 +- .../editors/space_console/console_report.c | 2 +- .../editors/space_console/space_console.c | 23 +- .../blender/editors/space_file/file_intern.h | 2 +- source/blender/editors/space_file/file_ops.c | 92 +- .../blender/editors/space_file/file_panels.c | 24 +- source/blender/editors/space_file/filelist.c | 356 +- source/blender/editors/space_file/filelist.h | 12 +- source/blender/editors/space_file/filesel.c | 55 +- .../blender/editors/space_file/space_file.c | 48 +- .../editors/space_graph/graph_buttons.c | 10 +- .../blender/editors/space_graph/graph_draw.c | 4 +- .../blender/editors/space_graph/graph_edit.c | 69 +- .../editors/space_graph/graph_header.c | 10 +- .../editors/space_graph/graph_select.c | 9 +- .../blender/editors/space_graph/space_graph.c | 4 + .../editors/space_image/image_buttons.c | 39 +- .../blender/editors/space_image/image_draw.c | 39 +- .../editors/space_image/image_intern.h | 1 + .../blender/editors/space_image/image_ops.c | 32 +- .../blender/editors/space_image/space_image.c | 28 +- source/blender/editors/space_info/info_ops.c | 10 +- .../blender/editors/space_info/info_stats.c | 4 +- .../blender/editors/space_info/space_info.c | 5 +- .../editors/space_logic/logic_buttons.c | 10 +- .../editors/space_logic/logic_window.c | 112 +- .../blender/editors/space_logic/space_logic.c | 7 + .../blender/editors/space_nla/nla_buttons.c | 13 +- source/blender/editors/space_nla/nla_draw.c | 2 +- source/blender/editors/space_nla/space_nla.c | 4 + source/blender/editors/space_node/drawnode.c | 225 +- source/blender/editors/space_node/node_draw.c | 2 +- source/blender/editors/space_node/node_edit.c | 284 +- .../blender/editors/space_node/node_intern.h | 10 +- source/blender/editors/space_node/node_ops.c | 16 +- .../blender/editors/space_node/node_select.c | 128 +- .../blender/editors/space_node/space_node.c | 9 + .../blender/editors/space_outliner/outliner.c | 11 +- .../editors/space_outliner/space_outliner.c | 8 + .../editors/space_script/script_edit.c | 8 +- .../blender/editors/space_script/script_ops.c | 2 +- .../editors/space_sequencer/sequencer_add.c | 48 +- .../space_sequencer/sequencer_buttons.c | 11 +- .../editors/space_sequencer/sequencer_draw.c | 106 - .../editors/space_sequencer/sequencer_edit.c | 52 +- .../space_sequencer/sequencer_select.c | 20 +- .../editors/space_sequencer/space_sequencer.c | 9 + .../blender/editors/space_text/space_text.c | 45 +- .../blender/editors/space_text/text_header.c | 11 +- .../blender/editors/space_text/text_intern.h | 2 - source/blender/editors/space_text/text_ops.c | 189 +- .../blender/editors/space_time/space_time.c | 11 + source/blender/editors/space_time/time_ops.c | 2 + .../blender/editors/space_view3d/SConscript | 1 + .../editors/space_view3d/drawarmature.c | 4 +- .../blender/editors/space_view3d/drawobject.c | 404 +- .../blender/editors/space_view3d/drawvolume.c | 191 +- .../editors/space_view3d/space_view3d.c | 43 +- .../editors/space_view3d/view3d_buttons.c | 373 +- .../editors/space_view3d/view3d_draw.c | 26 +- .../editors/space_view3d/view3d_edit.c | 2 +- .../editors/space_view3d/view3d_header.c | 24 +- .../editors/space_view3d/view3d_intern.h | 2 +- .../blender/editors/space_view3d/view3d_ops.c | 22 +- .../editors/space_view3d/view3d_select.c | 169 +- .../editors/space_view3d/view3d_snap.c | 22 +- .../editors/space_view3d/view3d_toolbar.c | 11 +- .../editors/space_view3d/view3d_view.c | 72 +- source/blender/editors/transform/transform.c | 187 +- source/blender/editors/transform/transform.h | 1 + .../editors/transform/transform_conversions.c | 239 +- .../editors/transform/transform_generics.c | 16 +- .../editors/transform/transform_manipulator.c | 22 +- .../blender/editors/transform/transform_ops.c | 27 +- .../transform/transform_orientations.c | 2 +- source/blender/editors/util/editmode_undo.c | 2 +- source/blender/editors/util/undo.c | 1 + source/blender/editors/uvedit/uvedit_ops.c | 95 +- .../editors/uvedit/uvedit_unwrap_ops.c | 74 +- source/blender/gpu/CMakeLists.txt | 4 +- source/blender/gpu/GPU_draw.h | 2 +- source/blender/gpu/SConscript | 4 +- source/blender/gpu/intern/Makefile | 1 + source/blender/gpu/intern/gpu_draw.c | 16 +- source/blender/gpu/intern/gpu_extensions.c | 21 +- source/blender/imbuf/CMakeLists.txt | 28 +- source/blender/imbuf/SConscript | 2 +- source/blender/imbuf/intern/anim.c | 36 +- source/blender/imbuf/intern/anim5.c | 16 +- .../imbuf/intern/cineon/CMakeLists.txt | 16 +- source/blender/imbuf/intern/cineon/SConscript | 2 +- .../blender/imbuf/intern/dds/CMakeLists.txt | 18 +- source/blender/imbuf/intern/dds/SConscript | 2 +- source/blender/imbuf/intern/hamx.c | 10 +- source/blender/imbuf/intern/iff.c | 7 +- source/blender/imbuf/intern/jp2.c | 4 +- .../imbuf/intern/openexr/CMakeLists.txt | 20 +- .../blender/imbuf/intern/openexr/SConscript | 2 +- source/blender/imbuf/intern/thumbs.c | 20 +- source/blender/imbuf/intern/writeimage.c | 8 +- source/blender/makesdna/DNA_ID.h | 65 +- source/blender/makesdna/DNA_action_types.h | 64 +- source/blender/makesdna/DNA_cloth_types.h | 2 +- .../blender/makesdna/DNA_constraint_types.h | 10 +- source/blender/makesdna/DNA_curve_types.h | 68 +- source/blender/makesdna/DNA_gpencil_types.h | 4 +- source/blender/makesdna/DNA_material_types.h | 2 + source/blender/makesdna/DNA_modifier_types.h | 4 +- source/blender/makesdna/DNA_object_fluidsim.h | 1 + source/blender/makesdna/DNA_object_force.h | 11 +- source/blender/makesdna/DNA_object_types.h | 9 +- source/blender/makesdna/DNA_particle_types.h | 66 +- source/blender/makesdna/DNA_scene_types.h | 30 +- source/blender/makesdna/DNA_smoke_types.h | 28 +- source/blender/makesdna/DNA_sound_types.h | 93 +- source/blender/makesdna/DNA_space_types.h | 8 +- source/blender/makesdna/DNA_texture_types.h | 7 +- source/blender/makesdna/DNA_userdef_types.h | 1 + .../makesdna/DNA_windowmanager_types.h | 4 + source/blender/makesdna/SConscript | 2 +- source/blender/makesdna/intern/CMakeLists.txt | 6 +- source/blender/makesdna/intern/SConscript | 3 + source/blender/makesrna/RNA_access.h | 10 +- source/blender/makesrna/RNA_define.h | 11 +- source/blender/makesrna/RNA_enum_types.h | 5 + source/blender/makesrna/RNA_types.h | 13 +- source/blender/makesrna/SConscript | 5 +- source/blender/makesrna/intern/CMakeLists.txt | 48 +- source/blender/makesrna/intern/Makefile | 12 + source/blender/makesrna/intern/SConscript | 18 +- source/blender/makesrna/intern/makesrna.c | 240 +- source/blender/makesrna/intern/rna_ID.c | 2 + source/blender/makesrna/intern/rna_access.c | 273 +- source/blender/makesrna/intern/rna_action.c | 24 +- .../blender/makesrna/intern/rna_animation.c | 7 +- source/blender/makesrna/intern/rna_armature.c | 26 +- source/blender/makesrna/intern/rna_boid.c | 103 +- source/blender/makesrna/intern/rna_brush.c | 20 +- source/blender/makesrna/intern/rna_cloth.c | 73 +- .../blender/makesrna/intern/rna_constraint.c | 30 +- source/blender/makesrna/intern/rna_curve.c | 259 +- source/blender/makesrna/intern/rna_define.c | 167 +- source/blender/makesrna/intern/rna_fcurve.c | 48 +- source/blender/makesrna/intern/rna_fluidsim.c | 29 +- source/blender/makesrna/intern/rna_gpencil.c | 252 + source/blender/makesrna/intern/rna_group.c | 4 +- source/blender/makesrna/intern/rna_internal.h | 4 + .../makesrna/intern/rna_internal_types.h | 25 +- source/blender/makesrna/intern/rna_key.c | 5 +- source/blender/makesrna/intern/rna_lamp.c | 2 +- source/blender/makesrna/intern/rna_lattice.c | 14 +- source/blender/makesrna/intern/rna_main.c | 33 +- source/blender/makesrna/intern/rna_main_api.c | 4 +- source/blender/makesrna/intern/rna_material.c | 120 +- source/blender/makesrna/intern/rna_mesh.c | 165 +- source/blender/makesrna/intern/rna_mesh_api.c | 11 +- source/blender/makesrna/intern/rna_meta.c | 16 +- source/blender/makesrna/intern/rna_modifier.c | 359 +- source/blender/makesrna/intern/rna_nla.c | 32 +- source/blender/makesrna/intern/rna_nodetree.c | 156 +- .../makesrna/intern/rna_nodetree_types.h | 5 +- source/blender/makesrna/intern/rna_object.c | 55 +- .../blender/makesrna/intern/rna_object_api.c | 85 +- .../makesrna/intern/rna_object_force.c | 90 +- .../blender/makesrna/intern/rna_packedfile.c | 7 + source/blender/makesrna/intern/rna_particle.c | 496 +- source/blender/makesrna/intern/rna_pose.c | 185 +- source/blender/makesrna/intern/rna_render.c | 70 +- source/blender/makesrna/intern/rna_rna.c | 84 +- source/blender/makesrna/intern/rna_scene.c | 138 +- .../makesrna/intern/rna_sculpt_paint.c | 154 +- source/blender/makesrna/intern/rna_sensor.c | 30 +- source/blender/makesrna/intern/rna_sequence.c | 15 +- source/blender/makesrna/intern/rna_smoke.c | 112 +- source/blender/makesrna/intern/rna_sound.c | 29 + source/blender/makesrna/intern/rna_space.c | 245 +- source/blender/makesrna/intern/rna_test.c | 188 + source/blender/makesrna/intern/rna_text.c | 2 + source/blender/makesrna/intern/rna_text_api.c | 49 + source/blender/makesrna/intern/rna_texture.c | 83 +- source/blender/makesrna/intern/rna_ui_api.c | 7 +- source/blender/makesrna/intern/rna_userdef.c | 444 +- source/blender/makesrna/intern/rna_wm.c | 11 +- source/blender/makesrna/intern/rna_world.c | 3 + source/blender/nodes/CMP_node.h | 7 +- source/blender/nodes/CMakeLists.txt | 26 +- source/blender/nodes/SConscript | 8 +- .../nodes/intern/CMP_nodes/CMP_channelMatte.c | 4 +- .../nodes/intern/CMP_nodes/CMP_chromaMatte.c | 4 +- .../nodes/intern/CMP_nodes/CMP_colorMatte.c | 132 + .../nodes/intern/CMP_nodes/CMP_diffMatte.c | 174 +- .../intern/CMP_nodes/CMP_distanceMatte.c | 145 + .../nodes/intern/CMP_nodes/CMP_levels.c | 337 + .../nodes/intern/CMP_nodes/CMP_lummaMatte.c | 2 +- source/blender/nodes/intern/CMP_util.c | 26 +- source/blender/nodes/intern/CMP_util.h | 5 +- .../nodes/intern/TEX_nodes/TEX_rotate.c | 8 +- source/blender/python/CMakeLists.txt | 16 +- source/blender/python/SConscript | 4 +- source/blender/python/epy_doc_gen.py | 214 +- source/blender/python/generic/Geometry.c | 2 +- source/blender/python/generic/Mathutils.c | 38 +- .../python/generic/bpy_internal_import.h | 9 + source/blender/python/generic/matrix.c | 43 +- source/blender/python/generic/vector.c | 50 +- source/blender/python/intern/bpy_array.c | 388 +- source/blender/python/intern/bpy_interface.c | 52 +- source/blender/python/intern/bpy_operator.c | 102 +- .../blender/python/intern/bpy_operator_wrap.c | 4 +- source/blender/python/intern/bpy_rna.c | 414 +- source/blender/python/intern/bpy_rna.h | 13 +- source/blender/python/intern/bpy_util.c | 38 - source/blender/python/intern/bpy_util.h | 2 - source/blender/quicktime/CMakeLists.txt | 24 +- source/blender/quicktime/SConscript | 4 +- source/blender/readblenfile/CMakeLists.txt | 2 +- source/blender/readblenfile/SConscript | 2 +- .../readblenfile/intern/BLO_readblenfile.c | 1 + source/blender/render/CMakeLists.txt | 18 +- .../render/intern/include/render_types.h | 1 + .../render/intern/include/volume_precache.h | 3 +- .../render/intern/source/convertblender.c | 120 +- source/blender/render/intern/source/envmap.c | 80 +- .../blender/render/intern/source/initrender.c | 2 +- .../blender/render/intern/source/pipeline.c | 2 +- .../render/intern/source/pixelshading.c | 12 +- .../blender/render/intern/source/rayshade.c | 17 +- .../blender/render/intern/source/rendercore.c | 2 +- source/blender/render/intern/source/shadbuf.c | 16 +- .../blender/render/intern/source/shadeinput.c | 18 +- .../render/intern/source/shadeoutput.c | 8 +- source/blender/render/intern/source/sss.c | 13 +- source/blender/render/intern/source/strand.c | 4 +- source/blender/render/intern/source/texture.c | 69 +- .../render/intern/source/volume_precache.c | 29 +- .../blender/render/intern/source/volumetric.c | 178 +- .../blender/render/intern/source/voxeldata.c | 16 +- source/blender/render/intern/source/zbuf.c | 2 +- source/blender/windowmanager/CMakeLists.txt | 46 +- source/blender/windowmanager/WM_api.h | 7 +- source/blender/windowmanager/WM_types.h | 52 +- source/blender/windowmanager/intern/wm.c | 10 +- .../windowmanager/intern/wm_event_system.c | 75 +- .../blender/windowmanager/intern/wm_files.c | 64 +- source/blender/windowmanager/intern/wm_jobs.c | 1 + .../blender/windowmanager/intern/wm_keymap.c | 40 +- .../windowmanager/intern/wm_operators.c | 388 +- source/blenderplayer/CMakeLists.txt | 144 + .../bad_level_call_stubs/CMakeLists.txt | 40 + .../bad_level_call_stubs/Makefile | 45 + .../bad_level_call_stubs/SConscript | 13 + .../bad_level_call_stubs/stubs.c | 200 + source/creator/CMakeLists.txt | 400 +- .../gameengine/BlenderRoutines/CMakeLists.txt | 68 +- .../BlenderRoutines/KX_BlenderGL.cpp | 34 +- .../gameengine/BlenderRoutines/KX_BlenderGL.h | 4 +- .../BlenderRoutines/KX_BlenderRenderTools.cpp | 8 +- source/gameengine/BlenderRoutines/SConscript | 8 +- source/gameengine/CMakeLists.txt | 2 +- .../Converter/BL_BlenderDataConversion.cpp | 4 +- .../Converter/BL_ShapeActionActuator.cpp | 12 +- source/gameengine/Converter/CMakeLists.txt | 68 +- .../Converter/KX_ConvertActuators.cpp | 2 +- .../Converter/KX_ConvertProperties.cpp | 10 +- source/gameengine/Converter/SConscript | 2 +- source/gameengine/Expressions/CMakeLists.txt | 14 +- .../gameengine/Expressions/PyObjectPlus.cpp | 77 +- source/gameengine/Expressions/PyObjectPlus.h | 5 +- source/gameengine/Expressions/SConscript | 8 +- source/gameengine/GameLogic/CMakeLists.txt | 20 +- source/gameengine/GameLogic/SConscript | 6 +- source/gameengine/GamePlayer/CMakeLists.txt | 2 +- .../GamePlayer/common/CMakeLists.txt | 82 +- .../GamePlayer/common/GPC_Engine.cpp | 11 +- .../gameengine/GamePlayer/common/GPC_Engine.h | 3 - .../gameengine/GamePlayer/common/SConscript | 8 +- .../GamePlayer/ghost/CMakeLists.txt | 74 +- .../GamePlayer/ghost/GPG_Application.cpp | 26 +- .../GamePlayer/ghost/GPG_Application.h | 3 - .../gameengine/GamePlayer/ghost/GPG_ghost.cpp | 11 + source/gameengine/GamePlayer/ghost/SConscript | 12 +- source/gameengine/Ketsji/CMakeLists.txt | 70 +- .../Ketsji/KXNetwork/CMakeLists.txt | 20 +- source/gameengine/Ketsji/KXNetwork/SConscript | 9 +- source/gameengine/Ketsji/KX_GameObject.cpp | 24 +- source/gameengine/Ketsji/KX_NearSensor.cpp | 33 +- source/gameengine/Ketsji/KX_NearSensor.h | 3 + .../gameengine/Ketsji/KX_ObjectActuator.cpp | 4 +- source/gameengine/Ketsji/KX_PolyProxy.cpp | 10 +- source/gameengine/Ketsji/KX_PyMath.h | 9 +- source/gameengine/Ketsji/KX_PythonInit.cpp | 44 +- source/gameengine/Ketsji/KX_PythonSeq.cpp | 40 +- source/gameengine/Ketsji/SConscript | 6 +- source/gameengine/Network/CMakeLists.txt | 8 +- .../Network/LoopBackNetwork/CMakeLists.txt | 8 +- .../Network/LoopBackNetwork/SConscript | 2 +- source/gameengine/Network/SConscript | 2 +- .../gameengine/Physics/Bullet/CMakeLists.txt | 34 +- .../Physics/Bullet/CcdPhysicsController.cpp | 2 +- .../Physics/Bullet/CcdPhysicsEnvironment.cpp | 4 +- source/gameengine/Physics/Bullet/SConscript | 8 +- .../gameengine/Physics/Dummy/CMakeLists.txt | 4 +- source/gameengine/Physics/Dummy/SConscript | 2 +- .../gameengine/Physics/common/CMakeLists.txt | 6 +- source/gameengine/Physics/common/SConscript | 8 +- source/gameengine/PyDoc/GameLogic.py | 8 - source/gameengine/Rasterizer/CMakeLists.txt | 18 +- .../Rasterizer/RAS_MaterialBucket.h | 3 + .../RAS_OpenGLRasterizer/CMakeLists.txt | 24 +- .../RAS_OpenGLRasterizer/SConscript | 8 +- source/gameengine/Rasterizer/RAS_Polygon.cpp | 15 + source/gameengine/Rasterizer/RAS_Polygon.h | 1 + source/gameengine/Rasterizer/SConscript | 8 +- source/gameengine/SceneGraph/CMakeLists.txt | 4 +- source/gameengine/SceneGraph/SConscript | 8 +- source/gameengine/VideoTexture/CMakeLists.txt | 50 +- source/gameengine/VideoTexture/SConscript | 8 +- source/icons/SConscript | 2 +- source/kernel/CMakeLists.txt | 10 +- source/kernel/SConscript | 2 +- source/nan_compile.mk | 140 +- source/nan_definitions.mk | 18 +- source/nan_link.mk | 2 +- source/nan_warn.mk | 23 +- tools/Blender.py | 11 +- tools/btools.py | 8 +- 686 files changed, 43627 insertions(+), 31602 deletions(-) delete mode 100644 blenderplayer/CMakeLists.txt delete mode 100644 release/datafiles/datatoc.c create mode 100755 release/datafiles/datatoc.py delete mode 100644 release/datafiles/splash.jpg create mode 100644 release/datafiles/splash.png create mode 100644 release/io/netrender/__init__.py create mode 100644 release/io/netrender/client.py create mode 100644 release/io/netrender/master.py create mode 100644 release/io/netrender/model.py create mode 100644 release/io/netrender/operators.py create mode 100644 release/io/netrender/slave.py create mode 100644 release/io/netrender/ui.py create mode 100644 release/io/netrender/utils.py create mode 100644 release/scripts/import_edl.py create mode 100644 release/test/rna_array.py create mode 100644 release/windows/inno/blender.iss create mode 100644 release/windows/inno/copyright.txt create mode 100644 release/windows/inno/header.bmp create mode 100644 release/windows/inno/installer.bmp create mode 100644 release/windows/inno/installer.ico delete mode 100644 source/blender/blenkernel/BKE_sculpt.h delete mode 100644 source/blender/blenlib/MTC_matrixops.h delete mode 100644 source/blender/blenlib/MTC_vectorops.h delete mode 100644 source/blender/blenlib/intern/matrixops.c delete mode 100644 source/blender/blenlib/intern/vectorops.c rename source/blender/editors/datafiles/{splash.jpg.c => splash.png.c} (99%) create mode 100644 source/blender/editors/gpencil/gpencil_buttons.c create mode 100644 source/blender/editors/gpencil/gpencil_ops.c create mode 100644 source/blender/editors/gpencil/gpencil_paint.c create mode 100644 source/blender/editors/include/ED_sound.h rename source/blender/editors/metaball/{editmball.c => mball_edit.c} (93%) create mode 100644 source/blender/editors/object/object_add.c rename source/blender/editors/object/{editconstraint.c => object_constraint.c} (97%) rename source/blender/editors/object/{editgroup.c => object_group.c} (60%) create mode 100644 source/blender/editors/object/object_hook.c rename source/blender/editors/object/{editlattice.c => object_lattice.c} (95%) create mode 100644 source/blender/editors/object/object_relations.c create mode 100644 source/blender/editors/object/object_select.c rename source/blender/editors/object/{editkey.c => object_shapekey.c} (85%) create mode 100644 source/blender/editors/object/object_transform.c create mode 100644 source/blender/editors/sound/Makefile create mode 100644 source/blender/editors/sound/SConscript create mode 100644 source/blender/editors/sound/sound_intern.h create mode 100644 source/blender/editors/sound/sound_ops.c create mode 100644 source/blender/makesrna/intern/rna_gpencil.c create mode 100644 source/blender/makesrna/intern/rna_test.c create mode 100644 source/blender/makesrna/intern/rna_text_api.c create mode 100644 source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c create mode 100644 source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c create mode 100644 source/blender/nodes/intern/CMP_nodes/CMP_levels.c create mode 100644 source/blenderplayer/CMakeLists.txt create mode 100644 source/blenderplayer/bad_level_call_stubs/CMakeLists.txt create mode 100644 source/blenderplayer/bad_level_call_stubs/Makefile create mode 100644 source/blenderplayer/bad_level_call_stubs/SConscript create mode 100644 source/blenderplayer/bad_level_call_stubs/stubs.c diff --git a/CMakeLists.txt b/CMakeLists.txt index d1e18723f5d..c881dec03db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,11 +34,11 @@ IF(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) MESSAGE(FATAL_ERROR "CMake generation for blender is not allowed within the source directory! Remove the CMakeCache.txt file and try again from another folder, e.g.: - rm CMakeCache.txt - cd .. - mkdir cmake-make - cd cmake-make - cmake -G \"Unix Makefiles\" ../blender + rm CMakeCache.txt + cd .. + mkdir cmake-make + cd cmake-make + cmake -G \"Unix Makefiles\" ../blender ") ENDIF(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) @@ -76,7 +76,7 @@ OPTION(WITH_CXX_GUARDEDALLOC "Enable GuardedAlloc for C++ memory allocation" OFF OPTION(WITH_INSTALL "Install accompanying scripts and language files needed to run blender" ON) IF(NOT WITH_GAMEENGINE AND WITH_PLAYER) - MESSAGE("WARNING: WITH_PLAYER needs WITH_GAMEENGINE") + MESSAGE("WARNING: WITH_PLAYER needs WITH_GAMEENGINE") ENDIF(NOT WITH_GAMEENGINE AND WITH_PLAYER) # For alternate Python locations the commandline can be used to override detected/default cache settings, e.g: @@ -95,421 +95,421 @@ INCLUDE(CMake/macros.cmake) #Platform specifics IF(UNIX AND NOT APPLE) - IF(WITH_OPENAL) - FIND_PACKAGE(OpenAL) - IF(OPENAL_FOUND) - SET(WITH_OPENAL ON) - ELSE(OPENAL_FOUND) - SET(WITH_OPENAL OFF) - ENDIF(OPENAL_FOUND) - ENDIF(WITH_OPENAL) + IF(WITH_OPENAL) + FIND_PACKAGE(OpenAL) + IF(OPENAL_FOUND) + SET(WITH_OPENAL ON) + ELSE(OPENAL_FOUND) + SET(WITH_OPENAL OFF) + ENDIF(OPENAL_FOUND) + ENDIF(WITH_OPENAL) - IF(WITH_JACK) - SET(JACK /usr) - SET(JACK_INC ${JACK}/include/jack) - SET(JACK_LIB jack) - SET(JACK_LIBPATH ${JACK}/lib) - ENDIF(WITH_JACK) + IF(WITH_JACK) + SET(JACK /usr) + SET(JACK_INC ${JACK}/include/jack) + SET(JACK_LIB jack) + SET(JACK_LIBPATH ${JACK}/lib) + ENDIF(WITH_JACK) - IF(WITH_SNDFILE) + IF(WITH_SNDFILE) SET(SNDFILE /usr) SET(SNDFILE_INC ${SNDFILE}/include) SET(SNDFILE_LIB sndfile) SET(SNDFILE_LIBPATH ${SNDFILE}/lib) - ENDIF(WITH_SNDFILE) + ENDIF(WITH_SNDFILE) - FIND_LIBRARY(INTL_LIBRARY - NAMES intl - PATHS - /sw/lib - ) - FIND_LIBRARY(ICONV_LIBRARY - NAMES iconv - PATHS - /sw/lib - ) + FIND_LIBRARY(INTL_LIBRARY + NAMES intl + PATHS + /sw/lib + ) + FIND_LIBRARY(ICONV_LIBRARY + NAMES iconv + PATHS + /sw/lib + ) - IF(INTL_LIBRARY AND ICONV_LIBRARY) - SET(GETTEXT_LIB ${INTL_LIBRARY} ${ICONV_LIBRARY}) - ENDIF(INTL_LIBRARY AND ICONV_LIBRARY) + IF(INTL_LIBRARY AND ICONV_LIBRARY) + SET(GETTEXT_LIB ${INTL_LIBRARY} ${ICONV_LIBRARY}) + ENDIF(INTL_LIBRARY AND ICONV_LIBRARY) - FIND_PACKAGE(Freetype) - # UNSET(FREETYPE_INCLUDE_DIRS CACHE) # cant use + FIND_PACKAGE(Freetype) + # UNSET(FREETYPE_INCLUDE_DIRS CACHE) # cant use - # No way to set py31. remove for now. - # FIND_PACKAGE(PythonLibs) - SET(PYTHON /usr) - SET(PYTHON_VERSION 3.1) - SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}" CACHE STRING "") - # SET(PYTHON_BINARY python) # not used yet - SET(PYTHON_LIB python${PYTHON_VERSION} CACHE STRING "") - SET(PYTHON_LIBPATH ${PYTHON}/lib CACHE STRING "") + # No way to set py31. remove for now. + # FIND_PACKAGE(PythonLibs) + SET(PYTHON /usr) + SET(PYTHON_VERSION 3.1) + SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}" CACHE STRING "") + # SET(PYTHON_BINARY python) # not used yet + SET(PYTHON_LIB python${PYTHON_VERSION} CACHE STRING "") + SET(PYTHON_LIBPATH ${PYTHON}/lib CACHE STRING "") - # FIND_PACKAGE(PythonInterp) # not used yet - # SET(PYTHON_BINARY ${PYTHON_EXECUTABLE} CACHE STRING "") + # FIND_PACKAGE(PythonInterp) # not used yet + # SET(PYTHON_BINARY ${PYTHON_EXECUTABLE} CACHE STRING "") - SET(PYTHON_LINKFLAGS "-Xlinker -export-dynamic") + SET(PYTHON_LINKFLAGS "-Xlinker -export-dynamic") - IF(WITH_SDL) - FIND_PACKAGE(SDL) - # UNSET(SDLMAIN_LIBRARY CACHE) - IF(NOT SDL_FOUND) - SET(WITH_SDL OFF) - ENDIF(NOT SDL_FOUND) - ENDIF(WITH_SDL) + IF(WITH_SDL) + FIND_PACKAGE(SDL) + # UNSET(SDLMAIN_LIBRARY CACHE) + IF(NOT SDL_FOUND) + SET(WITH_SDL OFF) + ENDIF(NOT SDL_FOUND) + ENDIF(WITH_SDL) - FIND_PATH(OPENEXR_INC - ImfXdr.h - PATHS - /usr/local/include/OpenEXR - /usr/include/OpenEXR - /sw/include/OpenEXR - /opt/local/include/OpenEXR - /opt/csw/include/OpenEXR - /opt/include/OpenEXR - ) - SET(OPENEXR_LIB Half IlmImf Iex Imath) + FIND_PATH(OPENEXR_INC + ImfXdr.h + PATHS + /usr/local/include/OpenEXR + /usr/include/OpenEXR + /sw/include/OpenEXR + /opt/local/include/OpenEXR + /opt/csw/include/OpenEXR + /opt/include/OpenEXR + ) + SET(OPENEXR_LIB Half IlmImf Iex Imath) - SET(FFMPEG /usr) - SET(FFMPEG_INC ${FFMPEG}/include) - SET(FFMPEG_LIB avformat avcodec avutil avdevice swscale) - SET(FFMPEG_LIBPATH ${FFMPEG}/lib) + SET(FFMPEG /usr) + SET(FFMPEG_INC ${FFMPEG}/include) + SET(FFMPEG_LIB avformat avcodec avutil avdevice swscale) + SET(FFMPEG_LIBPATH ${FFMPEG}/lib) - IF(WITH_FFTW3) - SET(FFTW3 /usr) - SET(FFTW3_INC ${FFTW3}/include) - SET(FFTW3_LIB fftw3) - SET(FFTW3_LIBPATH ${FFTW3}/lib) - ENDIF(WITH_FFTW3) + IF(WITH_FFTW3) + SET(FFTW3 /usr) + SET(FFTW3_INC ${FFTW3}/include) + SET(FFTW3_LIB fftw3) + SET(FFTW3_LIBPATH ${FFTW3}/lib) + ENDIF(WITH_FFTW3) - SET(LIBSAMPLERATE /usr) - SET(LIBSAMPLERATE_INC ${LIBSAMPLERATE}/include) - SET(LIBSAMPLERATE_LIB samplerate) - SET(LIBSAMPLERATE_LIBPATH ${LIBSAMPLERATE}/lib) + SET(LIBSAMPLERATE /usr) + SET(LIBSAMPLERATE_INC ${LIBSAMPLERATE}/include) + SET(LIBSAMPLERATE_LIB samplerate) + SET(LIBSAMPLERATE_LIBPATH ${LIBSAMPLERATE}/lib) - FIND_PACKAGE(JPEG REQUIRED) + FIND_PACKAGE(JPEG REQUIRED) - FIND_PACKAGE(PNG REQUIRED) + FIND_PACKAGE(PNG REQUIRED) - FIND_PACKAGE(ZLIB REQUIRED) + FIND_PACKAGE(ZLIB REQUIRED) - # Could use ${X11_Xinput_LIB} ${X11_X11_LIB} too - SET(LLIBS "-lXi -lutil -lc -lm -lpthread -lstdc++ -lX11") + # Could use ${X11_Xinput_LIB} ${X11_X11_LIB} too + SET(LLIBS "-lXi -lutil -lc -lm -lpthread -lstdc++ -lX11") - IF(CMAKE_SYSTEM_NAME MATCHES "Linux") - # BSD's dont use libdl.so - SET(LLIBS "${LLIBS} -ldl") - ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") + IF(CMAKE_SYSTEM_NAME MATCHES "Linux") + # BSD's dont use libdl.so + SET(LLIBS "${LLIBS} -ldl") + ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") - IF(WITH_OPENMP) - SET(LLIBS "${LLIBS} -lgomp") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp") - ENDIF(WITH_OPENMP) + IF(WITH_OPENMP) + SET(LLIBS "${LLIBS} -lgomp") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp") + ENDIF(WITH_OPENMP) - SET(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing -DXP_UNIX -Wno-char-subscripts") + SET(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing -DXP_UNIX -Wno-char-subscripts") - SET(PLATFORM_LINKFLAGS "-pthread") + SET(PLATFORM_LINKFLAGS "-pthread") - # Better warnings - SET(C_WARNINGS "-Wall -Wno-char-subscripts -Wpointer-arith -Wcast-align -Wdeclaration-after-statement") - SET(CXX_WARNINGS "-Wall -Wno-invalid-offsetof -Wno-sign-compare") + # Better warnings + SET(C_WARNINGS "-Wall -Wno-char-subscripts -Wpointer-arith -Wcast-align -Wdeclaration-after-statement") + SET(CXX_WARNINGS "-Wall -Wno-invalid-offsetof -Wno-sign-compare") - INCLUDE_DIRECTORIES(${JPEG_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR} ) + INCLUDE_DIRECTORIES(${JPEG_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR} ) ENDIF(UNIX AND NOT APPLE) IF(WIN32) - # this file is included anyway when building under Windows with cl.exe - # INCLUDE(${CMAKE_ROOT}/Modules/Platform/Windows-cl.cmake) + # this file is included anyway when building under Windows with cl.exe + # INCLUDE(${CMAKE_ROOT}/Modules/Platform/Windows-cl.cmake) - SET(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/windows) + SET(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/windows) - # Setup 64bit and 64bit windows systems - IF(CMAKE_CL_64) - message("64 bit compiler detected.") - SET(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/win64) - ENDIF(CMAKE_CL_64) + # Setup 64bit and 64bit windows systems + IF(CMAKE_CL_64) + message("64 bit compiler detected.") + SET(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/win64) + ENDIF(CMAKE_CL_64) - SET(PYTHON ${LIBDIR}/python) - SET(PYTHON_VERSION 3.1) - SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}") - # SET(PYTHON_BINARY python) # not used yet - SET(PYTHON_LIB python31) - SET(PYTHON_LIBPATH ${PYTHON}/lib) + SET(PYTHON ${LIBDIR}/python) + SET(PYTHON_VERSION 3.1) + SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}") + # SET(PYTHON_BINARY python) # not used yet + SET(PYTHON_LIB python31) + SET(PYTHON_LIBPATH ${PYTHON}/lib) - IF(CMAKE_CL_64) - SET(WITH_OPENAL OFF) - ELSE(CMAKE_CL_64) - #SET(WITH_OPENAL ON) - SET(OPENAL ${LIBDIR}/openal) - SET(OPENAL_INCLUDE_DIR ${OPENAL}/include) - SET(OPENAL_LIBRARY wrap_oal) - SET(OPENAL_LIBPATH ${OPENAL}/lib) - ENDIF(CMAKE_CL_64) + IF(CMAKE_CL_64) + SET(WITH_OPENAL OFF) + ELSE(CMAKE_CL_64) + #SET(WITH_OPENAL ON) + SET(OPENAL ${LIBDIR}/openal) + SET(OPENAL_INCLUDE_DIR ${OPENAL}/include) + SET(OPENAL_LIBRARY wrap_oal) + SET(OPENAL_LIBPATH ${OPENAL}/lib) + ENDIF(CMAKE_CL_64) - IF(WITH_JACK) - SET(JACK ${LIBDIR}/jack) - SET(JACK_INC ${JACK}/include/jack ${JACK}/include) - SET(JACK_LIB libjack) - SET(JACK_LIBPATH ${JACK}/lib) - ENDIF(WITH_JACK) + IF(WITH_JACK) + SET(JACK ${LIBDIR}/jack) + SET(JACK_INC ${JACK}/include/jack ${JACK}/include) + SET(JACK_LIB libjack) + SET(JACK_LIBPATH ${JACK}/lib) + ENDIF(WITH_JACK) - IF(WITH_SNDFILE) - SET(SNDFILE ${LIBDIR}/sndfile) - SET(SNDFILE_INC ${SNDFILE}/include) - SET(SNDFILE_LIB sndfile) - SET(SNDFILE_LIBPATH ${SNDFILE}/lib) - ENDIF(WITH_SNDFILE) + IF(WITH_SNDFILE) + SET(SNDFILE ${LIBDIR}/sndfile) + SET(SNDFILE_INC ${SNDFILE}/include) + SET(SNDFILE_LIB libsndfile-1) + SET(SNDFILE_LIBPATH ${SNDFILE}/lib) + ENDIF(WITH_SNDFILE) - IF(CMAKE_CL_64) - SET(PNG_LIBRARIES libpng) - ELSE(CMAKE_CL_64) - SET(PNG_LIBRARIES libpng_st) - ENDIF(CMAKE_CL_64) - SET(JPEG_LIBRARY libjpeg) + IF(CMAKE_CL_64) + SET(PNG_LIBRARIES libpng) + ELSE(CMAKE_CL_64) + SET(PNG_LIBRARIES libpng_st) + ENDIF(CMAKE_CL_64) + SET(JPEG_LIBRARY libjpeg) - SET(ZLIB ${LIBDIR}/zlib) - SET(ZLIB_INC ${ZLIB}/include) - IF(CMAKE_CL_64) - SET(ZLIB_LIBRARIES libz) - ELSE(CMAKE_CL_64) - SET(ZLIB_LIBRARIES zlib) - ENDIF(CMAKE_CL_64) - SET(ZLIB_LIBPATH ${ZLIB}/lib) + SET(ZLIB ${LIBDIR}/zlib) + SET(ZLIB_INC ${ZLIB}/include) + IF(CMAKE_CL_64) + SET(ZLIB_LIBRARIES libz) + ELSE(CMAKE_CL_64) + SET(ZLIB_LIBRARIES zlib) + ENDIF(CMAKE_CL_64) + SET(ZLIB_LIBPATH ${ZLIB}/lib) - SET(PTHREADS ${LIBDIR}/pthreads) - SET(PTHREADS_INC ${PTHREADS}/include) - SET(PTHREADS_LIB pthreadVC2) - SET(PTHREADS_LIBPATH ${PTHREADS}/lib) + SET(PTHREADS ${LIBDIR}/pthreads) + SET(PTHREADS_INC ${PTHREADS}/include) + SET(PTHREADS_LIB pthreadVC2) + SET(PTHREADS_LIBPATH ${PTHREADS}/lib) - SET(ICONV ${LIBDIR}/iconv) - SET(ICONV_INC ${ICONV}/include) - SET(ICONV_LIB iconv) - SET(ICONV_LIBPATH ${ICONV}/lib) + SET(ICONV ${LIBDIR}/iconv) + SET(ICONV_INC ${ICONV}/include) + SET(ICONV_LIB iconv) + SET(ICONV_LIBPATH ${ICONV}/lib) - IF(WITH_FFTW3) - SET(FFTW3 ${LIBDIR}/fftw3) - SET(FFTW3_INC ${FFTW3}/include) - SET(FFTW3_LIB libfftw) - SET(FFTW3_LIBPATH ${FFTW3}/lib) - ENDIF(WITH_FFTW3) + IF(WITH_FFTW3) + SET(FFTW3 ${LIBDIR}/fftw3) + SET(FFTW3_INC ${FFTW3}/include) + SET(FFTW3_LIB libfftw) + SET(FFTW3_LIBPATH ${FFTW3}/lib) + ENDIF(WITH_FFTW3) - SET(GETTEXT ${LIBDIR}/gettext) - SET(GETTEXT_INC ${GETTEXT}/include) - IF(CMAKE_CL_64) - SET(GETTEXT_LIB gettext) - ELSE(CMAKE_CL_64) - SET(GETTEXT_LIB gnu_gettext) - ENDIF(CMAKE_CL_64) - SET(GETTEXT_LIBPATH ${GETTEXT}/lib) + SET(GETTEXT ${LIBDIR}/gettext) + SET(GETTEXT_INC ${GETTEXT}/include) + IF(CMAKE_CL_64) + SET(GETTEXT_LIB gettext) + ELSE(CMAKE_CL_64) + SET(GETTEXT_LIB gnu_gettext) + ENDIF(CMAKE_CL_64) + SET(GETTEXT_LIBPATH ${GETTEXT}/lib) - SET(FREETYPE ${LIBDIR}/freetype) - SET(FREETYPE_INCLUDE_DIRS ${FREETYPE}/include ${FREETYPE}/include/freetype2) - SET(FREETYPE_LIBPATH ${FREETYPE}/lib) - SET(FREETYPE_LIBRARY freetype2ST) + SET(FREETYPE ${LIBDIR}/freetype) + SET(FREETYPE_INCLUDE_DIRS ${FREETYPE}/include ${FREETYPE}/include/freetype2) + SET(FREETYPE_LIBPATH ${FREETYPE}/lib) + SET(FREETYPE_LIBRARY freetype2ST) - SET(OPENEXR ${LIBDIR}/openexr) - SET(OPENEXR_INC ${OPENEXR}/include ${OPENEXR}/include/IlmImf ${OPENEXR}/include/Iex ${OPENEXR}/include/Imath) - SET(OPENEXR_LIB Iex Half IlmImf Imath IlmThread) - IF (MSVC80) - SET(OPENEXR_LIBPATH ${OPENEXR}/lib_vs2005) - ELSE (MSVC80) - SET(OPENEXR_LIBPATH ${OPENEXR}/lib_msvc) - ENDIF(MSVC80) - IF (MSVC90) - SET(OPENEXR_LIBPATH ${OPENEXR}/lib_vs2008) - ENDIF(MSVC90) + SET(OPENEXR ${LIBDIR}/openexr) + SET(OPENEXR_INC ${OPENEXR}/include ${OPENEXR}/include/IlmImf ${OPENEXR}/include/Iex ${OPENEXR}/include/Imath) + SET(OPENEXR_LIB Iex Half IlmImf Imath IlmThread) + IF (MSVC80) + SET(OPENEXR_LIBPATH ${OPENEXR}/lib_vs2005) + ELSE (MSVC80) + SET(OPENEXR_LIBPATH ${OPENEXR}/lib_msvc) + ENDIF(MSVC80) + IF (MSVC90) + SET(OPENEXR_LIBPATH ${OPENEXR}/lib_vs2008) + ENDIF(MSVC90) - SET(QUICKTIME ${LIBDIR}/QTDevWin) - SET(QUICKTIME_INC ${QUICKTIME}/CIncludes) - SET(QUICKTIME_LIB qtmlClient) - SET(QUICKTIME_LIBPATH ${QUICKTIME}/Libraries) + SET(QUICKTIME ${LIBDIR}/QTDevWin) + SET(QUICKTIME_INC ${QUICKTIME}/CIncludes) + SET(QUICKTIME_LIB qtmlClient) + SET(QUICKTIME_LIBPATH ${QUICKTIME}/Libraries) - SET(FFMPEG ${LIBDIR}/ffmpeg) - SET(FFMPEG_INC ${FFMPEG}/include) - SET(FFMPEG_LIB avcodec-52 avformat-52 avdevice-52 avutil-50 swscale-0) - SET(FFMPEG_LIBPATH ${FFMPEG}/lib) + SET(FFMPEG ${LIBDIR}/ffmpeg) + SET(FFMPEG_INC ${FFMPEG}/include ${FFMPEG}/include/msvc) + SET(FFMPEG_LIB avcodec-52 avformat-52 avdevice-52 avutil-50 swscale-0) + SET(FFMPEG_LIBPATH ${FFMPEG}/lib) - SET(LIBSAMPLERATE ${LIBDIR}/samplerate) - SET(LIBSAMPLERATE_INC ${LIBSAMPLERATE}/include) - SET(LIBSAMPLERATE_LIB libsamplerate) - SET(LIBSAMPLERATE_LIBPATH ${LIBSAMPLERATE}/lib) + SET(LIBSAMPLERATE ${LIBDIR}/samplerate) + SET(LIBSAMPLERATE_INC ${LIBSAMPLERATE}/include) + SET(LIBSAMPLERATE_LIB libsamplerate) + SET(LIBSAMPLERATE_LIBPATH ${LIBSAMPLERATE}/lib) - IF(CMAKE_CL_64) - SET(LLIBS kernel32 user32 vfw32 winmm ws2_32 ) - ELSE(CMAKE_CL_64) - SET(LLIBS kernel32 user32 gdi32 comdlg32 advapi32 shell32 ole32 oleaut32 uuid ws2_32 vfw32 winmm) - ENDIF(CMAKE_CL_64) + IF(CMAKE_CL_64) + SET(LLIBS kernel32 user32 vfw32 winmm ws2_32 ) + ELSE(CMAKE_CL_64) + SET(LLIBS kernel32 user32 gdi32 comdlg32 advapi32 shell32 ole32 oleaut32 uuid ws2_32 vfw32 winmm) + ENDIF(CMAKE_CL_64) - SET(CMAKE_CXX_FLAGS_DEBUG "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_CXX_FLAGS_RELEASE "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_CXX_FLAGS_MINSIZEREL "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_C_FLAGS_DEBUG "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_C_FLAGS_RELEASE "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_C_FLAGS_MINSIZEREL "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) - SET(CMAKE_C_FLAGS_RELWITHDEBINFO "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_CXX_FLAGS_DEBUG "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_CXX_FLAGS_RELEASE "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_CXX_FLAGS_MINSIZEREL "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_C_FLAGS_DEBUG "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /D_DEBUG /Od /Gm /EHsc /RTC1 /MTd /W3 /nologo /ZI /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_C_FLAGS_RELEASE "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob2 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_C_FLAGS_MINSIZEREL "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O1 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /J" CACHE STRING "MSVC MT flags " FORCE) + SET(CMAKE_C_FLAGS_RELWITHDEBINFO "/D_CRT_NONSTDC_NO_DEPRECATE /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /wd4800 /wd4244 /wd4305 /O2 /Ob1 /DNDEBUG /EHsc /MT /W3 /nologo /Zi /J" CACHE STRING "MSVC MT flags " FORCE) - IF(WITH_OPENMP) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /openmp ") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp ") - ENDIF(WITH_OPENMP) + IF(WITH_OPENMP) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /openmp ") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp ") + ENDIF(WITH_OPENMP) - SET(SDL ${LIBDIR}/sdl) - SET(SDL_INCLUDE_DIR ${SDL}/include) - SET(SDL_LIBRARY SDL) - SET(SDL_LIBPATH ${SDL}/lib) + SET(SDL ${LIBDIR}/sdl) + SET(SDL_INCLUDE_DIR ${SDL}/include) + SET(SDL_LIBRARY SDL) + SET(SDL_LIBPATH ${SDL}/lib) - SET(PNG "${LIBDIR}/png") - SET(PNG_INC "${PNG}/include") - SET(PNG_LIBPATH ${PNG}/lib) + SET(PNG "${LIBDIR}/png") + SET(PNG_INC "${PNG}/include") + SET(PNG_LIBPATH ${PNG}/lib) - SET(JPEG "${LIBDIR}/jpeg") - SET(JPEG_INC "${JPEG}/include") - SET(JPEG_LIBPATH ${JPEG}/lib) + SET(JPEG "${LIBDIR}/jpeg") + SET(JPEG_INC "${JPEG}/include") + SET(JPEG_LIBPATH ${JPEG}/lib) - SET(TIFF ${LIBDIR}/tiff) - SET(TIFF_INC ${TIFF}/include) + SET(TIFF ${LIBDIR}/tiff) + SET(TIFF_INC ${TIFF}/include) - SET(WINTAB_INC ${LIBDIR}/wintab/include) + SET(WINTAB_INC ${LIBDIR}/wintab/include) - IF(CMAKE_CL_64) - SET(PLATFORM_LINKFLAGS "/MANIFEST:NO /MANIFESTUAC:NO /MACHINE:X64 /NODEFAULTLIB:libc.lib;MSVCRT.lib ") - ELSE(CMAKE_CL_64) - SET(PLATFORM_LINKFLAGS "/NODEFAULTLIB:libc.lib ") - ENDIF(CMAKE_CL_64) + IF(CMAKE_CL_64) + SET(PLATFORM_LINKFLAGS "/MACHINE:X64 /NODEFAULTLIB:libc.lib;MSVCRT.lib ") + ELSE(CMAKE_CL_64) + SET(PLATFORM_LINKFLAGS "/NODEFAULTLIB:libc.lib ") + ENDIF(CMAKE_CL_64) - SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:libcmt.lib;libc.lib ") + SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:libcmt.lib;libc.lib ") ENDIF(WIN32) IF(APPLE) - IF(CMAKE_OSX_ARCHITECTURES MATCHES i386) - SET(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/darwin-8.x.i386) - ELSE(CMAKE_OSX_ARCHITECTURES MATCHES i386) - SET(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/darwin-6.1-powerpc) - ENDIF(CMAKE_OSX_ARCHITECTURES MATCHES i386) + IF(CMAKE_OSX_ARCHITECTURES MATCHES i386) + SET(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/darwin-8.x.i386) + ELSE(CMAKE_OSX_ARCHITECTURES MATCHES i386) + SET(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/darwin-6.1-powerpc) + ENDIF(CMAKE_OSX_ARCHITECTURES MATCHES i386) - IF(WITH_OPENAL) - FIND_PACKAGE(OpenAL) - IF(OPENAL_FOUND) - SET(WITH_OPENAL ON) - ELSE(OPENAL_FOUND) - SET(WITH_OPENAL OFF) - ENDIF(OPENAL_FOUND) - ENDIF(WITH_OPENAL) + IF(WITH_OPENAL) + FIND_PACKAGE(OpenAL) + IF(OPENAL_FOUND) + SET(WITH_OPENAL ON) + ELSE(OPENAL_FOUND) + SET(WITH_OPENAL OFF) + ENDIF(OPENAL_FOUND) + ENDIF(WITH_OPENAL) - IF(WITH_JACK) - SET(JACK /usr) - SET(JACK_INC ${JACK}/include/jack) - SET(JACK_LIB jack) - SET(JACK_LIBPATH ${JACK}/lib) - ENDIF(WITH_JACK) + IF(WITH_JACK) + SET(JACK /usr) + SET(JACK_INC ${JACK}/include/jack) + SET(JACK_LIB jack) + SET(JACK_LIBPATH ${JACK}/lib) + ENDIF(WITH_JACK) - IF(WITH_SNDFILE) - SET(SNDFILE /usr) - SET(SNDFILE_INC ${SNDFILE}/include) - SET(SNDFILE_LIB sndfile) - SET(SNDFILE_LIBPATH ${SNDFILE}/lib) - ENDIF(WITH_SNDFILE) + IF(WITH_SNDFILE) + SET(SNDFILE ${LIBDIR}/sndfile) + SET(SNDFILE_INC ${SNDFILE}/include) + SET(SNDFILE_LIB sndfile) + SET(SNDFILE_LIBPATH ${SNDFILE}/lib) + ENDIF(WITH_SNDFILE) - SET(PYTHON_VERSION 3.1) + SET(PYTHON_VERSION 3.1) - IF(PYTHON_VERSION MATCHES 3.1) - # we use precompiled libraries for py 3.1 and up by default + IF(PYTHON_VERSION MATCHES 3.1) + # we use precompiled libraries for py 3.1 and up by default - SET(PYTHON ${LIBDIR}/python) - SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}" CACHE STRING "") - # SET(PYTHON_BINARY "${PYTHON}/bin/python${PYTHON_VERSION}" CACHE STRING "") # not used yet - SET(PYTHON_LIB python${PYTHON_VERSION}) - SET(PYTHON_LIBPATH "${PYTHON}/lib/python${PYTHON_VERSION}" CACHE STRING "") - # SET(PYTHON_LINKFLAGS "-u _PyMac_Error") # won't build with this enabled - ELSE(PYTHON_VERSION MATCHES 3.1) - # otherwise, use custom system framework + SET(PYTHON ${LIBDIR}/python) + SET(PYTHON_INC "${PYTHON}/include/python${PYTHON_VERSION}" CACHE STRING "") + # SET(PYTHON_BINARY "${PYTHON}/bin/python${PYTHON_VERSION}" CACHE STRING "") # not used yet + SET(PYTHON_LIB python${PYTHON_VERSION}) + SET(PYTHON_LIBPATH "${PYTHON}/lib/python${PYTHON_VERSION}" CACHE STRING "") + # SET(PYTHON_LINKFLAGS "-u _PyMac_Error") # won't build with this enabled + ELSE(PYTHON_VERSION MATCHES 3.1) + # otherwise, use custom system framework - SET(PYTHON /System/Library/Frameworks/Python.framework/Versions/) - SET(PYTHON_VERSION 2.5) - SET(PYTHON_INC "${PYTHON}${PYTHON_VERSION}/include/python${PYTHON_VERSION}" CACHE STRING "") - # SET(PYTHON_BINARY ${PYTHON}${PYTHON_VERSION}/bin/python${PYTHON_VERSION} CACHE STRING "") # not used yet - SET(PYTHON_LIB "") - SET(PYTHON_LIBPATH ${PYTHON}${PYTHON_VERSION}/lib/python${PYTHON_VERSION}/config CACHE STRING "") - SET(PYTHON_LINKFLAGS "-u _PyMac_Error -framework System -framework Python") - ENDIF(PYTHON_VERSION MATCHES 3.1) + SET(PYTHON /System/Library/Frameworks/Python.framework/Versions/) + SET(PYTHON_VERSION 2.5) + SET(PYTHON_INC "${PYTHON}${PYTHON_VERSION}/include/python${PYTHON_VERSION}" CACHE STRING "") + # SET(PYTHON_BINARY ${PYTHON}${PYTHON_VERSION}/bin/python${PYTHON_VERSION} CACHE STRING "") # not used yet + SET(PYTHON_LIB "") + SET(PYTHON_LIBPATH ${PYTHON}${PYTHON_VERSION}/lib/python${PYTHON_VERSION}/config CACHE STRING "") + SET(PYTHON_LINKFLAGS "-u _PyMac_Error -framework System -framework Python") + ENDIF(PYTHON_VERSION MATCHES 3.1) - SET(GETTEXT ${LIBDIR}/gettext) - SET(GETTEXT_INC "${GETTEXT}/include") - SET(GETTEXT_LIB intl iconv) - SET(GETTEXT_LIBPATH ${GETTEXT}/lib) + SET(GETTEXT ${LIBDIR}/gettext) + SET(GETTEXT_INC "${GETTEXT}/include") + SET(GETTEXT_LIB intl iconv) + SET(GETTEXT_LIBPATH ${GETTEXT}/lib) - IF(WITH_FFTW3) - SET(FFTW3 ${LIBDIR}/fftw3) - SET(FFTW3_INC ${FFTW3}/include) - SET(FFTW3_LIB libfftw) - SET(FFTW3_LIBPATH ${FFTW3}/lib) - ENDIF(WITH_FFTW3) + IF(WITH_FFTW3) + SET(FFTW3 ${LIBDIR}/fftw3) + SET(FFTW3_INC ${FFTW3}/include) + SET(FFTW3_LIB libfftw) + SET(FFTW3_LIBPATH ${FFTW3}/lib) + ENDIF(WITH_FFTW3) - SET(PNG_LIBRARIES png) - SET(JPEG_LIBRARY jpeg) + SET(PNG_LIBRARIES png) + SET(JPEG_LIBRARY jpeg) - SET(ZLIB /usr) - SET(ZLIB_INC "${ZLIB}/include") - SET(ZLIB_LIBRARIES z) + SET(ZLIB /usr) + SET(ZLIB_INC "${ZLIB}/include") + SET(ZLIB_LIBRARIES z) - SET(FREETYPE ${LIBDIR}/freetype) - SET(FREETYPE_INCLUDE_DIRS ${FREETYPE}/include ${FREETYPE}/include/freetype2) - SET(FREETYPE_LIBPATH ${FREETYPE}/lib) - SET(FREETYPE_LIBRARY freetype) + SET(FREETYPE ${LIBDIR}/freetype) + SET(FREETYPE_INCLUDE_DIRS ${FREETYPE}/include ${FREETYPE}/include/freetype2) + SET(FREETYPE_LIBPATH ${FREETYPE}/lib) + SET(FREETYPE_LIBRARY freetype) - SET(OPENEXR ${LIBDIR}/openexr) - SET(OPENEXR_INC ${OPENEXR}/include/OpenEXR ${OPENEXR}/include) - SET(OPENEXR_LIB Iex Half IlmImf Imath IlmThread) - SET(OPENEXR_LIBPATH ${OPENEXR}/lib) + SET(OPENEXR ${LIBDIR}/openexr) + SET(OPENEXR_INC ${OPENEXR}/include/OpenEXR ${OPENEXR}/include) + SET(OPENEXR_LIB Iex Half IlmImf Imath IlmThread) + SET(OPENEXR_LIBPATH ${OPENEXR}/lib) - SET(FFMPEG ${LIBDIR}/ffmpeg) - SET(FFMPEG_INC ${CMAKE_SOURCE_DIR}/extern/ffmpeg) - SET(FFMPEG_LIB avcodec avdevice avformat avutil mp3lame swscale x264 xvidcore) - SET(FFMPEG_LIBPATH ${FFMPEG}/lib) + SET(FFMPEG ${LIBDIR}/ffmpeg) + SET(FFMPEG_INC ${CMAKE_SOURCE_DIR}/extern/ffmpeg) + SET(FFMPEG_LIB avcodec avdevice avformat avutil mp3lame swscale x264 xvidcore) + SET(FFMPEG_LIBPATH ${FFMPEG}/lib) - SET(LIBSAMPLERATE ${LIBDIR}/samplerate) - SET(LIBSAMPLERATE_INC ${LIBSAMPLERATE}/include) - SET(LIBSAMPLERATE_LIB samplerate) - SET(LIBSAMPLERATE_LIBPATH ${LIBSAMPLERATE}/lib) + SET(LIBSAMPLERATE ${LIBDIR}/samplerate) + SET(LIBSAMPLERATE_INC ${LIBSAMPLERATE}/include) + SET(LIBSAMPLERATE_LIB samplerate) + SET(LIBSAMPLERATE_LIBPATH ${LIBSAMPLERATE}/lib) - SET(LLIBS stdc++ SystemStubs) + SET(LLIBS stdc++ SystemStubs) - SET(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing") - SET(PLATFORM_LINKFLAGS "-fexceptions -framework CoreServices -framework Foundation -framework IOKit -framework AppKit -framework Carbon -framework AGL -framework AudioUnit -framework AudioToolbox -framework CoreAudio -framework QuickTime") + SET(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing") + SET(PLATFORM_LINKFLAGS "-fexceptions -framework CoreServices -framework Foundation -framework IOKit -framework AppKit -framework Carbon -framework AGL -framework AudioUnit -framework AudioToolbox -framework CoreAudio -framework QuickTime") - IF(WITH_OPENMP) - SET(LLIBS "${LLIBS} -lgomp ") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp ") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp ") - ENDIF(WITH_OPENMP) + IF(WITH_OPENMP) + SET(LLIBS "${LLIBS} -lgomp ") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp ") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp ") + ENDIF(WITH_OPENMP) - SET(SDL ${LIBDIR}/sdl) - SET(SDL_INCLUDE_DIR ${SDL}/include) - SET(SDL_LIBRARY SDL) - SET(SDL_LIBPATH ${SDL}/lib) + SET(SDL ${LIBDIR}/sdl) + SET(SDL_INCLUDE_DIR ${SDL}/include) + SET(SDL_LIBRARY SDL) + SET(SDL_LIBPATH ${SDL}/lib) - SET(PNG "${LIBDIR}/png") - SET(PNG_INC "${PNG}/include") - SET(PNG_LIBPATH ${PNG}/lib) + SET(PNG "${LIBDIR}/png") + SET(PNG_INC "${PNG}/include") + SET(PNG_LIBPATH ${PNG}/lib) - SET(JPEG "${LIBDIR}/jpeg") - SET(JPEG_INC "${JPEG}/include") - SET(JPEG_LIBPATH ${JPEG}/lib) + SET(JPEG "${LIBDIR}/jpeg") + SET(JPEG_INC "${JPEG}/include") + SET(JPEG_LIBPATH ${JPEG}/lib) - SET(TIFF ${LIBDIR}/tiff) - SET(TIFF_INC ${TIFF}/include) + SET(TIFF ${LIBDIR}/tiff) + SET(TIFF_INC ${TIFF}/include) - SET(EXETYPE MACOSX_BUNDLE) + SET(EXETYPE MACOSX_BUNDLE) ENDIF(APPLE) IF(CMAKE_SYSTEM_NAME MATCHES "Linux") - SET(BINRELOC ${CMAKE_SOURCE_DIR}/extern/binreloc) - SET(BINRELOC_INC ${BINRELOC}/include) + SET(BINRELOC ${CMAKE_SOURCE_DIR}/extern/binreloc) + SET(BINRELOC_INC ${BINRELOC}/include) ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") @@ -534,10 +534,10 @@ set(OPENJPEG_LIb extern_libopenjpeg) # Blender WebPlugin IF(WITH_WEBPLUGIN) - SET(GECKO_DIR "${CMAKE_SOURCE_DIR}/../gecko-sdk/" CACHE PATH "Gecko SDK path") - SET(WEBPLUGIN_SANDBOX_MODE "apparmor" CACHE STRING "WEB Plugin sandbox mode, can be apparmor, privsep, none") + SET(GECKO_DIR "${CMAKE_SOURCE_DIR}/../gecko-sdk/" CACHE PATH "Gecko SDK path") + SET(WEBPLUGIN_SANDBOX_MODE "apparmor" CACHE STRING "WEB Plugin sandbox mode, can be apparmor, privsep, none") - SET(WITH_PLAYER ON) + SET(WITH_PLAYER ON) ENDIF(WITH_WEBPLUGIN) @@ -555,7 +555,7 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PLATFORM_CFLAGS} ${CXX_WARNINGS}") # better not define flags here but this is a debugging option thats off by default. IF(WITH_CXX_GUARDEDALLOC) - SET(CMAKE_CXX_FLAGS " -DWITH_CXX_GUARDEDALLOC -I${CMAKE_SOURCE_DIR}/intern/guardedalloc ${CMAKE_CXX_FLAGS}") + SET(CMAKE_CXX_FLAGS " -DWITH_CXX_GUARDEDALLOC -I${CMAKE_SOURCE_DIR}/intern/guardedalloc ${CMAKE_CXX_FLAGS}") ENDIF(WITH_CXX_GUARDEDALLOC) #----------------------------------------------------------------------------- @@ -574,6 +574,6 @@ ADD_SUBDIRECTORY(source/creator) #----------------------------------------------------------------------------- # Blender Player IF(WITH_PLAYER) - ADD_SUBDIRECTORY(blenderplayer) + ADD_SUBDIRECTORY(source/blenderplayer) ENDIF(WITH_PLAYER) diff --git a/SConstruct b/SConstruct index 6a8063440ba..19bcee524f4 100644 --- a/SConstruct +++ b/SConstruct @@ -207,7 +207,6 @@ if env['WITH_BF_OPENMP'] == 1: env.Append(CCFLAGS=['-fopenmp']) env.Append(CPPFLAGS=['-fopenmp']) env.Append(CXXFLAGS=['-fopenmp']) - # env.Append(LINKFLAGS=['-fprofile-generate']) #check for additional debug libnames @@ -301,7 +300,6 @@ if env['WITH_BF_SDL'] == False and env['OURPLATFORM'] in ('win32-vc', 'win32-min env['PLATFORM_LINKFLAGS'].append('/ENTRY:main') # lastly we check for root_build_dir ( we should not do before, otherwise we might do wrong builddir -#B.root_build_dir = B.arguments.get('BF_BUILDDIR', '..'+os.sep+'build'+os.sep+platform+os.sep) B.root_build_dir = env['BF_BUILDDIR'] B.doc_build_dir = env['BF_DOCDIR'] if not B.root_build_dir[-1]==os.sep: @@ -392,7 +390,7 @@ SConscript(B.root_build_dir+'/source/SConscript') # libraries to give as objects to linking phase mainlist = [] for tp in B.possible_types: - if not tp == 'player' and not tp == 'player2': + if not tp == 'player': mainlist += B.create_blender_liblist(env, tp) if B.arguments.get('BF_PRIORITYLIST', '0')=='1': @@ -402,14 +400,12 @@ dobj = B.buildinfo(env, "dynamic") + B.resources thestatlibs, thelibincs = B.setup_staticlibs(env) thesyslibs = B.setup_syslibs(env) -if env['WITH_BF_PLAYER']: - print("Warning: Game player may not build on 2.5") - if 'blender' in B.targets or not env['WITH_BF_NOBLENDER']: - #env.BlenderProg(B.root_build_dir, "blender", dobj , [], mainlist + thestatlibs + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender') env.BlenderProg(B.root_build_dir, "blender", dobj + mainlist, [], thestatlibs + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender') if env['WITH_BF_PLAYER']: playerlist = B.create_blender_liblist(env, 'player') + playerlist += B.create_blender_liblist(env, 'intern') + playerlist += B.create_blender_liblist(env, 'extern') env.BlenderProg(B.root_build_dir, "blenderplayer", dobj + playerlist, [], thestatlibs + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blenderplayer') ##### Now define some targets @@ -575,16 +571,13 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc'): if env['WITH_BF_OPENAL']: dllsources.append('${LCGDIR}/openal/lib/OpenAL32.dll') dllsources.append('${LCGDIR}/openal/lib/wrap_oal.dll') + if env['WITH_BF_SNDFILE']: + dllsources.append('${LCGDIR}/sndfile/lib/libsndfile-1.dll') if env['WITH_BF_FFMPEG']: dllsources += ['${LCGDIR}/ffmpeg/lib/avcodec-52.dll', '${LCGDIR}/ffmpeg/lib/avformat-52.dll', '${LCGDIR}/ffmpeg/lib/avdevice-52.dll', '${LCGDIR}/ffmpeg/lib/avutil-50.dll', -# '${LCGDIR}/ffmpeg/lib/libfaad-2.dll', -# '${LCGDIR}/ffmpeg/lib/libfaac-0.dll', -# '${LCGDIR}/ffmpeg/lib/libmp3lame-0.dll', -# '${LCGDIR}/ffmpeg/lib/libx264-67.dll', -# '${LCGDIR}/ffmpeg/lib/xvidcore.dll', '${LCGDIR}/ffmpeg/lib/swscale-0.dll'] if env['WITH_BF_JACK']: dllsources += ['${LCGDIR}/jack/lib/libjack.dll'] diff --git a/blenderplayer/CMakeLists.txt b/blenderplayer/CMakeLists.txt deleted file mode 100644 index 0407361b845..00000000000 --- a/blenderplayer/CMakeLists.txt +++ /dev/null @@ -1,133 +0,0 @@ -# $Id$ -# ***** BEGIN GPL LICENSE BLOCK ***** -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# The Original Code is Copyright (C) 2006, Blender Foundation -# All rights reserved. -# -# The Original Code is: all of this file. -# -# Contributor(s): Jacques Beaurain. -# -# ***** END GPL LICENSE BLOCK ***** - -MESSAGE(STATUS "Configuring blenderplayer") - -SETUP_LIBDIRS() - -IF(WITH_QUICKTIME) - ADD_DEFINITIONS(-DWITH_QUICKTIME) -ENDIF(WITH_QUICKTIME) - -IF(CMAKE_SYSTEM_NAME MATCHES "Linux") - ADD_DEFINITIONS(-DWITH_BINRELOC) - INCLUDE_DIRECTORIES(${BINRELOC_INC}) -ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") - -ADD_CUSTOM_COMMAND( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dna.c - COMMAND ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/makesdna ${CMAKE_CURRENT_BINARY_DIR}/dna.c ${CMAKE_SOURCE_DIR}/source/blender/makesdna/ - DEPENDS ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/makesdna -) - -IF(WIN32) - ADD_EXECUTABLE(blenderplayer ${EXETYPE} ${CMAKE_CURRENT_BINARY_DIR}/dna.c ../source/icons/winblender.rc) -ELSE(WIN32) - ADD_EXECUTABLE(blenderplayer ${CMAKE_CURRENT_BINARY_DIR}/dna.c) -ENDIF(WIN32) - -ADD_DEPENDENCIES(blenderplayer makesdna) - -FILE(READ ${CMAKE_BINARY_DIR}/cmake_blender_libs.txt BLENDER_LINK_LIBS) - -SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} gp_common gp_ghost blenkernel_blc) - -IF(CMAKE_SYSTEM_NAME MATCHES "Linux") - SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} extern_binreloc) -ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") - -IF(UNIX) - # Sort libraries - SET(BLENDER_SORTED_LIBS - gp_ghost - gp_common - bf_string - bf_ghost - bf_blenkernel - bf_blenloader - bf_blenpluginapi - bf_blroutines - bf_converter - bf_ketsji - bf_bullet - bf_common - bf_dummy - bf_logic - bf_rasterizer - bf_oglrasterizer - bf_expressions - bf_scenegraph - bf_IK - bf_moto - bf_kernel - bf_nodes - bf_gpu - bf_imbuf - bf_avi - kx_network - bf_ngnetwork - bf_loopbacknetwork - extern_bullet - bf_guardedalloc - bf_memutil - bf_blenlib - bf_cineon - bf_openexr - extern_libopenjpeg - bf_dds - bf_readblenfile - blenkernel_blc - extern_binreloc - extern_glew - ) - - IF(WITH_QUICKTIME) - SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} quicktime) - ENDIF(WITH_QUICKTIME) - - IF(WITH_CXX_GUARDEDALLOC) - SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_guardedalloc_cpp) - ENDIF(WITH_CXX_GUARDEDALLOC) - - FOREACH(SORTLIB ${BLENDER_SORTED_LIBS}) - SET(REMLIB ${SORTLIB}) - FOREACH(SEARCHLIB ${BLENDER_LINK_LIBS}) - IF(${SEARCHLIB} STREQUAL ${SORTLIB}) - SET(REMLIB "") - ENDIF(${SEARCHLIB} STREQUAL ${SORTLIB}) - ENDFOREACH(SEARCHLIB) - IF(REMLIB) - MESSAGE(STATUS "Removing library ${REMLIB} from blenderplayer linking because: not configured") - LIST(REMOVE_ITEM BLENDER_SORTED_LIBS ${REMLIB}) - ENDIF(REMLIB) - ENDFOREACH(SORTLIB) - - TARGET_LINK_LIBRARIES(blenderplayer ${BLENDER_SORTED_LIBS}) -ELSE(UNIX) - TARGET_LINK_LIBRARIES(blenderplayer ${BLENDER_LINK_LIBS}) -ENDIF(UNIX) - -SETUP_LIBLINKS(blenderplayer) diff --git a/config/win32-mingw-config.py b/config/win32-mingw-config.py index 26fa0835255..e3834c41a81 100644 --- a/config/win32-mingw-config.py +++ b/config/win32-mingw-config.py @@ -35,7 +35,7 @@ BF_JACK_LIBPATH = '${BF_JACK}/lib' WITH_BF_SNDFILE = False BF_SNDFILE = LIBDIR + '/sndfile' BF_SNDFILE_INC = '${BF_SNDFILE}/include' -BF_SNDFILE_LIB = 'libsndfile' +BF_SNDFILE_LIB = 'libsndfile-1' BF_SNDFILE_LIBPATH = '${BF_SNDFILE}/lib' WITH_BF_SDL = True diff --git a/config/win32-vc-config.py b/config/win32-vc-config.py index aaadf34a4fa..d5e8ada060d 100644 --- a/config/win32-vc-config.py +++ b/config/win32-vc-config.py @@ -150,6 +150,7 @@ CXX = 'cl.exe' CCFLAGS = ['/nologo', '/Ob1', '/J', '/W3', '/Gd', '/wd4244', '/wd4305', '/wd4800', '/wd4065', '/wd4267'] #CCFLAGS += ['/GL'] CXXFLAGS = ['/EHsc'] +BGE_CXXFLAGS = ['/O2', '/EHsc', '/GR', '/fp:fast', '/arch:SSE'] BF_DEBUG_CCFLAGS = ['/Zi', '/FR${TARGET}.sbr'] diff --git a/config/win64-vc-config.py b/config/win64-vc-config.py index ed08e578df8..ce2fd8cd405 100644 --- a/config/win64-vc-config.py +++ b/config/win64-vc-config.py @@ -163,6 +163,7 @@ CXX = 'cl.exe' CFLAGS = [] CCFLAGS = ['/nologo', '/Ob1', '/J', '/W3', '/Gd', '/wd4244', '/wd4305', '/wd4800', '/wd4065', '/wd4267'] CXXFLAGS = ['/EHsc'] +BGE_CXXFLAGS = ['/O2', '/EHsc', '/GR', '/fp:fast', '/arch:SSE2'] BF_DEBUG_CCFLAGS = ['/Zi', '/FR${TARGET}.sbr'] diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt index 019cd9de28b..44e47aaf88d 100644 --- a/extern/CMakeLists.txt +++ b/extern/CMakeLists.txt @@ -25,17 +25,17 @@ # ***** END GPL LICENSE BLOCK ***** IF(WITH_BULLET) - ADD_SUBDIRECTORY(bullet2) + ADD_SUBDIRECTORY(bullet2) ENDIF(WITH_BULLET) IF(CMAKE_SYSTEM_NAME MATCHES "Linux") - ADD_SUBDIRECTORY(binreloc) + ADD_SUBDIRECTORY(binreloc) ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux") ADD_SUBDIRECTORY(glew) IF(WITH_OPENJPEG) - ADD_SUBDIRECTORY(libopenjpeg) + ADD_SUBDIRECTORY(libopenjpeg) ENDIF(WITH_OPENJPEG) ADD_SUBDIRECTORY(lzo) diff --git a/extern/Makefile b/extern/Makefile index 1bebf1e1994..b81fbd2b91a 100644 --- a/extern/Makefile +++ b/extern/Makefile @@ -32,15 +32,6 @@ SOURCEDIR = extern DIR = $(OCGDIR)/extern DIRS = glew/src -ifeq ($(WITH_FFMPEG), true) -ifeq ($(NAN_FFMPEG), $(LCGDIR)/ffmpeg) - DIRS += ffmpeg -endif -ifeq ($(NAN_FFMPEG), $(LCGDIR)/gcc/ffmpeg) - DIRS += ffmpeg -endif -endif - # Cloth requires it #ifneq ($(NAN_NO_KETSJI), true) DIRS += bullet2 diff --git a/extern/binreloc/SConscript b/extern/binreloc/SConscript index 98d7adb2d1e..331b70a4ebc 100644 --- a/extern/binreloc/SConscript +++ b/extern/binreloc/SConscript @@ -9,5 +9,5 @@ cflags = [] sources = ['binreloc.c'] incs = 'include' -env.BlenderLib ( 'extern_binreloc', sources, Split(incs), Split(defs), libtype=['extern'], priority=[36], compileflags = cflags) +env.BlenderLib ( 'extern_binreloc', sources, Split(incs), Split(defs), libtype=['extern','player'], priority=[36,225], compileflags = cflags) diff --git a/extern/bullet2/CMakeLists.txt b/extern/bullet2/CMakeLists.txt index edb6b9c525f..2e2d8920781 100644 --- a/extern/bullet2/CMakeLists.txt +++ b/extern/bullet2/CMakeLists.txt @@ -27,16 +27,16 @@ SET(INC . src) FILE(GLOB SRC - src/LinearMath/*.cpp - src/BulletCollision/BroadphaseCollision/*.cpp - src/BulletCollision/CollisionShapes/*.cpp - src/BulletCollision/NarrowPhaseCollision/*.cpp - src/BulletCollision/Gimpact/*.cpp - src/BulletCollision//CollisionDispatch/*.cpp - src/BulletDynamics/ConstraintSolver/*.cpp - src/BulletDynamics/Vehicle/*.cpp - src/BulletDynamics/Dynamics/*.cpp - src/BulletSoftBody/*.cpp + src/LinearMath/*.cpp + src/BulletCollision/BroadphaseCollision/*.cpp + src/BulletCollision/CollisionShapes/*.cpp + src/BulletCollision/NarrowPhaseCollision/*.cpp + src/BulletCollision/Gimpact/*.cpp + src/BulletCollision//CollisionDispatch/*.cpp + src/BulletDynamics/ConstraintSolver/*.cpp + src/BulletDynamics/Vehicle/*.cpp + src/BulletDynamics/Dynamics/*.cpp + src/BulletSoftBody/*.cpp ) ADD_DEFINITIONS(-D_LIB) diff --git a/extern/bullet2/src/BulletCollision/CMakeLists.txt b/extern/bullet2/src/BulletCollision/CMakeLists.txt index 4b4304f43b0..ddc806a3e6a 100644 --- a/extern/bullet2/src/BulletCollision/CMakeLists.txt +++ b/extern/bullet2/src/BulletCollision/CMakeLists.txt @@ -211,13 +211,13 @@ ADD_LIBRARY(BulletCollision ${BulletCollision_SRCS} ${BulletCollision_HDRS}) SET_TARGET_PROPERTIES(BulletCollision PROPERTIES VERSION ${BULLET_VERSION}) SET_TARGET_PROPERTIES(BulletCollision PROPERTIES SOVERSION ${BULLET_VERSION}) IF (BUILD_SHARED_LIBS) - TARGET_LINK_LIBRARIES(BulletCollision LinearMath) + TARGET_LINK_LIBRARIES(BulletCollision LinearMath) ENDIF (BUILD_SHARED_LIBS) #INSTALL of other files requires CMake 2.6 IF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) INSTALL(TARGETS BulletCollision DESTINATION lib) - INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION include FILES_MATCHING PATTERN "*.h") + INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION include FILES_MATCHING PATTERN "*.h") ENDIF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) IF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) diff --git a/extern/bullet2/src/BulletSoftBody/CMakeLists.txt b/extern/bullet2/src/BulletSoftBody/CMakeLists.txt index dbd87afea38..fe31d2bee71 100644 --- a/extern/bullet2/src/BulletSoftBody/CMakeLists.txt +++ b/extern/bullet2/src/BulletSoftBody/CMakeLists.txt @@ -34,7 +34,7 @@ ENDIF (BUILD_SHARED_LIBS) IF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) INSTALL(TARGETS BulletSoftBody DESTINATION lib) - INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION include FILES_MATCHING PATTERN "*.h") + INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DESTINATION include FILES_MATCHING PATTERN "*.h") ENDIF (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 2.5) IF (APPLE AND BUILD_SHARED_LIBS AND FRAMEWORK) diff --git a/extern/bullet2/src/SConscript b/extern/bullet2/src/SConscript index 319cc57ce55..3d0c645e7a0 100644 --- a/extern/bullet2/src/SConscript +++ b/extern/bullet2/src/SConscript @@ -35,11 +35,11 @@ softbody_src = env.Glob("BulletSoftBody/*.cpp") incs = '. BulletCollision BulletDynamics LinearMath BulletSoftBody' -env.BlenderLib ( libname = 'extern_bullet2linmath', sources=linearmath_src, includes=Split(incs), defines=Split(defs), libtype=['extern'], priority=[20], compileflags=cflags ) -env.BlenderLib ( libname = 'extern_bullet2dynamics', sources=bulletdyn_src, includes=Split(incs), defines=Split(defs), libtype=['extern'], priority=[19], compileflags=cflags ) -env.BlenderLib ( libname = 'extern_bullet2collision_broadphase', sources=collision_broadphase_src, includes=Split(incs), defines=Split(defs), libtype=['extern'], priority=[25], compileflags=cflags ) -env.BlenderLib ( libname = 'extern_bullet2collision_dispatch', sources=collision_dispatch_src, includes=Split(incs), defines=Split(defs), libtype=['extern'], priority=[20], compileflags=cflags ) -env.BlenderLib ( libname = 'extern_bullet2collision_gimpact', sources=collision_gimpact_src, includes=Split(incs), defines=Split(defs), libtype=['extern'], priority=[20], compileflags=cflags ) -env.BlenderLib ( libname = 'extern_bullet2collision_shapes', sources=collision_shapes_src, includes=Split(incs), defines=Split(defs), libtype=['extern'], priority=[20], compileflags=cflags ) -env.BlenderLib ( libname = 'extern_bullet2collision_narrowphase', sources=collision_narrowphase_src, includes=Split(incs), defines=Split(defs), libtype=['extern'], priority=[20], compileflags=cflags ) -env.BlenderLib ( libname = 'extern_bullet2softbody', sources=softbody_src, includes=Split(incs), defines=Split(defs), libtype=['extern'], priority=[18], compileflags=cflags ) +env.BlenderLib ( libname = 'extern_bullet2linmath', sources=linearmath_src, includes=Split(incs), defines=Split(defs), libtype=['extern','player'], priority=[20,137], compileflags=cflags ) +env.BlenderLib ( libname = 'extern_bullet2dynamics', sources=bulletdyn_src, includes=Split(incs), defines=Split(defs), libtype=['extern','player'], priority=[19,136], compileflags=cflags ) +env.BlenderLib ( libname = 'extern_bullet2collision_broadphase', sources=collision_broadphase_src, includes=Split(incs), defines=Split(defs), libtype=['extern','player'], priority=[25,145], compileflags=cflags ) +env.BlenderLib ( libname = 'extern_bullet2collision_dispatch', sources=collision_dispatch_src, includes=Split(incs), defines=Split(defs), libtype=['extern','player'], priority=[20,138], compileflags=cflags ) +env.BlenderLib ( libname = 'extern_bullet2collision_gimpact', sources=collision_gimpact_src, includes=Split(incs), defines=Split(defs), libtype=['extern','player'], priority=[20,138], compileflags=cflags ) +env.BlenderLib ( libname = 'extern_bullet2collision_shapes', sources=collision_shapes_src, includes=Split(incs), defines=Split(defs), libtype=['extern','player'], priority=[20,138], compileflags=cflags ) +env.BlenderLib ( libname = 'extern_bullet2collision_narrowphase', sources=collision_narrowphase_src, includes=Split(incs), defines=Split(defs), libtype=['extern','player'], priority=[20,138], compileflags=cflags ) +env.BlenderLib ( libname = 'extern_bullet2softbody', sources=softbody_src, includes=Split(incs), defines=Split(defs), libtype=['extern','player'], priority=[18,135], compileflags=cflags ) diff --git a/extern/glew/CMakeLists.txt b/extern/glew/CMakeLists.txt index eea34488e17..26d10a6ca9f 100644 --- a/extern/glew/CMakeLists.txt +++ b/extern/glew/CMakeLists.txt @@ -27,11 +27,11 @@ SET(INC include src) IF(UNIX) - SET(INC ${INC} ${X11_X11_INCLUDE_PATH}) + SET(INC ${INC} ${X11_X11_INCLUDE_PATH}) ENDIF(UNIX) SET(SRC - src/glew.c + src/glew.c ) BLENDERLIB(extern_glew "${SRC}" "${INC}") diff --git a/extern/glew/SConscript b/extern/glew/SConscript index b83525daffe..81a2fc67ccc 100644 --- a/extern/glew/SConscript +++ b/extern/glew/SConscript @@ -9,4 +9,4 @@ sources = ['src/glew.c'] defs = '' incs = 'include' -env.BlenderLib ( 'extern_glew', sources, Split(incs), Split(defs), libtype=['extern'], priority=[50]) +env.BlenderLib ( 'extern_glew', sources, Split(incs), Split(defs), libtype=['extern','player'], priority=[50,230]) diff --git a/extern/libopenjpeg/SConscript b/extern/libopenjpeg/SConscript index 693fee15c91..da661739783 100644 --- a/extern/libopenjpeg/SConscript +++ b/extern/libopenjpeg/SConscript @@ -24,5 +24,5 @@ if not env['OURPLATFORM'] in ('win32-vc', 'win64-vc'): oj_env.BlenderLib ( libname='extern_openjpeg', sources=sources, includes=Split(incs), defines=defs, - libtype=['extern'], - priority=[10], compileflags = flags) + libtype=['extern','player'], + priority=[10,185], compileflags = flags) diff --git a/extern/libredcode/SConscript b/extern/libredcode/SConscript index 9fd25ad63c7..3fb78dbea0f 100644 --- a/extern/libredcode/SConscript +++ b/extern/libredcode/SConscript @@ -12,5 +12,5 @@ incs = '. ../libopenjpeg' env.BlenderLib ( libname='extern_redcode', sources=sources, includes=Split(incs), defines=[], - libtype=['core','intern','player'], - priority=[5, 5, 200], compileflags = []) + libtype=['core','intern'], + priority=[5, 5], compileflags = []) diff --git a/intern/CMakeLists.txt b/intern/CMakeLists.txt index f33ce6a893c..9efd1a6ee7c 100644 --- a/intern/CMakeLists.txt +++ b/intern/CMakeLists.txt @@ -38,7 +38,7 @@ ADD_SUBDIRECTORY(opennl) ADD_SUBDIRECTORY(smoke) IF(WITH_ELBEEM) - ADD_SUBDIRECTORY(elbeem) + ADD_SUBDIRECTORY(elbeem) ENDIF(WITH_ELBEEM) ADD_SUBDIRECTORY(bsp) diff --git a/intern/audaspace/CMakeLists.txt b/intern/audaspace/CMakeLists.txt index 1b48de3190b..587ef30979b 100644 --- a/intern/audaspace/CMakeLists.txt +++ b/intern/audaspace/CMakeLists.txt @@ -25,38 +25,38 @@ SET(INC . intern FX SRC ${PTHREADS_INC} ${LIBSAMPLERATE_INC}) FILE(GLOB SRC intern/*.cpp intern/*.h FX/*.cpp SRC/*.cpp) IF(WITH_FFMPEG) - SET(INC ${INC} ffmpeg ${FFMPEG_INC}) - FILE(GLOB FFMPEGSRC ffmpeg/*.cpp) - ADD_DEFINITIONS(-DWITH_FFMPEG) + SET(INC ${INC} ffmpeg ${FFMPEG_INC}) + FILE(GLOB FFMPEGSRC ffmpeg/*.cpp) + ADD_DEFINITIONS(-DWITH_FFMPEG) ENDIF(WITH_FFMPEG) IF(WITH_SDL) - SET(INC ${INC} SDL ${SDL_INCLUDE_DIR}) - FILE(GLOB SDLSRC SDL/*.cpp) - ADD_DEFINITIONS(-DWITH_SDL) + SET(INC ${INC} SDL ${SDL_INCLUDE_DIR}) + FILE(GLOB SDLSRC SDL/*.cpp) + ADD_DEFINITIONS(-DWITH_SDL) ENDIF(WITH_SDL) IF(WITH_OPENAL) - SET(INC ${INC} OpenAL ${OPENAL_INCLUDE_DIR}) - FILE(GLOB OPENALSRC OpenAL/*.cpp) - ADD_DEFINITIONS(-DWITH_OPENAL) + SET(INC ${INC} OpenAL ${OPENAL_INCLUDE_DIR}) + FILE(GLOB OPENALSRC OpenAL/*.cpp) + ADD_DEFINITIONS(-DWITH_OPENAL) - STRING(REGEX MATCH ".*ramework.*" FRAMEWORK ${OPENAL_INCLUDE_DIR}) - IF(FRAMEWORK) - ADD_DEFINITIONS(-DAPPLE_FRAMEWORK_FIX) - ENDIF(FRAMEWORK) + STRING(REGEX MATCH ".*ramework.*" FRAMEWORK ${OPENAL_INCLUDE_DIR}) + IF(FRAMEWORK) + ADD_DEFINITIONS(-DAPPLE_FRAMEWORK_FIX) + ENDIF(FRAMEWORK) ENDIF(WITH_OPENAL) IF(WITH_JACK) - SET(INC ${INC} jack ${JACK_INC}) - FILE(GLOB JACKSRC jack/*.cpp) - ADD_DEFINITIONS(-DWITH_JACK) + SET(INC ${INC} jack ${JACK_INC}) + FILE(GLOB JACKSRC jack/*.cpp) + ADD_DEFINITIONS(-DWITH_JACK) ENDIF(WITH_JACK) IF(WITH_SNDFILE) - SET(INC ${INC} sndfile ${SNDFILE_INC}) - FILE(GLOB SNDFILESRC sndfile/*.cpp) - ADD_DEFINITIONS(-DWITH_SNDFILE) + SET(INC ${INC} sndfile ${SNDFILE_INC}) + FILE(GLOB SNDFILESRC sndfile/*.cpp) + ADD_DEFINITIONS(-DWITH_SNDFILE) ENDIF(WITH_SNDFILE) SET(SRC ${SRC} ${FFMPEGSRC} ${SNDFILESRC} ${SDLSRC} ${OPENALSRC} ${JACKSRC}) diff --git a/intern/audaspace/FX/AUD_DoubleReader.cpp b/intern/audaspace/FX/AUD_DoubleReader.cpp index 181e394da98..8d3afbf2f1d 100644 --- a/intern/audaspace/FX/AUD_DoubleReader.cpp +++ b/intern/audaspace/FX/AUD_DoubleReader.cpp @@ -47,7 +47,7 @@ AUD_DoubleReader::AUD_DoubleReader(AUD_IReader* reader1, AUD_THROW(AUD_ERROR_READER); } - catch(AUD_Exception e) + catch(AUD_Exception) { if(reader1) { diff --git a/intern/audaspace/FX/AUD_PingPongFactory.cpp b/intern/audaspace/FX/AUD_PingPongFactory.cpp index a030d581b1a..8b72afe05e7 100644 --- a/intern/audaspace/FX/AUD_PingPongFactory.cpp +++ b/intern/audaspace/FX/AUD_PingPongFactory.cpp @@ -46,7 +46,7 @@ AUD_IReader* AUD_PingPongFactory::createReader() { reader2 = factory.createReader(); } - catch(AUD_Exception e) + catch(AUD_Exception) { reader2 = 0; } diff --git a/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp b/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp index f94b11a11b8..b33afa2b955 100644 --- a/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp +++ b/intern/audaspace/OpenAL/AUD_OpenALDevice.cpp @@ -544,13 +544,13 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep) if(alGetError() != AL_NO_ERROR) AUD_THROW(AUD_ERROR_OPENAL); } - catch(AUD_Exception e) + catch(AUD_Exception) { alDeleteSources(1, &sound->source); throw; } } - catch(AUD_Exception e) + catch(AUD_Exception) { delete sound; AUD_DELETE("handle") alcProcessContext(m_context); @@ -648,19 +648,19 @@ AUD_Handle* AUD_OpenALDevice::play(AUD_IFactory* factory, bool keep) if(alGetError() != AL_NO_ERROR) AUD_THROW(AUD_ERROR_OPENAL); } - catch(AUD_Exception e) + catch(AUD_Exception) { alDeleteSources(1, &sound->source); throw; } } - catch(AUD_Exception e) + catch(AUD_Exception) { alDeleteBuffers(AUD_OPENAL_CYCLE_BUFFERS, sound->buffers); throw; } } - catch(AUD_Exception e) + catch(AUD_Exception) { delete sound; AUD_DELETE("handle") delete reader; AUD_DELETE("reader") @@ -1051,13 +1051,13 @@ bool AUD_OpenALDevice::setCapability(int capability, void *value) if(alGetError() != AL_NO_ERROR) AUD_THROW(AUD_ERROR_OPENAL); } - catch(AUD_Exception e) + catch(AUD_Exception) { alDeleteBuffers(1, &bf->buffer); throw; } } - catch(AUD_Exception e) + catch(AUD_Exception) { delete bf; AUD_DELETE("bufferedfactory") delete reader; AUD_DELETE("reader") diff --git a/intern/audaspace/SConscript b/intern/audaspace/SConscript index 0dfd0bb9e3a..025fa5a2379 100644 --- a/intern/audaspace/SConscript +++ b/intern/audaspace/SConscript @@ -31,4 +31,4 @@ if env['WITH_BF_SNDFILE']: incs += ' sndfile ' + env['BF_SNDFILE_INC'] defs.append('WITH_SNDFILE') -env.BlenderLib ('bf_audaspace', sources, Split(incs), defs, libtype=['intern'], priority = [25] ) +env.BlenderLib ('bf_audaspace', sources, Split(incs), defs, libtype=['intern','player'], priority = [25,215] ) diff --git a/intern/audaspace/SDL/AUD_SDLMixerReader.cpp b/intern/audaspace/SDL/AUD_SDLMixerReader.cpp index ec61f99f02d..0a47e36533a 100644 --- a/intern/audaspace/SDL/AUD_SDLMixerReader.cpp +++ b/intern/audaspace/SDL/AUD_SDLMixerReader.cpp @@ -87,7 +87,7 @@ AUD_SDLMixerReader::AUD_SDLMixerReader(AUD_IReader* reader, specs.rate) == -1) AUD_THROW(AUD_ERROR_SDL); } - catch(AUD_Exception e) + catch(AUD_Exception) { delete m_reader; AUD_DELETE("reader") throw; diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp index d70a9c25bcb..0384ba5e0e6 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp @@ -119,7 +119,7 @@ AUD_FFMPEGReader::AUD_FFMPEGReader(const char* filename) // find audio stream and codec m_stream = -1; - for(int i = 0; i < m_formatCtx->nb_streams; i++) + for(unsigned int i = 0; i < m_formatCtx->nb_streams; i++) if((m_formatCtx->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO) && (m_stream < 0)) { @@ -146,7 +146,7 @@ AUD_FFMPEGReader::AUD_FFMPEGReader(const char* filename) m_specs.format = FFMPEG_TO_AUD(m_codecCtx->sample_fmt); m_specs.rate = (AUD_SampleRate) m_codecCtx->sample_rate; } - catch(AUD_Exception e) + catch(AUD_Exception) { av_close_input_file(m_formatCtx); throw; @@ -188,7 +188,7 @@ AUD_FFMPEGReader::AUD_FFMPEGReader(AUD_Reference buffer) // find audio stream and codec m_stream = -1; - for(int i = 0; i < m_formatCtx->nb_streams; i++) + for(unsigned int i = 0; i < m_formatCtx->nb_streams; i++) if((m_formatCtx->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO) && (m_stream < 0)) { @@ -215,7 +215,7 @@ AUD_FFMPEGReader::AUD_FFMPEGReader(AUD_Reference buffer) m_specs.format = FFMPEG_TO_AUD(m_codecCtx->sample_fmt); m_specs.rate = (AUD_SampleRate) m_codecCtx->sample_rate; } - catch(AUD_Exception e) + catch(AUD_Exception) { av_close_input_stream(m_formatCtx); av_free(m_byteiocontext); AUD_DELETE("byteiocontext") diff --git a/intern/audaspace/intern/AUD_C-API.cpp b/intern/audaspace/intern/AUD_C-API.cpp index 9481e2139e8..45faebc7e97 100644 --- a/intern/audaspace/intern/AUD_C-API.cpp +++ b/intern/audaspace/intern/AUD_C-API.cpp @@ -67,7 +67,7 @@ typedef AUD_ReadDevice AUD_Device; #endif static AUD_IDevice* AUD_device = NULL; -static int AUD_available_devices[3]; +static int AUD_available_devices[4]; static AUD_I3DDevice* AUD_3ddevice = NULL; int AUD_init(AUD_DeviceType device, AUD_Specs specs, int buffersize) @@ -77,6 +77,9 @@ int AUD_init(AUD_DeviceType device, AUD_Specs specs, int buffersize) #endif AUD_IDevice* dev = NULL; + if(AUD_device) + AUD_exit(); + try { switch(device) @@ -107,16 +110,13 @@ int AUD_init(AUD_DeviceType device, AUD_Specs specs, int buffersize) return false; } - if(AUD_device) - AUD_exit(); - AUD_device = dev; if(AUD_device->checkCapability(AUD_CAPS_3D_DEVICE)) AUD_3ddevice = dynamic_cast(AUD_device); return true; } - catch(AUD_Exception e) + catch(AUD_Exception) { return false; } @@ -204,7 +204,7 @@ AUD_Sound* AUD_bufferSound(AUD_Sound* sound) { return new AUD_StreamBufferFactory(sound); } - catch(AUD_Exception e) + catch(AUD_Exception) { return NULL; } @@ -218,7 +218,7 @@ AUD_Sound* AUD_delaySound(AUD_Sound* sound, float delay) { return new AUD_DelayFactory(sound, delay); } - catch(AUD_Exception e) + catch(AUD_Exception) { return NULL; } @@ -232,7 +232,7 @@ extern AUD_Sound* AUD_limitSound(AUD_Sound* sound, float start, float end) { return new AUD_LimiterFactory(sound, start, end); } - catch(AUD_Exception e) + catch(AUD_Exception) { return NULL; } @@ -246,7 +246,7 @@ AUD_Sound* AUD_pingpongSound(AUD_Sound* sound) { return new AUD_PingPongFactory(sound); } - catch(AUD_Exception e) + catch(AUD_Exception) { return NULL; } @@ -260,7 +260,7 @@ AUD_Sound* AUD_loopSound(AUD_Sound* sound) { return new AUD_LoopFactory(sound); } - catch(AUD_Exception e) + catch(AUD_Exception) { return NULL; } @@ -278,7 +278,7 @@ int AUD_stopLoop(AUD_Handle* handle) { return AUD_device->sendMessage(handle, message); } - catch(AUD_Exception e) + catch(AUD_Exception) { } } @@ -299,7 +299,7 @@ AUD_Handle* AUD_play(AUD_Sound* sound, int keep) { return AUD_device->play(sound, keep); } - catch(AUD_Exception e) + catch(AUD_Exception) { return NULL; } @@ -360,7 +360,7 @@ AUD_Handle* AUD_play3D(AUD_Sound* sound, int keep) else return AUD_device->play(sound, keep); } - catch(AUD_Exception e) + catch(AUD_Exception) { return NULL; } @@ -376,7 +376,7 @@ int AUD_updateListener(AUD_3DData* data) if(AUD_3ddevice) return AUD_3ddevice->updateListener(*data); } - catch(AUD_Exception e) + catch(AUD_Exception) { } return false; @@ -391,7 +391,7 @@ int AUD_set3DSetting(AUD_3DSetting setting, float value) if(AUD_3ddevice) return AUD_3ddevice->setSetting(setting, value); } - catch(AUD_Exception e) + catch(AUD_Exception) { } return false; @@ -406,7 +406,7 @@ float AUD_get3DSetting(AUD_3DSetting setting) if(AUD_3ddevice) return AUD_3ddevice->getSetting(setting); } - catch(AUD_Exception e) + catch(AUD_Exception) { } return 0.0; @@ -424,7 +424,7 @@ int AUD_update3DSource(AUD_Handle* handle, AUD_3DData* data) if(AUD_3ddevice) return AUD_3ddevice->updateSource(handle, *data); } - catch(AUD_Exception e) + catch(AUD_Exception) { } } @@ -443,7 +443,7 @@ int AUD_set3DSourceSetting(AUD_Handle* handle, if(AUD_3ddevice) return AUD_3ddevice->setSourceSetting(handle, setting, value); } - catch(AUD_Exception e) + catch(AUD_Exception) { } } @@ -461,7 +461,7 @@ float AUD_get3DSourceSetting(AUD_Handle* handle, AUD_3DSourceSetting setting) if(AUD_3ddevice) return AUD_3ddevice->getSourceSetting(handle, setting); } - catch(AUD_Exception e) + catch(AUD_Exception) { } } @@ -481,7 +481,7 @@ int AUD_setSoundVolume(AUD_Handle* handle, float volume) { return AUD_device->setCapability(AUD_CAPS_SOURCE_VOLUME, &caps); } - catch(AUD_Exception e) {} + catch(AUD_Exception) {} } return false; } @@ -499,7 +499,7 @@ int AUD_setSoundPitch(AUD_Handle* handle, float pitch) { return AUD_device->setCapability(AUD_CAPS_SOURCE_PITCH, &caps); } - catch(AUD_Exception e) {} + catch(AUD_Exception) {} } return false; } @@ -510,7 +510,7 @@ AUD_Device* AUD_openReadDevice(AUD_Specs specs) { return new AUD_ReadDevice(specs); } - catch(AUD_Exception e) + catch(AUD_Exception) { return NULL; } @@ -525,7 +525,7 @@ int AUD_playDevice(AUD_Device* device, AUD_Sound* sound) { return device->play(sound) != NULL; } - catch(AUD_Exception e) + catch(AUD_Exception) { return false; } @@ -540,7 +540,7 @@ int AUD_readDevice(AUD_Device* device, sample_t* buffer, int length) { return device->read(buffer, length); } - catch(AUD_Exception e) + catch(AUD_Exception) { return false; } @@ -554,7 +554,7 @@ void AUD_closeReadDevice(AUD_Device* device) { delete device; } - catch(AUD_Exception e) + catch(AUD_Exception) { } } diff --git a/intern/audaspace/jack/AUD_JackDevice.cpp b/intern/audaspace/jack/AUD_JackDevice.cpp index 445e68e1a9a..4d8ab93d672 100644 --- a/intern/audaspace/jack/AUD_JackDevice.cpp +++ b/intern/audaspace/jack/AUD_JackDevice.cpp @@ -35,7 +35,7 @@ int AUD_JackDevice::jack_mix(jack_nframes_t length, void *data) { AUD_JackDevice* device = (AUD_JackDevice*)data; - int samplesize = AUD_SAMPLE_SIZE(device->m_specs); + unsigned int samplesize = AUD_SAMPLE_SIZE(device->m_specs); if(device->m_buffer->getSize() < samplesize * length) device->m_buffer->resize(samplesize * length); device->mix(device->m_buffer->getBuffer(), length); @@ -44,10 +44,10 @@ int AUD_JackDevice::jack_mix(jack_nframes_t length, void *data) float* out; int count = device->m_specs.channels; - for(int i = 0; i < count; i++) + for(unsigned int i = 0; i < count; i++) { out = (float*)jack_port_get_buffer(device->m_ports[i], length); - for(int j = 0; j < length; j++) + for(unsigned int j = 0; j < length; j++) out[j] = in[j * count + i]; } @@ -105,7 +105,7 @@ AUD_JackDevice::AUD_JackDevice(AUD_Specs specs) if(jack_activate(m_client)) AUD_THROW(AUD_ERROR_JACK); } - catch(AUD_Exception e) + catch(AUD_Exception) { jack_client_close(m_client); delete[] m_ports; AUD_DELETE("jack_port") diff --git a/intern/audaspace/make/msvc_9_0/audaspace.vcproj b/intern/audaspace/make/msvc_9_0/audaspace.vcproj index 4c0b26f1c4e..0d8ade43e07 100644 --- a/intern/audaspace/make/msvc_9_0/audaspace.vcproj +++ b/intern/audaspace/make/msvc_9_0/audaspace.vcproj @@ -43,7 +43,7 @@ + + + + + + + + + + diff --git a/intern/elbeem/CMakeLists.txt b/intern/elbeem/CMakeLists.txt index 8b8a3000efd..e541d334086 100644 --- a/intern/elbeem/CMakeLists.txt +++ b/intern/elbeem/CMakeLists.txt @@ -30,11 +30,11 @@ FILE(GLOB SRC intern/*.cpp) ADD_DEFINITIONS(-DNOGUI -DELBEEM_BLENDER=1) IF(WINDOWS) - ADD_DEFINITIONS(-DUSE_MSVC6FIXES) + ADD_DEFINITIONS(-DUSE_MSVC6FIXES) ENDIF(WINDOWS) IF(WITH_OPENMP) - ADD_DEFINITIONS(-DPARALLEL=1) + ADD_DEFINITIONS(-DPARALLEL=1) ENDIF(WITH_OPENMP) BLENDERLIB_NOLIST(bf_elbeem "${SRC}" "${INC}") diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt index 3d588ecfd00..9128e923e19 100644 --- a/intern/ghost/CMakeLists.txt +++ b/intern/ghost/CMakeLists.txt @@ -29,30 +29,30 @@ SET(INC . ../string) FILE(GLOB SRC intern/*.cpp) IF(APPLE) - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerX11.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemX11.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowX11.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerWin32.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemWin32.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowWin32.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerX11.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemX11.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowX11.cpp") ELSE(APPLE) - IF(WIN32) - SET(INC ${INC} ${WINTAB_INC}) - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerCarbon.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemCarbon.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowCarbon.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerX11.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemX11.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowX11.cpp") - ELSE(WIN32) - SET(INC ${INC} ${X11_X11_INCLUDE_PATH}) - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowWin32.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerCarbon.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemCarbon.cpp") - LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowCarbon.cpp") - ENDIF(WIN32) + IF(WIN32) + SET(INC ${INC} ${WINTAB_INC}) + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerCarbon.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemCarbon.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowCarbon.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerX11.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemX11.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowX11.cpp") + ELSE(WIN32) + SET(INC ${INC} ${X11_X11_INCLUDE_PATH}) + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerWin32.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemWin32.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowWin32.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_DisplayManagerCarbon.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_SystemCarbon.cpp") + LIST(REMOVE_ITEM SRC "${CMAKE_CURRENT_SOURCE_DIR}/intern/GHOST_WindowCarbon.cpp") + ENDIF(WIN32) ENDIF(APPLE) BLENDERLIB(bf_ghost "${SRC}" "${INC}") diff --git a/intern/ghost/SConscript b/intern/ghost/SConscript index 9de82ac44fb..48009152699 100644 --- a/intern/ghost/SConscript +++ b/intern/ghost/SConscript @@ -29,4 +29,4 @@ else: incs = '. ../string ' + env['BF_OPENGL_INC'] if window_system in ('win32-vc', 'win32-mingw', 'cygwin', 'linuxcross', 'win64-vc'): incs = env['BF_WINTAB_INC'] + ' ' + incs -env.BlenderLib ('bf_ghost', sources, Split(incs), defines=['_USE_MATH_DEFINES'], libtype=['intern'], priority = [40] ) +env.BlenderLib ('bf_ghost', sources, Split(incs), defines=['_USE_MATH_DEFINES'], libtype=['intern','player'], priority = [40,15] ) diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp index 88ae8afd0ce..3aff9d64a17 100644 --- a/intern/ghost/intern/GHOST_WindowX11.cpp +++ b/intern/ghost/intern/GHOST_WindowX11.cpp @@ -294,7 +294,7 @@ GHOST_WindowX11( } // Create some hints for the window manager on how - // we want this window treated. + // we want this window treated. XSizeHints * xsizehints = XAllocSizeHints(); xsizehints->flags = USPosition | USSize; @@ -514,7 +514,7 @@ GHOST_WindowX11:: getXWindow( ){ return m_window; -} +} bool GHOST_WindowX11:: @@ -528,7 +528,17 @@ GHOST_WindowX11:: setTitle( const STR_String& title ){ + Atom name = XInternAtom(m_display, "_NET_WM_NAME", 0); + Atom utf8str = XInternAtom(m_display, "UTF8_STRING", 0); + XChangeProperty(m_display, m_window, + name, utf8str, 8, PropModeReplace, + (const unsigned char*) title.ReadPtr(), + strlen(title.ReadPtr())); + +// This should convert to valid x11 string +// and getTitle would need matching change XStoreName(m_display,m_window,title); + XFlush(m_display); } diff --git a/intern/guardedalloc/CMakeLists.txt b/intern/guardedalloc/CMakeLists.txt index b29837fac7d..40ca35632d7 100644 --- a/intern/guardedalloc/CMakeLists.txt +++ b/intern/guardedalloc/CMakeLists.txt @@ -32,6 +32,6 @@ BLENDERLIB(bf_guardedalloc "${SRC}" "${INC}") # Override C++ alloc optional IF(WITH_CXX_GUARDEDALLOC) - FILE(GLOB SRC cpp/*.cpp) - BLENDERLIB(bf_guardedalloc_cpp "${SRC}" "${INC}") + FILE(GLOB SRC cpp/*.cpp) + BLENDERLIB(bf_guardedalloc_cpp "${SRC}" "${INC}") ENDIF(WITH_CXX_GUARDEDALLOC) diff --git a/intern/guardedalloc/SConscript b/intern/guardedalloc/SConscript index ef6c6b49266..2ee0f84b464 100644 --- a/intern/guardedalloc/SConscript +++ b/intern/guardedalloc/SConscript @@ -5,4 +5,4 @@ Import('env') sources = env.Glob('intern/*.c') incs = '.' -env.BlenderLib ('bf_guardedalloc', sources, Split(incs), defines=[], libtype=['intern', 'player'], priority = [10, 175] ) +env.BlenderLib ('bf_guardedalloc', sources, Split(incs), defines=[], libtype=['intern','player'], priority = [5,150] ) diff --git a/intern/iksolver/SConscript b/intern/iksolver/SConscript index df8c10b7302..7adb2d50893 100644 --- a/intern/iksolver/SConscript +++ b/intern/iksolver/SConscript @@ -5,5 +5,5 @@ sources = env.Glob('intern/*.cpp') incs = 'intern ../moto/include ../memutil' -env.BlenderLib ('bf_IK', sources, Split(incs), [], libtype=['intern'], priority=[100] ) +env.BlenderLib ('bf_IK', sources, Split(incs), [], libtype=['intern','player'], priority=[100,90] ) diff --git a/intern/iksolver/intern/TNT/tntmath.h b/intern/iksolver/intern/TNT/tntmath.h index 5773900caf9..55a79e2aba0 100644 --- a/intern/iksolver/intern/TNT/tntmath.h +++ b/intern/iksolver/intern/TNT/tntmath.h @@ -35,7 +35,9 @@ // conventional functions required by several matrix algorithms - +#ifdef _WIN32 +#define hypot _hypot +#endif namespace TNT { diff --git a/intern/memutil/SConscript b/intern/memutil/SConscript index 4528de814f3..318d4a3997e 100644 --- a/intern/memutil/SConscript +++ b/intern/memutil/SConscript @@ -5,4 +5,4 @@ sources = env.Glob('intern/*.cpp') incs = '. ..' -env.BlenderLib ('bf_memutil', sources, Split(incs), [], libtype=['intern', 'player'], priority = [0, 180] ) +env.BlenderLib ('bf_memutil', sources, Split(incs), [], libtype=['intern','player'], priority = [0,155] ) diff --git a/intern/moto/SConscript b/intern/moto/SConscript index a730e6de535..d9bbafe4623 100644 --- a/intern/moto/SConscript +++ b/intern/moto/SConscript @@ -5,4 +5,4 @@ sources = env.Glob('intern/*.cpp') incs = 'include' -env.BlenderLib ('bf_moto', sources, Split(incs), [], libtype=['intern'], priority = [130] ) +env.BlenderLib ('bf_moto', sources, Split(incs), [], libtype=['intern','player'], priority = [130,95] ) diff --git a/intern/smoke/CMakeLists.txt b/intern/smoke/CMakeLists.txt index 0db6acb683f..8ed7a7c9115 100644 --- a/intern/smoke/CMakeLists.txt +++ b/intern/smoke/CMakeLists.txt @@ -29,12 +29,12 @@ SET(INC ${PNG_INC} ${ZLIB_INC} intern ../../extern/bullet2/src ../memutil ../gua FILE(GLOB SRC intern/*.cpp) IF(WITH_OPENMP) - ADD_DEFINITIONS(-DPARALLEL=1) + ADD_DEFINITIONS(-DPARALLEL=1) ENDIF(WITH_OPENMP) IF(WITH_FFTW3) - ADD_DEFINITIONS(-DFFTW3=1) - SET(INC ${INC} ${FFTW3_INC}) + ADD_DEFINITIONS(-DFFTW3=1) + SET(INC ${INC} ${FFTW3_INC}) ENDIF(WITH_FFTW3) diff --git a/intern/smoke/extern/smoke_API.h b/intern/smoke/extern/smoke_API.h index 1a3edce2344..5607df70cf3 100644 --- a/intern/smoke/extern/smoke_API.h +++ b/intern/smoke/extern/smoke_API.h @@ -63,11 +63,11 @@ void smoke_turbulence_free(struct WTURBULENCE *wt); void smoke_turbulence_step(struct WTURBULENCE *wt, struct FLUID_3D *fluid); float *smoke_turbulence_get_density(struct WTURBULENCE *wt); -void smoke_turbulence_get_res(struct WTURBULENCE *wt, unsigned int *res); +void smoke_turbulence_get_res(struct WTURBULENCE *wt, int *res); void smoke_turbulence_set_noise(struct WTURBULENCE *wt, int type); -void smoke_turbulence_initBlenderRNA(struct WTURBULENCE *wt, float *strength); +void smoke_initWaveletBlenderRNA(struct WTURBULENCE *wt, float *strength); -void smoke_turbulence_dissolve(struct WTURBULENCE *wt, int speed, int log); +void smoke_dissolve_wavelet(struct WTURBULENCE *wt, int speed, int log); // export void smoke_turbulence_export(struct WTURBULENCE *wt, float **dens, float **densold, float **tcu, float **tcv, float **tcw); diff --git a/intern/smoke/intern/FLUID_3D.cpp b/intern/smoke/intern/FLUID_3D.cpp index 89dd893198b..8a32eaa2e68 100644 --- a/intern/smoke/intern/FLUID_3D.cpp +++ b/intern/smoke/intern/FLUID_3D.cpp @@ -27,9 +27,9 @@ #include // boundary conditions of the fluid domain -#define DOMAIN_BC_FRONT 1 -#define DOMAIN_BC_TOP 0 -#define DOMAIN_BC_LEFT 1 +#define DOMAIN_BC_FRONT 0 // z +#define DOMAIN_BC_TOP 1 // y +#define DOMAIN_BC_LEFT 1 // x #define DOMAIN_BC_BACK DOMAIN_BC_FRONT #define DOMAIN_BC_BOTTOM DOMAIN_BC_TOP #define DOMAIN_BC_RIGHT DOMAIN_BC_LEFT @@ -111,47 +111,42 @@ FLUID_3D::FLUID_3D(int *res, float *p0, float dt) : } // set side obstacles - size_t index; - for (int y = 0; y < _yRes; y++) // z - for (int x = 0; x < _xRes; x++) - { - // front slab - index = x + y * _xRes; - if(DOMAIN_BC_BOTTOM==1) _obstacles[index] = 1; + int index; + for (int y = 0; y < _yRes; y++) + for (int x = 0; x < _xRes; x++) + { + // front slab + index = x + y * _xRes; + if(DOMAIN_BC_FRONT==1) _obstacles[index] = 1; - // back slab - index += _totalCells - _slabSize; - if(DOMAIN_BC_TOP==1) _obstacles[index] = 1; - } - for (int z = 0; z < _zRes; z++) // y - for (int x = 0; x < _xRes; x++) - { - // bottom slab - index = x + z * _slabSize; - if(DOMAIN_BC_FRONT==1) _obstacles[index] = 1; + // back slab + index += _totalCells - _slabSize; + if(DOMAIN_BC_BACK==1) _obstacles[index] = 1; + } - // top slab - index += _slabSize - _xRes; - if(DOMAIN_BC_BACK==1) _obstacles[index] = 1; - } - for (int z = 0; z < _zRes; z++) // x - for (int y = 0; y < _yRes; y++) - { - // left slab - index = y * _xRes + z * _slabSize; - if(DOMAIN_BC_LEFT==1) _obstacles[index] = 1; + for (int z = 0; z < _zRes; z++) + for (int x = 0; x < _xRes; x++) + { + // bottom slab + index = x + z * _slabSize; + if(DOMAIN_BC_BOTTOM==1) _obstacles[index] = 1; - // right slab - index += _xRes - 1; - if(DOMAIN_BC_RIGHT==1) _obstacles[index] = 1; - } + // top slab + index += _slabSize - _xRes; + if(DOMAIN_BC_TOP==1) _obstacles[index] = 1; + } - /* - SPHERE *obsSphere = NULL; - obsSphere = new SPHERE(0.375,0.5,0.375, 0.1); // for 4 to 3 domain - addObstacle(obsSphere); - delete obsSphere; - */ + for (int z = 0; z < _zRes; z++) + for (int y = 0; y < _yRes; y++) + { + // left slab + index = y * _xRes + z * _slabSize; + if(DOMAIN_BC_LEFT==1) _obstacles[index] = 1; + + // right slab + index += _xRes - 1; + if(DOMAIN_BC_RIGHT==1) _obstacles[index] = 1; + } } FLUID_3D::~FLUID_3D() @@ -187,11 +182,14 @@ void FLUID_3D::initBlenderRNA(float *alpha, float *beta) ////////////////////////////////////////////////////////////////////// void FLUID_3D::step() { + // addSmokeTestCase(_density, _res); + // addSmokeTestCase(_heat, _res); + // wipe forces for (int i = 0; i < _totalCells; i++) { _xForce[i] = _yForce[i] = _zForce[i] = 0.0f; - _obstacles[i] &= ~2; + // _obstacles[i] &= ~2; } wipeBoundaries(); @@ -232,7 +230,8 @@ void FLUID_3D::step() _totalTime += _dt; _totalSteps++; - memset(_obstacles, 0, sizeof(unsigned char)*_xRes*_yRes*_zRes); + // todo xxx dg: only clear obstacles, not boundaries + // memset(_obstacles, 0, sizeof(unsigned char)*_xRes*_yRes*_zRes); } ////////////////////////////////////////////////////////////////////// @@ -270,7 +269,7 @@ void FLUID_3D::artificialDamping(float* field) { ////////////////////////////////////////////////////////////////////// void FLUID_3D::copyBorderAll(float* field) { - size_t index; + int index; for (int y = 0; y < _yRes; y++) for (int x = 0; x < _xRes; x++) { @@ -350,14 +349,14 @@ void FLUID_3D::project() // copy out the boundaries if(DOMAIN_BC_LEFT == 0) setNeumannX(_xVelocity, _res); - else setZeroX(_xVelocity, _res); + else setZeroX(_xVelocity, _res); - if(DOMAIN_BC_TOP == 0) setNeumannZ(_zVelocity, _res); + if(DOMAIN_BC_TOP == 0) setNeumannY(_yVelocity, _res); + else setZeroY(_yVelocity, _res); + + if(DOMAIN_BC_FRONT == 0) setNeumannZ(_zVelocity, _res); else setZeroZ(_zVelocity, _res); - if(DOMAIN_BC_FRONT == 0) setNeumannY(_yVelocity, _res); - else setZeroY(_yVelocity, _res); - // calculate divergence index = _slabSize + _xRes + 1; for (z = 1; z < _zRes - 1; z++, index += 2 * _xRes) @@ -400,12 +399,16 @@ void FLUID_3D::project() for (y = 1; y < _yRes - 1; y++, index += 2) for (x = 1; x < _xRes - 1; x++, index++) { - if(!_obstacles[index]) + // if(!_obstacles[index]) { _xVelocity[index] -= 0.5f * (_pressure[index + 1] - _pressure[index - 1]) * invDx; _yVelocity[index] -= 0.5f * (_pressure[index + _xRes] - _pressure[index - _xRes]) * invDx; _zVelocity[index] -= 0.5f * (_pressure[index + _slabSize] - _pressure[index - _slabSize]) * invDx; - } + }/* + else + { + _xVelocity[index] = _yVelocity[index] = _zVelocity[index] = 0.0f; + }*/ } if (_pressure) delete[] _pressure; @@ -669,14 +672,14 @@ void FLUID_3D::advectMacCormack() Vec3Int res = Vec3Int(_xRes,_yRes,_zRes); if(DOMAIN_BC_LEFT == 0) copyBorderX(_xVelocity, res); - else setZeroX(_xVelocity, res); + else setZeroX(_xVelocity, res); - if(DOMAIN_BC_TOP == 0) copyBorderZ(_zVelocity, res); + if(DOMAIN_BC_TOP == 0) copyBorderY(_yVelocity, res); + else setZeroY(_yVelocity, res); + + if(DOMAIN_BC_FRONT == 0) copyBorderZ(_zVelocity, res); else setZeroZ(_zVelocity, res); - if(DOMAIN_BC_FRONT == 0) copyBorderY(_yVelocity, res); - else setZeroY(_yVelocity, res); - SWAP_POINTERS(_xVelocity, _xVelocityOld); SWAP_POINTERS(_yVelocity, _yVelocityOld); SWAP_POINTERS(_zVelocity, _zVelocityOld); @@ -698,14 +701,14 @@ void FLUID_3D::advectMacCormack() advectFieldMacCormack(dt0, _xVelocityOld, _yVelocityOld, _zVelocityOld, _zVelocityOld, _zVelocity, t1,t2, res, _obstacles); if(DOMAIN_BC_LEFT == 0) copyBorderX(_xVelocity, res); - else setZeroX(_xVelocity, res); + else setZeroX(_xVelocity, res); - if(DOMAIN_BC_TOP == 0) copyBorderZ(_zVelocity, res); + if(DOMAIN_BC_TOP == 0) copyBorderY(_yVelocity, res); + else setZeroY(_yVelocity, res); + + if(DOMAIN_BC_FRONT == 0) copyBorderZ(_zVelocity, res); else setZeroZ(_zVelocity, res); - if(DOMAIN_BC_FRONT == 0) copyBorderY(_yVelocity, res); - else setZeroY(_yVelocity, res); - setZeroBorder(_density, res); setZeroBorder(_heat, res); diff --git a/intern/smoke/intern/FLUID_3D.h b/intern/smoke/intern/FLUID_3D.h index 9d9e7318204..a7be7f58335 100644 --- a/intern/smoke/intern/FLUID_3D.h +++ b/intern/smoke/intern/FLUID_3D.h @@ -47,7 +47,7 @@ class FLUID_3D void initVectorNoise(int amplify); void addSmokeColumn(); - static void addSmokeTestCase(float* field, Vec3Int res, float value); + static void addSmokeTestCase(float* field, Vec3Int res); void step(); void addObstacle(OBSTACLE* obstacle); diff --git a/intern/smoke/intern/FLUID_3D_STATIC.cpp b/intern/smoke/intern/FLUID_3D_STATIC.cpp index 4474129beea..2d3ec125c2b 100644 --- a/intern/smoke/intern/FLUID_3D_STATIC.cpp +++ b/intern/smoke/intern/FLUID_3D_STATIC.cpp @@ -44,8 +44,8 @@ void FLUID_3D::addSmokeColumn() { // generic static version, so that it can be applied to the // WTURBULENCE grid as well ////////////////////////////////////////////////////////////////////// -/* -void FLUID_3D::addSmokeTestCase(float* field, Vec3Int res, float value) + +void FLUID_3D::addSmokeTestCase(float* field, Vec3Int res) { const int slabSize = res[0]*res[1]; int maxRes = (int)MAX3V(res); float dx = 1.0f / (float)maxRes; @@ -57,22 +57,22 @@ void FLUID_3D::addSmokeTestCase(float* field, Vec3Int res, float value) float heighMin = 0.05; float heighMax = 0.10; - for (int y = 0; y < res[1]; y++) - for (int z = (int)(heighMin*res[2]); z <= (int)(heighMax * res[1]); z++) + for (int y = 0; y < res[2]; y++) + for (int z = (int)(heighMin*res[2]); z <= (int)(heighMax * res[2]); z++) for (int x = 0; x < res[0]; x++) { float xLength = x * dx - xTotal * 0.4f; - float yLength = y * dx - zTotal * 0.5f; + float yLength = y * dx - yTotal * 0.5f; float radius = sqrtf(xLength * xLength + yLength * yLength); if (radius < 0.075f * xTotal) { int index = x + y * res[0] + z * slabSize; - field[index] = value; + field[index] = 1.0f; } } } -*/ + ////////////////////////////////////////////////////////////////////// // set x direction to Neumann boundary conditions @@ -80,7 +80,7 @@ void FLUID_3D::addSmokeTestCase(float* field, Vec3Int res, float value) void FLUID_3D::setNeumannX(float* field, Vec3Int res) { const int slabSize = res[0] * res[1]; - size_t index; + int index; for (int z = 0; z < res[2]; z++) for (int y = 0; y < res[1]; y++) { @@ -92,6 +92,18 @@ void FLUID_3D::setNeumannX(float* field, Vec3Int res) index += res[0] - 1; field[index] = field[index - 2]; } + + // fix, force top slab to only allow outwards flux + for (int y = 0; y < res[1]; y++) + for (int z = 0; z < res[2]; z++) + { + // top slab + int index = y * res[0] + z * slabSize; + index += res[0] - 1; + if(field[index]<0.) field[index] = 0.; + index -= 1; + if(field[index]<0.) field[index] = 0.; + } } ////////////////////////////////////////////////////////////////////// @@ -100,18 +112,31 @@ void FLUID_3D::setNeumannX(float* field, Vec3Int res) void FLUID_3D::setNeumannY(float* field, Vec3Int res) { const int slabSize = res[0] * res[1]; - size_t index; + int index; for (int z = 0; z < res[2]; z++) for (int x = 0; x < res[0]; x++) { - // front slab + // bottom slab index = x + z * slabSize; field[index] = field[index + 2 * res[0]]; - // back slab + // top slab index += slabSize - res[0]; field[index] = field[index - 2 * res[0]]; } + + // fix, force top slab to only allow outwards flux + for (int z = 0; z < res[2]; z++) + for (int x = 0; x < res[0]; x++) + { + // top slab + int index = x + z * slabSize; + index += slabSize - res[0]; + if(field[index]<0.) field[index] = 0.; + index -= res[0]; + if(field[index]<0.) field[index] = 0.; + } + } ////////////////////////////////////////////////////////////////////// @@ -121,15 +146,15 @@ void FLUID_3D::setNeumannZ(float* field, Vec3Int res) { const int slabSize = res[0] * res[1]; const int totalCells = res[0] * res[1] * res[2]; - size_t index; + int index; for (int y = 0; y < res[1]; y++) for (int x = 0; x < res[0]; x++) { - // bottom slab + // front slab index = x + y * res[0]; field[index] = field[index + 2 * slabSize]; - // top slab + // back slab index += totalCells - slabSize; field[index] = field[index - 2 * slabSize]; } @@ -139,11 +164,11 @@ void FLUID_3D::setNeumannZ(float* field, Vec3Int res) for (int x = 0; x < res[0]; x++) { // top slab - index = x + y * res[0]; + int index = x + y * res[0]; index += totalCells - slabSize; - if(field[index]<0.) field[index] = 0.0f; + if(field[index]<0.) field[index] = 0.; index -= slabSize; - if(field[index]<0.) field[index] = 0.0f; + if(field[index]<0.) field[index] = 0.; } } @@ -231,13 +256,14 @@ void FLUID_3D::copyBorderX(float* field, Vec3Int res) void FLUID_3D::copyBorderY(float* field, Vec3Int res) { const int slabSize = res[0] * res[1]; + const int totalCells = res[0] * res[1] * res[2]; int index; for (int z = 0; z < res[2]; z++) for (int x = 0; x < res[0]; x++) { // bottom slab index = x + z * slabSize; - field[index] = field[index + res[0]]; + field[index] = field[index + res[0]]; // top slab index += slabSize - res[0]; field[index] = field[index - res[0]]; @@ -253,7 +279,7 @@ void FLUID_3D::copyBorderZ(float* field, Vec3Int res) { // front slab index = x + y * res[0]; - field[index] = field[index + slabSize]; + field[index] = field[index + slabSize]; // back slab index += totalCells - slabSize; field[index] = field[index - slabSize]; @@ -273,14 +299,15 @@ void FLUID_3D::advectFieldSemiLagrange(const float dt, const float* velx, const // scale dt up to grid resolution #if PARALLEL==1 -#pragma omp parallel for schedule(static) +#pragma omp parallel +#pragma omp for schedule(static) #endif for (int z = 0; z < zres; z++) for (int y = 0; y < yres; y++) for (int x = 0; x < xres; x++) { const int index = x + y * xres + z * xres*yres; - + // backtrace float xTrace = x - dt * velx[index]; float yTrace = y - dt * vely[index]; @@ -337,8 +364,8 @@ void FLUID_3D::advectFieldSemiLagrange(const float dt, const float* velx, const // // comments are the pseudocode from selle's paper ////////////////////////////////////////////////////////////////////// -void FLUID_3D::advectFieldMacCormack(const float dt, const float* xVelocity, const float* yVelocity, const float* zVelocity, - float* oldField, float* newField, float* temp1, float* temp2, Vec3Int res, const unsigned char* obstacles) +void FLUID_3D::advectFieldMacCormack(const float dt, const float* xVelocity, const float* yVelocity, const float* zVelocity, + float* oldField, float* newField, float* temp1, float* temp2, Vec3Int res, const unsigned char* obstacles) { float* phiHatN = temp1; float* phiHatN1 = temp2; @@ -359,7 +386,7 @@ void FLUID_3D::advectFieldMacCormack(const float dt, const float* xVelocity, con advectFieldSemiLagrange( -1.0*dt, xVelocity, yVelocity, zVelocity, phiHatN1, phiHatN, res); // phiN1 = phiHatN1 + (phiN - phiHatN) / 2 - const int border = 0; + const int border = 0; for (int z = border; z < sz-border; z++) for (int y = border; y < sy-border; y++) for (int x = border; x < sx-border; x++) { @@ -376,7 +403,7 @@ void FLUID_3D::advectFieldMacCormack(const float dt, const float* xVelocity, con // if the error estimate was bad, revert to first order clampOutsideRays(dt, xVelocity, yVelocity, zVelocity, oldField, newField, res, obstacles, phiHatN1); -} +} ////////////////////////////////////////////////////////////////////// @@ -454,17 +481,18 @@ void FLUID_3D::clampExtrema(const float dt, const float* velx, const float* vely } ////////////////////////////////////////////////////////////////////// -// Reverts any backtraces that go into boundaries back to first +// Reverts any backtraces that go into boundaries back to first // order -- in this case the error correction term was totally // incorrect ////////////////////////////////////////////////////////////////////// -void FLUID_3D::clampOutsideRays(const float dt, const float* velx, const float* vely, const float* velz, - float* oldField, float* newField, Vec3Int res, const unsigned char* obstacles, const float *oldAdvection) +void FLUID_3D::clampOutsideRays(const float dt, const float* velx, const float* vely, const float* velz, + float* oldField, float* newField, Vec3Int res, const unsigned char* obstacles, const float *oldAdvection) { const int sx= res[0]; const int sy= res[1]; const int sz= res[2]; const int slabSize = res[0] * res[1]; + for (int z = 1; z < sz-1; z++) for (int y = 1; y < sy-1; y++) for (int x = 1; x < sx-1; x++) @@ -479,7 +507,7 @@ void FLUID_3D::clampOutsideRays(const float dt, const float* velx, const float* float zTrace = z - dt * velz[index]; // see if it goes outside the boundaries - bool hasObstacle = + bool hasObstacle = (zTrace < 1.0f) || (zTrace > sz - 2.0f) || (yTrace < 1.0f) || (yTrace > sy - 2.0f) || (xTrace < 1.0f) || (xTrace > sx - 2.0f) || @@ -515,7 +543,7 @@ void FLUID_3D::clampOutsideRays(const float dt, const float* velx, const float* int z0 = (int)zBackward; int z1 = z0 + 1; if(obstacles && !hasObstacle) { - hasObstacle = hasObstacle || + hasObstacle = hasObstacle || obstacles[x0 + y0 * sx + z0*slabSize] || obstacles[x0 + y1 * sx + z0*slabSize] || obstacles[x1 + y0 * sx + z0*slabSize] || @@ -535,7 +563,7 @@ void FLUID_3D::clampOutsideRays(const float dt, const float* velx, const float* z0 = (int)zTrace; z1 = z0 + 1; if(obstacles && !hasObstacle) { - hasObstacle = hasObstacle || + hasObstacle = hasObstacle || obstacles[x0 + y0 * sx + z0*slabSize] || obstacles[x0 + y1 * sx + z0*slabSize] || obstacles[x1 + y0 * sx + z0*slabSize] || @@ -577,84 +605,8 @@ void FLUID_3D::clampOutsideRays(const float dt, const float* velx, const float* u1 * (s0 * (t0 * oldField[i001] + t1 * oldField[i011]) + s1 * (t0 * oldField[i101] + - t1 * oldField[i111])); + t1 * oldField[i111])); } } // xyz } -////////////////////////////////////////////////////////////////////// -// image output -////////////////////////////////////////////////////////////////////// -/* -void FLUID_3D::writeImageSliceXY(const float *field, Vec3Int res, int slice, string prefix, int picCnt, float scale) { - writeProjectedIntern(field, res, 0,1, prefix, picCnt, scale); -} -void FLUID_3D::writeImageSliceYZ(const float *field, Vec3Int res, int slice, string prefix, int picCnt, float scale) { - writeProjectedIntern(field, res, 1,2, prefix, picCnt, scale); -} -void FLUID_3D::writeImageSliceXZ(const float *field, Vec3Int res, int slice, string prefix, int picCnt, float scale) { - writeProjectedIntern(field, res, 0,2, prefix, picCnt, scale); -} -*/ - -////////////////////////////////////////////////////////////////////// -// Helper function for projecting densities along a dimension -////////////////////////////////////////////////////////////////////// -/* -static int getOtherDir(int dir1, int dir2) { - switch(dir1) { - case 0: - switch(dir2) { - case 1: return 2; - case 2: return 1; } - break; - case 1: - switch(dir2) { - case 0: return 2; - case 2: return 0; } - break; - case 2: - switch(dir2) { - case 0: return 1; - case 1: return 0; } - break; - default: - return 0; - } - return 0; -} -*/ - -////////////////////////////////////////////////////////////////////// -// average densities along third spatial direction -////////////////////////////////////////////////////////////////////// -/* -void FLUID_3D::writeProjectedIntern(const float *field, Vec3Int res, - int dir1, int dir2, string prefix, int picCnt, float scale) { - const int nitems = res[dir1]*res[dir2]; - const int otherDir = getOtherDir(dir1,dir2); - float *buf = new float[nitems]; - Vec3Int min = Vec3Int(0); - Vec3Int max = res; - - min[otherDir] = 0; - max[otherDir] = res[otherDir]; - float div = 1./(float)MIN3V(res); // normalize for shorter sides, old: res[otherDir]; - div *= 4.; //slightly increase contrast - for(int i=0; i 0) { - _energy[index] = sum / valid; + _energy[index] = sum / (float)valid; obstacles[index] = MARCHED; } } @@ -516,9 +500,9 @@ void WTURBULENCE::computeEnergy(float* xvel, float* yvel, float* zvel, unsigned Vec3 WTURBULENCE::WVelocity(Vec3 orgPos) { // arbitrarily offset evaluation points - const Vec3 p1 = orgPos + Vec3(NOISE_TILE_SIZE/2,0,0); - const Vec3 p2 = orgPos + Vec3(0,NOISE_TILE_SIZE/2,0); - const Vec3 p3 = orgPos + Vec3(0,0,NOISE_TILE_SIZE/2); + const Vec3 p1 = orgPos + Vec3(NOISE_TILE_SIZE/2.0,0,0); + const Vec3 p2 = orgPos + Vec3(0,NOISE_TILE_SIZE/2.0,0); + const Vec3 p3 = orgPos + Vec3(0,0,NOISE_TILE_SIZE/2.0); const float f1y = WNoiseDy(p1, _noiseTile); const float f1z = WNoiseDz(p1, _noiseTile); @@ -542,9 +526,9 @@ Vec3 WTURBULENCE::WVelocity(Vec3 orgPos) Vec3 WTURBULENCE::WVelocityWithJacobian(Vec3 orgPos, float* xUnwarped, float* yUnwarped, float* zUnwarped) { // arbitrarily offset evaluation points - const Vec3 p1 = orgPos + Vec3(NOISE_TILE_SIZE/2,0,0); - const Vec3 p2 = orgPos + Vec3(0,NOISE_TILE_SIZE/2,0); - const Vec3 p3 = orgPos + Vec3(0,0,NOISE_TILE_SIZE/2); + const Vec3 p1 = orgPos + Vec3(NOISE_TILE_SIZE/2.0,0,0); + const Vec3 p2 = orgPos + Vec3(0,NOISE_TILE_SIZE/2.0,0); + const Vec3 p3 = orgPos + Vec3(0,0,NOISE_TILE_SIZE/2.0); Vec3 final; final[0] = WNoiseDx(p1, _noiseTile); @@ -575,44 +559,40 @@ Vec3 WTURBULENCE::WVelocityWithJacobian(Vec3 orgPos, float* xUnwarped, float* yU return ret; } + ////////////////////////////////////////////////////////////////////// // perform an actual noise advection step ////////////////////////////////////////////////////////////////////// void WTURBULENCE::stepTurbulenceReadable(float dtOrg, float* xvel, float* yvel, float* zvel, unsigned char *obstacles) { - // big velocity macCormack fields - float* _bigUx; - float* _bigUy; - float* _bigUz; + // enlarge timestep to match grid + const float dt = dtOrg * _amplify; + const float invAmp = 1.0f / _amplify; + float *tempBig1 = new float[_totalCellsBig]; + float *tempBig2 = new float[_totalCellsBig]; + float *bigUx = new float[_totalCellsBig]; + float *bigUy = new float[_totalCellsBig]; + float *bigUz = new float[_totalCellsBig]; + float *_energy = new float[_totalCellsSm]; + float *highFreqEnergy = new float[_totalCellsSm]; + float *eigMin = new float[_totalCellsSm]; + float *eigMax = new float[_totalCellsSm]; - // temp arrays for BFECC and MacCormack - they have more convenient - // names in the actual implementations - float* _tempBig1; - float* _tempBig2; + memset(tempBig1, 0, sizeof(float)*_totalCellsBig); + memset(tempBig2, 0, sizeof(float)*_totalCellsBig); + memset(highFreqEnergy, 0, sizeof(float)*_totalCellsSm); + memset(eigMin, 0, sizeof(float)*_totalCellsSm); + memset(eigMax, 0, sizeof(float)*_totalCellsSm); - // allocate high resolution velocity field. Note that this is only - // necessary because we use MacCormack advection. For semi-Lagrangian - // advection, these arrays are not necessary. - _tempBig1 = new float[_totalCellsBig]; - _tempBig2 = new float[_totalCellsBig]; - - // enlarge timestep to match grid - const float dt = dtOrg * _amplify; - const float invAmp = 1.0f / _amplify; - - _bigUx = new float[_totalCellsBig]; - _bigUy = new float[_totalCellsBig]; - _bigUz = new float[_totalCellsBig]; - - // prepare textures - advectTextureCoordinates(dtOrg, xvel,yvel,zvel, _tempBig1, _tempBig2); + // prepare textures + advectTextureCoordinates(dtOrg, xvel,yvel,zvel, tempBig1, tempBig2); // compute eigenvalues of the texture coordinates - computeEigenvalues(); + computeEigenvalues(eigMin, eigMax); // do wavelet decomposition of energy - computeEnergy(xvel, yvel, zvel, obstacles); - decomposeEnergy(); + computeEnergy(_energy, xvel, yvel, zvel, obstacles); + decomposeEnergy(_energy, highFreqEnergy); // zero out coefficients inside of the obstacle for (int x = 0; x < _totalCellsSm; x++) @@ -647,7 +627,7 @@ void WTURBULENCE::stepTurbulenceReadable(float dtOrg, float* xvel, float* yvel, // retrieve wavelet energy at highest frequency float energy = INTERPOLATE::lerp3d( - _highFreqEnergy, posSm[0],posSm[1],posSm[2], _xResSm, _yResSm, _zResSm); + highFreqEnergy, posSm[0],posSm[1],posSm[2], _xResSm, _yResSm, _zResSm); // base amplitude for octave 0 float coefficient = sqrtf(2.0f * fabs(energy)); @@ -656,8 +636,8 @@ void WTURBULENCE::stepTurbulenceReadable(float dtOrg, float* xvel, float* yvel, // add noise to velocity, but only if the turbulence is // sufficiently undeformed, and the energy is large enough // to make a difference - const bool addNoise = _eigMax[indexSmall] < 2. && - _eigMin[indexSmall] > 0.5; + const bool addNoise = eigMax[indexSmall] < 2. && + eigMin[indexSmall] > 0.5; if (addNoise && amplitude > _cullingThreshold) { // base amplitude for octave 0 float amplitudeScaled = amplitude; @@ -679,21 +659,21 @@ void WTURBULENCE::stepTurbulenceReadable(float dtOrg, float* xvel, float* yvel, // If you wanted to save memory, you would instead perform a // semi-Lagrangian backtrace for the current grid cell here. Then // you could just throw the velocity away. - _bigUx[index] = vel[0]; - _bigUy[index] = vel[1]; - _bigUz[index] = vel[2]; + bigUx[index] = vel[0]; + bigUy[index] = vel[1]; + bigUz[index] = vel[2]; // compute the velocity magnitude for substepping later - const float velMag = _bigUx[index] * _bigUx[index] + - _bigUy[index] * _bigUy[index] + - _bigUz[index] * _bigUz[index]; + const float velMag = bigUx[index] * bigUx[index] + + bigUy[index] * bigUy[index] + + bigUz[index] * bigUz[index]; if (velMag > maxVelocity) maxVelocity = velMag; // zero out velocity inside obstacles float obsCheck = INTERPOLATE::lerp3dToFloat( obstacles, posSm[0], posSm[1], posSm[2], _xResSm, _yResSm, _zResSm); if (obsCheck > 0.95) - _bigUx[index] = _bigUy[index] = _bigUz[index] = 0.; + bigUx[index] = bigUy[index] = bigUz[index] = 0.; } // prepare density for an advection @@ -701,24 +681,23 @@ void WTURBULENCE::stepTurbulenceReadable(float dtOrg, float* xvel, float* yvel, // based on the maximum velocity present, see if we need to substep, // but cap the maximum number of substeps to 5 - const int maxSubSteps = 25; - const int maxVel = 5; + const int maxSubSteps = 5; maxVelocity = sqrt(maxVelocity) * dt; - int totalSubsteps = (int)(maxVelocity / (float)maxVel); + int totalSubsteps = (int)(maxVelocity / (float)maxSubSteps); totalSubsteps = (totalSubsteps < 1) ? 1 : totalSubsteps; totalSubsteps = (totalSubsteps > maxSubSteps) ? maxSubSteps : totalSubsteps; const float dtSubdiv = dt / (float)totalSubsteps; // set boundaries of big velocity grid - FLUID_3D::setZeroX(_bigUx, _resBig); - FLUID_3D::setZeroY(_bigUy, _resBig); - FLUID_3D::setZeroZ(_bigUz, _resBig); + FLUID_3D::setZeroX(bigUx, _resBig); + FLUID_3D::setZeroY(bigUy, _resBig); + FLUID_3D::setZeroZ(bigUz, _resBig); // do the MacCormack advection, with substepping if necessary for(int substep = 0; substep < totalSubsteps; substep++) { - FLUID_3D::advectFieldMacCormack(dtSubdiv, _bigUx, _bigUy, _bigUz, - _densityBigOld, _densityBig, _tempBig1, _tempBig2, _resBig, NULL); + FLUID_3D::advectFieldMacCormack(dtSubdiv, bigUx, bigUy, bigUz, + _densityBigOld, _densityBig, tempBig1, tempBig2, _resBig, NULL); if (substep < totalSubsteps - 1) SWAP_POINTERS(_densityBig, _densityBigOld); @@ -730,25 +709,21 @@ void WTURBULENCE::stepTurbulenceReadable(float dtOrg, float* xvel, float* yvel, // reset texture coordinates now in preparation for next timestep // Shouldn't do this before generating the noise because then the // eigenvalues stored do not reflect the underlying texture coordinates - resetTextureCoordinates(); + resetTextureCoordinates(eigMin, eigMax); - // output files - /* - string prefix = string("./amplified.preview/density_bigxy_"); - FLUID_3D::writeImageSliceXY(_densityBig, _resBig, _resBig[2]/2, prefix, _totalStepsBig, 1.0f); - //string df3Prefix = string("./df3/density_big_"); - //IMAGE::dumpDF3(_totalStepsBig, df3Prefix, _densityBig, _resBig[0],_resBig[1],_resBig[2]); - string pbrtPrefix = string("./pbrt/density_big_"); - IMAGE::dumpPBRT(_totalStepsBig, pbrtPrefix, _densityBig, _resBig[0],_resBig[1],_resBig[2]); - */ + delete[] tempBig1; + delete[] tempBig2; + delete[] bigUx; + delete[] bigUy; + delete[] bigUz; + delete[] _energy; + delete[] highFreqEnergy; + + delete[] eigMin; + delete[] eigMax; + + _totalStepsBig++; - - delete[] _bigUx; - delete[] _bigUy; - delete[] _bigUz; - - delete[] _tempBig1; - delete[] _tempBig2; } ////////////////////////////////////////////////////////////////////// @@ -757,257 +732,258 @@ void WTURBULENCE::stepTurbulenceReadable(float dtOrg, float* xvel, float* yvel, ////////////////////////////////////////////////////////////////////// void WTURBULENCE::stepTurbulenceFull(float dtOrg, float* xvel, float* yvel, float* zvel, unsigned char *obstacles) { - // big velocity macCormack fields - float* _bigUx; - float* _bigUy; - float* _bigUz; - - // temp arrays for BFECC and MacCormack - they have more convenient - // names in the actual implementations - float* _tempBig1; - float* _tempBig2; - - // allocate high resolution velocity field. Note that this is only - // necessary because we use MacCormack advection. For semi-Lagrangian - // advection, these arrays are not necessary. - _tempBig1 = new float[_totalCellsBig]; - _tempBig2 = new float[_totalCellsBig]; - // enlarge timestep to match grid const float dt = dtOrg * _amplify; const float invAmp = 1.0f / _amplify; + float *tempBig1 = new float[_totalCellsBig]; + float *tempBig2 = new float[_totalCellsBig]; + float *bigUx = new float[_totalCellsBig]; + float *bigUy = new float[_totalCellsBig]; + float *bigUz = new float[_totalCellsBig]; + float *_energy = new float[_totalCellsSm]; + float *highFreqEnergy = new float[_totalCellsSm]; + float *eigMin = new float[_totalCellsSm]; + float *eigMax = new float[_totalCellsSm]; - _bigUx = new float[_totalCellsBig]; - _bigUy = new float[_totalCellsBig]; - _bigUz = new float[_totalCellsBig]; + memset(highFreqEnergy, 0, sizeof(float)*_totalCellsSm); + memset(eigMin, 0, sizeof(float)*_totalCellsSm); + memset(eigMax, 0, sizeof(float)*_totalCellsSm); // prepare textures - advectTextureCoordinates(dtOrg, xvel,yvel,zvel, _tempBig1, _tempBig2); + advectTextureCoordinates(dtOrg, xvel,yvel,zvel, tempBig1, tempBig2); // do wavelet decomposition of energy - computeEnergy(xvel, yvel, zvel, obstacles); - decomposeEnergy(); + computeEnergy(_energy, xvel, yvel, zvel, obstacles); - // zero out coefficients inside of the obstacle for (int x = 0; x < _totalCellsSm; x++) if (obstacles[x]) _energy[x] = 0.f; - // parallel region setup - float maxVelMagThreads[8] = { -1., -1., -1., -1., -1., -1., -1., -1. }; + decomposeEnergy(_energy, highFreqEnergy); - #if PARALLEL==1 - #pragma omp parallel - #endif - { float maxVelMag1 = 0.; - #if PARALLEL==1 - const int id = omp_get_thread_num(); /*, num = omp_get_num_threads(); */ - #endif + // zero out coefficients inside of the obstacle + for (int x = 0; x < _totalCellsSm; x++) + if (obstacles[x]) highFreqEnergy[x] = 0.f; - // vector noise main loop - #if PARALLEL==1 - #pragma omp for schedule(static) - #endif - for (int zSmall = 0; zSmall < _zResSm; zSmall++) - for (int ySmall = 0; ySmall < _yResSm; ySmall++) - for (int xSmall = 0; xSmall < _xResSm; xSmall++) - { - const int indexSmall = xSmall + ySmall * _xResSm + zSmall * _slabSizeSm; + Vec3Int ressm(_xResSm, _yResSm, _zResSm); + FLUID_3D::setNeumannX(highFreqEnergy, ressm); + FLUID_3D::setNeumannY(highFreqEnergy, ressm); + FLUID_3D::setNeumannZ(highFreqEnergy, ressm); - // compute jacobian - float jacobian[3][3] = { - { minDx(xSmall, ySmall, zSmall, _tcU, _resSm), minDx(xSmall, ySmall, zSmall, _tcV, _resSm), minDx(xSmall, ySmall, zSmall, _tcW, _resSm) } , - { minDy(xSmall, ySmall, zSmall, _tcU, _resSm), minDy(xSmall, ySmall, zSmall, _tcV, _resSm), minDy(xSmall, ySmall, zSmall, _tcW, _resSm) } , - { minDz(xSmall, ySmall, zSmall, _tcU, _resSm), minDz(xSmall, ySmall, zSmall, _tcV, _resSm), minDz(xSmall, ySmall, zSmall, _tcW, _resSm) } - }; + // parallel region setup + float maxVelMagThreads[8] = { -1., -1., -1., -1., -1., -1., -1., -1. }; +#if PARALLEL==1 +#pragma omp parallel +#endif + { float maxVelMag1 = 0.; +#if PARALLEL==1 + const int id = omp_get_thread_num(); /*, num = omp_get_num_threads(); */ +#endif - // get LU factorization of texture jacobian and apply - // it to unit vectors - JAMA::LU LU = computeLU3x3(jacobian); - float xUnwarped[] = {1.0f, 0.0f, 0.0f}; - float yUnwarped[] = {0.0f, 1.0f, 0.0f}; - float zUnwarped[] = {0.0f, 0.0f, 1.0f}; - float xWarped[] = {1.0f, 0.0f, 0.0f}; - float yWarped[] = {0.0f, 1.0f, 0.0f}; - float zWarped[] = {0.0f, 0.0f, 1.0f}; - bool nonSingular = LU.isNonsingular(); + // vector noise main loop +#if PARALLEL==1 +#pragma omp for schedule(static) +#endif + for (int zSmall = 0; zSmall < _zResSm; zSmall++) + for (int ySmall = 0; ySmall < _yResSm; ySmall++) + for (int xSmall = 0; xSmall < _xResSm; xSmall++) + { + const int indexSmall = xSmall + ySmall * _xResSm + zSmall * _slabSizeSm; - #if 0 - // UNUSED - float eigMax = 10.0f; - float eigMin = 0.1f; - #endif + // compute jacobian + float jacobian[3][3] = { + { minDx(xSmall, ySmall, zSmall, _tcU, _resSm), minDx(xSmall, ySmall, zSmall, _tcV, _resSm), minDx(xSmall, ySmall, zSmall, _tcW, _resSm) } , + { minDy(xSmall, ySmall, zSmall, _tcU, _resSm), minDy(xSmall, ySmall, zSmall, _tcV, _resSm), minDy(xSmall, ySmall, zSmall, _tcW, _resSm) } , + { minDz(xSmall, ySmall, zSmall, _tcU, _resSm), minDz(xSmall, ySmall, zSmall, _tcV, _resSm), minDz(xSmall, ySmall, zSmall, _tcW, _resSm) } + }; - if (nonSingular) - { - solveLU3x3(LU, xUnwarped, xWarped); - solveLU3x3(LU, yUnwarped, yWarped); - solveLU3x3(LU, zUnwarped, zWarped); + // get LU factorization of texture jacobian and apply + // it to unit vectors + JAMA::LU LU = computeLU3x3(jacobian); + float xUnwarped[] = {1.0f, 0.0f, 0.0f}; + float yUnwarped[] = {0.0f, 1.0f, 0.0f}; + float zUnwarped[] = {0.0f, 0.0f, 1.0f}; + float xWarped[] = {1.0f, 0.0f, 0.0f}; + float yWarped[] = {0.0f, 1.0f, 0.0f}; + float zWarped[] = {0.0f, 0.0f, 1.0f}; + bool nonSingular = LU.isNonsingular(); +#if 0 + // UNUSED + float eigMax = 10.0f; + float eigMin = 0.1f; +#endif + if (nonSingular) + { + solveLU3x3(LU, xUnwarped, xWarped); + solveLU3x3(LU, yUnwarped, yWarped); + solveLU3x3(LU, zUnwarped, zWarped); - // compute the eigenvalues while we have the Jacobian available - Vec3 eigenvalues = Vec3(1.); - computeEigenvalues3x3( &eigenvalues[0], jacobian); - _eigMax[indexSmall] = MAX3V(eigenvalues); - _eigMin[indexSmall] = MIN3V(eigenvalues); - } + // compute the eigenvalues while we have the Jacobian available + Vec3 eigenvalues = Vec3(1.); + computeEigenvalues3x3( &eigenvalues[0], jacobian); + eigMax[indexSmall] = MAX3V(eigenvalues); + eigMin[indexSmall] = MIN3V(eigenvalues); + } + + // make sure to skip one on the beginning and end + int xStart = (xSmall == 0) ? 1 : 0; + int xEnd = (xSmall == _xResSm - 1) ? _amplify - 1 : _amplify; + int yStart = (ySmall == 0) ? 1 : 0; + int yEnd = (ySmall == _yResSm - 1) ? _amplify - 1 : _amplify; + int zStart = (zSmall == 0) ? 1 : 0; + int zEnd = (zSmall == _zResSm - 1) ? _amplify - 1 : _amplify; + + for (int zBig = zStart; zBig < zEnd; zBig++) + for (int yBig = yStart; yBig < yEnd; yBig++) + for (int xBig = xStart; xBig < xEnd; xBig++) + { + const int x = xSmall * _amplify + xBig; + const int y = ySmall * _amplify + yBig; + const int z = zSmall * _amplify + zBig; + + // get unit position for both fine and coarse grid + const Vec3 pos = Vec3(x,y,z); + const Vec3 posSm = pos * invAmp; + + // get grid index for both fine and coarse grid + const int index = x + y *_xResBig + z *_slabSizeBig; + + // get a linearly interpolated velocity and texcoords + // from the coarse grid + Vec3 vel = INTERPOLATE::lerp3dVec( xvel,yvel,zvel, + posSm[0], posSm[1], posSm[2], _xResSm,_yResSm,_zResSm); + Vec3 uvw = INTERPOLATE::lerp3dVec( _tcU,_tcV,_tcW, + posSm[0], posSm[1], posSm[2], _xResSm,_yResSm,_zResSm); - // make sure to skip one on the beginning and end - int xStart = (xSmall == 0) ? 1 : 0; - int xEnd = (xSmall == _xResSm - 1) ? _amplify - 1 : _amplify; - int yStart = (ySmall == 0) ? 1 : 0; - int yEnd = (ySmall == _yResSm - 1) ? _amplify - 1 : _amplify; - int zStart = (zSmall == 0) ? 1 : 0; - int zEnd = (zSmall == _zResSm - 1) ? _amplify - 1 : _amplify; - - for (int zBig = zStart; zBig < zEnd; zBig++) - for (int yBig = yStart; yBig < yEnd; yBig++) - for (int xBig = xStart; xBig < xEnd; xBig++) - { - const int x = xSmall * _amplify + xBig; - const int y = ySmall * _amplify + yBig; - const int z = zSmall * _amplify + zBig; + // multiply the texture coordinate by _resSm so that turbulence + // synthesis begins at the first octave that the coarse grid + // cannot capture + Vec3 texCoord = Vec3(uvw[0] * _resSm[0], + uvw[1] * _resSm[1], + uvw[2] * _resSm[2]); - // get unit position for both fine and coarse grid - const Vec3 pos = Vec3(x,y,z); - const Vec3 posSm = pos * invAmp; + // retrieve wavelet energy at highest frequency + float energy = INTERPOLATE::lerp3d( + highFreqEnergy, posSm[0],posSm[1],posSm[2], _xResSm, _yResSm, _zResSm); - // get grid index for both fine and coarse grid - const int index = x + y *_xResBig + z *_slabSizeBig; + // base amplitude for octave 0 + float coefficient = sqrtf(2.0f * fabs(energy)); + const float amplitude = *_strength * fabs(0.5 * coefficient) * persistence; - // get a linearly interpolated velocity and texcoords - // from the coarse grid - Vec3 vel = INTERPOLATE::lerp3dVec( xvel,yvel,zvel, - posSm[0], posSm[1], posSm[2], _xResSm,_yResSm,_zResSm); - Vec3 uvw = INTERPOLATE::lerp3dVec( _tcU,_tcV,_tcW, - posSm[0], posSm[1], posSm[2], _xResSm,_yResSm,_zResSm); + // add noise to velocity, but only if the turbulence is + // sufficiently undeformed, and the energy is large enough + // to make a difference + const bool addNoise = eigMax[indexSmall] < 2. && + eigMin[indexSmall] > 0.5; + if (addNoise && amplitude > _cullingThreshold) { + // base amplitude for octave 0 + float amplitudeScaled = amplitude; - // multiply the texture coordinate by _resSm so that turbulence - // synthesis begins at the first octave that the coarse grid - // cannot capture - Vec3 texCoord = Vec3(uvw[0] * _resSm[0], - uvw[1] * _resSm[1], - uvw[2] * _resSm[2]); + for (int octave = 0; octave < _octaves; octave++) + { + // multiply the vector noise times the maximum allowed + // noise amplitude at this octave, and add it to the total + vel += WVelocityWithJacobian(texCoord, &xUnwarped[0], &yUnwarped[0], &zUnwarped[0]) * amplitudeScaled; - // retrieve wavelet energy at highest frequency - float energy = INTERPOLATE::lerp3d( - _highFreqEnergy, posSm[0],posSm[1],posSm[2], _xResSm, _yResSm, _zResSm); + // scale coefficient for next octave + amplitudeScaled *= persistence; + texCoord *= 2.0f; + } + } - // base amplitude for octave 0 - float coefficient = sqrtf(2.0f * fabs(energy)); - const float amplitude = *_strength * fabs(0.5 * coefficient) * persistence; + // Store velocity + turbulence in big grid for maccormack step + // + // If you wanted to save memory, you would instead perform a + // semi-Lagrangian backtrace for the current grid cell here. Then + // you could just throw the velocity away. + bigUx[index] = vel[0]; + bigUy[index] = vel[1]; + bigUz[index] = vel[2]; - // add noise to velocity, but only if the turbulence is - // sufficiently undeformed, and the energy is large enough - // to make a difference - const bool addNoise = _eigMax[indexSmall] < 2. && - _eigMin[indexSmall] > 0.5; + // compute the velocity magnitude for substepping later + const float velMag = bigUx[index] * bigUx[index] + + bigUy[index] * bigUy[index] + + bigUz[index] * bigUz[index]; + if (velMag > maxVelMag1) maxVelMag1 = velMag; - if (addNoise && amplitude > _cullingThreshold) { - // base amplitude for octave 0 - float amplitudeScaled = amplitude; + // zero out velocity inside obstacles + float obsCheck = INTERPOLATE::lerp3dToFloat( + obstacles, posSm[0], posSm[1], posSm[2], _xResSm, _yResSm, _zResSm); + if (obsCheck > 0.95) + bigUx[index] = bigUy[index] = bigUz[index] = 0.; + } // xyz - for (int octave = 0; octave < _octaves; octave++) - { - // multiply the vector noise times the maximum allowed - // noise amplitude at this octave, and add it to the total - vel += WVelocityWithJacobian(texCoord, &xUnwarped[0], &yUnwarped[0], &zUnwarped[0]) * amplitudeScaled; +#if PARALLEL==1 + maxVelMagThreads[id] = maxVelMag1; +#else + maxVelMagThreads[0] = maxVelMag1; +#endif + } + } // omp + + // compute maximum over threads + float maxVelMag = maxVelMagThreads[0]; +#if PARALLEL==1 + for (int i = 1; i < 8; i++) + if (maxVelMag < maxVelMagThreads[i]) + maxVelMag = maxVelMagThreads[i]; +#endif - // scale coefficient for next octave - amplitudeScaled *= persistence; - texCoord *= 2.0f; - } - } + // prepare density for an advection + SWAP_POINTERS(_densityBig, _densityBigOld); - // Store velocity + turbulence in big grid for maccormack step - // - // If you wanted to save memory, you would instead perform a - // semi-Lagrangian backtrace for the current grid cell here. Then - // you could just throw the velocity away. - _bigUx[index] = vel[0]; - _bigUy[index] = vel[1]; - _bigUz[index] = vel[2]; + // based on the maximum velocity present, see if we need to substep, + // but cap the maximum number of substeps to 5 + const int maxSubSteps = 25; + const int maxVel = 5; + maxVelMag = sqrt(maxVelMag) * dt; + int totalSubsteps = (int)(maxVelMag / (float)maxVel); + totalSubsteps = (totalSubsteps < 1) ? 1 : totalSubsteps; + // printf("totalSubsteps: %d\n", totalSubsteps); + totalSubsteps = (totalSubsteps > maxSubSteps) ? maxSubSteps : totalSubsteps; + const float dtSubdiv = dt / (float)totalSubsteps; - // compute the velocity magnitude for substepping later - const float velMag = _bigUx[index] * _bigUx[index] + - _bigUy[index] * _bigUy[index] + - _bigUz[index] * _bigUz[index]; - if (velMag > maxVelMag1) maxVelMag1 = velMag; + // set boundaries of big velocity grid + FLUID_3D::setZeroX(bigUx, _resBig); + FLUID_3D::setZeroY(bigUy, _resBig); + FLUID_3D::setZeroZ(bigUz, _resBig); - // zero out velocity inside obstacles - float obsCheck = INTERPOLATE::lerp3dToFloat( - obstacles, posSm[0], posSm[1], posSm[2], _xResSm, _yResSm, _zResSm); + // do the MacCormack advection, with substepping if necessary + for(int substep = 0; substep < totalSubsteps; substep++) + { + FLUID_3D::advectFieldMacCormack(dtSubdiv, bigUx, bigUy, bigUz, + _densityBigOld, _densityBig, tempBig1, tempBig2, _resBig, NULL); - if (obsCheck > 0.95) - _bigUx[index] = _bigUy[index] = _bigUz[index] = 0.; - } // xyz + if (substep < totalSubsteps - 1) + SWAP_POINTERS(_densityBig, _densityBigOld); + } // substep - #if PARALLEL==1 - maxVelMagThreads[id] = maxVelMag1; - #else - maxVelMagThreads[0] = maxVelMag1; - #endif - } - } // omp + delete[] tempBig1; + delete[] tempBig2; + delete[] bigUx; + delete[] bigUy; + delete[] bigUz; + delete[] _energy; + delete[] highFreqEnergy; + + // wipe the density borders + FLUID_3D::setZeroBorder(_densityBig, _resBig); + + // reset texture coordinates now in preparation for next timestep + // Shouldn't do this before generating the noise because then the + // eigenvalues stored do not reflect the underlying texture coordinates + resetTextureCoordinates(eigMin, eigMax); - // compute maximum over threads - float maxVelMag = maxVelMagThreads[0]; - #if PARALLEL==1 - for (int i = 1; i < 8; i++) - if (maxVelMag < maxVelMagThreads[i]) - maxVelMag = maxVelMagThreads[i]; - #endif - - // prepare density for an advection - SWAP_POINTERS(_densityBig, _densityBigOld); - - // based on the maximum velocity present, see if we need to substep, - // but cap the maximum number of substeps to 5 - const int maxSubSteps = 25; - const int maxVel = 5; - maxVelMag = sqrt(maxVelMag) * dt; - int totalSubsteps = (int)(maxVelMag / (float)maxVel); - totalSubsteps = (totalSubsteps < 1) ? 1 : totalSubsteps; - // printf("totalSubsteps: %d\n", totalSubsteps); - totalSubsteps = (totalSubsteps > maxSubSteps) ? maxSubSteps : totalSubsteps; - const float dtSubdiv = dt / (float)totalSubsteps; - - // set boundaries of big velocity grid - FLUID_3D::setZeroX(_bigUx, _resBig); - FLUID_3D::setZeroY(_bigUy, _resBig); - FLUID_3D::setZeroZ(_bigUz, _resBig); - - // do the MacCormack advection, with substepping if necessary - for(int substep = 0; substep < totalSubsteps; substep++) - { - FLUID_3D::advectFieldMacCormack(dtSubdiv, _bigUx, _bigUy, _bigUz, - _densityBigOld, _densityBig, _tempBig1, _tempBig2, _resBig, NULL); - - if (substep < totalSubsteps - 1) - SWAP_POINTERS(_densityBig, _densityBigOld); - } // substep - - // wipe the density borders - FLUID_3D::setZeroBorder(_densityBig, _resBig); - - // reset texture coordinates now in preparation for next timestep - // Shouldn't do this before generating the noise because then the - // eigenvalues stored do not reflect the underlying texture coordinates - resetTextureCoordinates(); - - // output files - // string prefix = string("./amplified.preview/density_bigxy_"); - // FLUID_3D::writeImageSliceXY(_densityBig, _resBig, _resBig[2]/2, prefix, _totalStepsBig, 1.0f); - //string df3prefix = string("./df3/density_big_"); - //IMAGE::dumpDF3(_totalStepsBig, df3prefix, _densityBig, _resBig[0],_resBig[1],_resBig[2]); - // string pbrtPrefix = string("./pbrt/density_big_"); - // IMAGE::dumpPBRT(_totalStepsBig, pbrtPrefix, _densityBig, _resBig[0],_resBig[1],_resBig[2]); - - _totalStepsBig++; - - delete[] _bigUx; - delete[] _bigUy; - delete[] _bigUz; - - delete[] _tempBig1; - delete[] _tempBig2; + delete[] eigMin; + delete[] eigMax; + + // output files + // string prefix = string("./amplified.preview/density_bigxy_"); + // FLUID_3D::writeImageSliceXY(_densityBig, _resBig, _resBig[2]/2, prefix, _totalStepsBig, 1.0f); + //string df3prefix = string("./df3/density_big_"); + //IMAGE::dumpDF3(_totalStepsBig, df3prefix, _densityBig, _resBig[0],_resBig[1],_resBig[2]); + // string pbrtPrefix = string("./pbrt/density_big_"); + // IMAGE::dumpPBRT(_totalStepsBig, pbrtPrefix, _densityBig, _resBig[0],_resBig[1],_resBig[2]); + + _totalStepsBig++; } diff --git a/intern/smoke/intern/WTURBULENCE.h b/intern/smoke/intern/WTURBULENCE.h index c21e002ad48..0aa978e9e52 100644 --- a/intern/smoke/intern/WTURBULENCE.h +++ b/intern/smoke/intern/WTURBULENCE.h @@ -49,10 +49,10 @@ class WTURBULENCE void stepTurbulenceFull(float dt, float* xvel, float* yvel, float* zvel, unsigned char *obstacles); // texcoord functions - void advectTextureCoordinates (float dtOrg, float* xvel, float* yvel, float* zvel, float *_tempBig1, float *_tempBig2); - void resetTextureCoordinates(); + void advectTextureCoordinates(float dtOrg, float* xvel, float* yvel, float* zvel, float *tempBig1, float *tempBig2); + void resetTextureCoordinates(float *_eigMin, float *_eigMax); - void computeEnergy(float* xvel, float* yvel, float* zvel, unsigned char *obstacles); + void computeEnergy(float *energy, float* xvel, float* yvel, float* zvel, unsigned char *obstacles); // evaluate wavelet noise function Vec3 WVelocity(Vec3 p); @@ -63,8 +63,6 @@ class WTURBULENCE inline float* getArrayTcU() { return _tcU; } inline float* getArrayTcV() { return _tcV; } inline float* getArrayTcW() { return _tcW; } - inline float* getArrayEigMin() { return _eigMin; } - inline float* getArrayEigMax() { return _eigMax; } inline Vec3Int getResSm() { return _resSm; } // small resolution inline Vec3Int getResBig() { return _resBig; } @@ -81,15 +79,15 @@ class WTURBULENCE // noise settings float _cullingThreshold; - float _noiseStrength; - float _noiseSizeScale; - bool _uvwAdvection; - bool _uvwReset; - float _noiseTimeanimSpeed; - int _dumpInterval; - int _noiseControlType; + // float _noiseStrength; + // float _noiseSizeScale; + // bool _uvwAdvection; + // bool _uvwReset; + // float _noiseTimeanimSpeed; + // int _dumpInterval; + // nt _noiseControlType; // debug, scale density for projections output images - float _outputScale; + // float _outputScale; // noise resolution int _xResBig; @@ -117,24 +115,15 @@ class WTURBULENCE float* _tcW; float* _tcTemp; - float* _eigMin; // no save -dg - float* _eigMax; // no save -dg - - // wavelet decomposition of velocity energies - float* _energy; // no save -dg - // noise data float* _noiseTile; //float* _noiseTileExt; // step counter int _totalStepsBig; - - // highest frequency component of wavelet decomposition - float* _highFreqEnergy; // no save -dg - void computeEigenvalues(); - void decomposeEnergy(); + void computeEigenvalues(float *_eigMin, float *_eigMax); + void decomposeEnergy(float *energy, float *_highFreqEnergy); }; #endif // WTURBULENCE_H diff --git a/intern/smoke/intern/smoke_API.cpp b/intern/smoke/intern/smoke_API.cpp index 5a016b51bbe..67df6e805d8 100644 --- a/intern/smoke/intern/smoke_API.cpp +++ b/intern/smoke/intern/smoke_API.cpp @@ -81,8 +81,7 @@ extern "C" void smoke_step(FLUID_3D *fluid, size_t framenr) extern "C" void smoke_turbulence_step(WTURBULENCE *wt, FLUID_3D *fluid) { - if(wt) - wt->stepTurbulenceFull(fluid->_dt/fluid->_dx, fluid->_xVelocity, fluid->_yVelocity, fluid->_zVelocity, fluid->_obstacles); + wt->stepTurbulenceFull(fluid->_dt/fluid->_dx, fluid->_xVelocity, fluid->_yVelocity, fluid->_zVelocity, fluid->_obstacles); } extern "C" void smoke_initBlenderRNA(FLUID_3D *fluid, float *alpha, float *beta) @@ -137,7 +136,7 @@ extern "C" void smoke_dissolve(FLUID_3D *fluid, int speed, int log) } } -extern "C" void smoke_turbulence_dissolve(WTURBULENCE *wt, int speed, int log) +extern "C" void smoke_dissolve_wavelet(WTURBULENCE *wt, int speed, int log) { float *density = wt->getDensityBig(); Vec3Int r = wt->getResBig(); @@ -172,7 +171,7 @@ extern "C" void smoke_turbulence_dissolve(WTURBULENCE *wt, int speed, int log) } } -extern "C" void smoke_turbulence_initBlenderRNA(WTURBULENCE *wt, float *strength) +extern "C" void smoke_initWaveletBlenderRNA(WTURBULENCE *wt, float *strength) { wt->initBlenderRNA(strength); } @@ -241,13 +240,14 @@ extern "C" float *smoke_turbulence_get_density(WTURBULENCE *wt) return wt ? wt->getDensityBig() : NULL; } -extern "C" void smoke_turbulence_get_res(WTURBULENCE *wt, unsigned int *res) +extern "C" void smoke_turbulence_get_res(WTURBULENCE *wt, int *res) { if(wt) { - res[0] = wt->_resBig[0]; - res[1] = wt->_resBig[1]; - res[2] = wt->_resBig[2]; + Vec3Int r = wt->getResBig(); + res[0] = r[0]; + res[1] = r[1]; + res[2] = r[2]; } } diff --git a/intern/smoke/intern/tnt/tnt_math_utils.h b/intern/smoke/intern/tnt/tnt_math_utils.h index 6e14a1d9b90..f6aad8eaf38 100644 --- a/intern/smoke/intern/tnt/tnt_math_utils.h +++ b/intern/smoke/intern/tnt/tnt_math_utils.h @@ -4,7 +4,9 @@ /* needed for fabs, sqrt() below */ #include - +#ifdef _WIN32 +#define hypot _hypot +#endif namespace TNT { diff --git a/intern/string/SConscript b/intern/string/SConscript index 8973ac88a66..4aca220183c 100644 --- a/intern/string/SConscript +++ b/intern/string/SConscript @@ -4,4 +4,4 @@ Import ('env') sources = env.Glob('intern/*.cpp') incs = '.' -env.BlenderLib ('bf_string', sources, Split(incs), [], libtype=['intern'], priority = [50] ) +env.BlenderLib ('bf_string', sources, Split(incs), [], libtype=['intern','player'], priority = [50,10] ) diff --git a/intern/string/STR_String.h b/intern/string/STR_String.h index a5e7a0721ec..d8023a06f81 100644 --- a/intern/string/STR_String.h +++ b/intern/string/STR_String.h @@ -54,6 +54,10 @@ using namespace std; #include "MEM_guardedalloc.h" #endif +#ifdef _WIN32 +#define stricmp _stricmp +#endif + class STR_String; typedef unsigned long dword; diff --git a/po/Makefile b/po/Makefile index 425efbc08b3..b656a00fb38 100644 --- a/po/Makefile +++ b/po/Makefile @@ -50,9 +50,11 @@ LINGUAS_DEST= $(foreach LINGUA, $(LINGUAS),$(DIR)$(LINGUA)/LC_MESSAGES/blender.m $(DIR)%/LC_MESSAGES/blender.mo: %.po mkdir -p $(@D) msgfmt -o $@ $< +ifeq ($(BF_VERIFY_MO_FILES), true) @cmp $@ $(NANBLENDERHOME)/bin/.blender/locale/$(basename $<)/LC_MESSAGES/blender.mo \ || ( echo Mismatch between generated and commited $(basename $<).mo catalog && \ rm -f $@ && false ) +endif all debug:: $(LINGUAS_DEST) # Just trigger the deps diff --git a/projectfiles_vc9/blender/blender.vcproj b/projectfiles_vc9/blender/blender.vcproj index e7cd980b294..a1be7008bad 100644 --- a/projectfiles_vc9/blender/blender.vcproj +++ b/projectfiles_vc9/blender/blender.vcproj @@ -73,12 +73,12 @@ diff --git a/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj b/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj index eab9c5c41dd..b1a6dde776d 100644 --- a/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj +++ b/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj @@ -43,7 +43,7 @@ - - diff --git a/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj b/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj index 569d8e021db..05a73d50165 100644 --- a/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj +++ b/projectfiles_vc9/blender/blenlib/BLI_blenlib.vcproj @@ -570,10 +570,6 @@ RelativePath="..\..\..\source\blender\blenlib\intern\listbase.c" > - - @@ -610,10 +606,6 @@ RelativePath="..\..\..\source\blender\blenlib\intern\util.c" > - - @@ -743,14 +735,6 @@ RelativePath="..\..\..\source\blender\blenlib\BLI_winstuff.h" > - - - - diff --git a/projectfiles_vc9/blender/editors/ED_editors.vcproj b/projectfiles_vc9/blender/editors/ED_editors.vcproj index 8e82a18aa60..ac9dedfab7b 100644 --- a/projectfiles_vc9/blender/editors/ED_editors.vcproj +++ b/projectfiles_vc9/blender/editors/ED_editors.vcproj @@ -293,6 +293,10 @@ RelativePath="..\..\..\source\blender\editors\include\ED_sequencer.h" > + + @@ -1071,29 +1075,33 @@ Name="object" > - - - - + + + + + + @@ -1102,6 +1110,22 @@ RelativePath="..\..\..\source\blender\editors\object\object_ops.c" > + + + + + + + + @@ -1362,6 +1386,10 @@ RelativePath="..\..\..\source\blender\editors\gpencil\editaction_gpencil.c" > + + @@ -1370,6 +1398,14 @@ RelativePath="..\..\..\source\blender\editors\gpencil\gpencil_intern.h" > + + + + + + + + + + diff --git a/projectfiles_vc9/blender/gpu/BL_gpu.vcproj b/projectfiles_vc9/blender/gpu/BL_gpu.vcproj index eb404e27f24..1daf345f638 100644 --- a/projectfiles_vc9/blender/gpu/BL_gpu.vcproj +++ b/projectfiles_vc9/blender/gpu/BL_gpu.vcproj @@ -43,7 +43,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj b/projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj index 2a18b2c6c90..8dd1982deca 100644 --- a/projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj +++ b/projectfiles_vc9/blender/makesrna/RNA_makesrna.vcproj @@ -666,6 +666,10 @@ RelativePath="..\..\..\source\blender\makesrna\intern\rna_fluidsim.c" > + + @@ -798,6 +802,10 @@ RelativePath="..\..\..\source\blender\makesrna\intern\rna_space.c" > + + diff --git a/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj b/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj index 1d7c3f38581..84359390f41 100644 --- a/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj +++ b/projectfiles_vc9/blender/makesrna/RNA_rna.vcproj @@ -230,6 +230,10 @@ RelativePath="..\..\..\source\blender\makesrna\intern\rna_fluidsim_gen.c" > + + diff --git a/projectfiles_vc9/blender/nodes/nodes.vcproj b/projectfiles_vc9/blender/nodes/nodes.vcproj index 68bf0feac73..ca997306f04 100644 --- a/projectfiles_vc9/blender/nodes/nodes.vcproj +++ b/projectfiles_vc9/blender/nodes/nodes.vcproj @@ -348,6 +348,10 @@ RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_chromaMatte.c" > + + @@ -384,6 +388,10 @@ RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_displace.c" > + + @@ -420,6 +428,10 @@ RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_lensdist.c" > + + diff --git a/projectfiles_vc9/gameengine/videotexture/TEX_Video.vcproj b/projectfiles_vc9/gameengine/videotexture/TEX_Video.vcproj index e2731cf94e9..94e09303a1b 100644 --- a/projectfiles_vc9/gameengine/videotexture/TEX_Video.vcproj +++ b/projectfiles_vc9/gameengine/videotexture/TEX_Video.vcproj @@ -42,7 +42,7 @@ Xys#7Cjjl!^|*OQ2__Ld8-1K$SO#uhIEbRu+-uXYL1t*w~;Ld<|BND70DR z4XXUukb)0U12=1a1&-4#7hA*kwKHPdr6*Z6qsSd77%2+e8oWUm#Zu%?S3~-K^sa5N zOT0&;eFNd3)V!i{zoUVJE(1hFSg1RY+aNga33L>wLnWhwlQiN1dsiyW7%nIjuEQfi zKnW!X50dbWmHG-v$iW3=eWurfauFf(K`YC3NSzHbX9(PyfP%6v)BNBdqa-SPxZDJY z@|pDq8OTl;Djn60l7;j+Av_zUAA-;<8^rli&qe{NtcN;AaL}tE6by({<3kt|gy;vE z|D>VuhCpc(l>d6oUFRf8R3hq!!l#rZAW^bwzOQo-yAJ@BLP8c9sy(b ztQ!$?Ozp@v#6ZpF#p)}ue%l1)(m zcxljH~#SI_X_I`g4hZ#ROuiF=a;}%WMYMIuEc<& z@6qx50)md4T{phmn81%hO9-!oTA zlALxDv34Mlc0O6`M87rX3zee%(Itf=h4w0l)Xki!G+2r;e7KT~*_>lif{dp_!!A7W z4HkQsP6L+c8|-TflQq3)ji#mS|A41K zt(3s4@Io_6n^H%C>{!$dUNFK~t|>wIC&U$e8{Q)SBI$j#hUg?lt#o4%KXIsBKKid$ z9xu}42y!!ixqT-Vjp57N{#9a!Js&3~-N)JShX|Sb$7@dZ-fpQX0anyRtHCPjQjC&b z;!538gyzUItI;YiMBMkX9jJVWUQ(16d%KECa3PqHpv^-DeQTb63LN&S=s1u8n zzSB27z4}39$@L;aUxAfo8aM742aewd=^y;GxRKIa42|*dFRQ+2kK>NZjXP`7?64MR z@F)<|B=*n0a;!!cOk$;E`5Cs6wb8x7y+N`;b!>!|WhvqM(5-0ItA&POGSCwPkG}ErONW^G%GYBik|VjO&1&vA$X|-E6Y!wAhsj4yRfhLdK5b6^7ki(# z)3DQAbo80)nBUSRiZ z&bKV}JuMO~+hXCOh;Oz0u1gVkqo+(yVaz>XyjIzt+(`2qFX($@n)rR#4HJa z`=0j)ebw;XJ5T23&v#_a(W2jq^8}^26}k0lG*6Oj#F5uOyIy8`sG@E&7N(vAL@nbT zG5uyD`O2f*_`=%Q@mor2ihhYgiAIV1UMpYuL1EU{R@r8QoA+3feTodm4Dz;dBTurn zwdS;z3egG)R78c&%Gtj;!btL(WxU#*3lBeMx0wcIE4vgf`?PLfllpVqY2P_r7oN#u z=p)r&&>}5hj1Y6Va&StMJeu7xHvj)@dZ$$gZ=jUHWZphu#oqE}McRXI%8RB8Om^i^0{Sh;U_XgGg(I*m6&^u-Lp)3)7}|LXed zitC?OZq6btl-D`c`CHgp657`Hly@H{wkG;F`G33!(ppGiZeRPy3S-ldYrhg$@Y*|Ei2VgLSMTF^vi^snCpieyZB9+%`Y*E^M zMdn&2MP@m}_Jx{Y1)Cx-v)DIw2a$RHCY~noUUnOUp(*_={g+{w4czz>qFba4P)JG3}q;eZ&AinUdj;4CP??Bbm9^f zYJCy%DIwlf>Km0xVx8@-?Us$_V5xOj^?i?XbUg=oGIGCTO?>GS12(iesjq*u4H;*c zk*jU3^=#UQBL@UiO0rpo4~A+67UKCck8&OkaJz8VKGng(mGs!i^tW0|9R#aITzwYM z*72XPgzF-eiZn#kF*{AEl^p1$mIt)b`>Hs;H|-nZBVB+C>^#tPA@`hK0qozi6LoUu*LnjxW_( z%v?H;9g_I9ob&8YEf}?2+==zKE$G1Ms7%>RS>L?8sksm@kNmcCnR4S~Ql{$UdeDb3 zj&O%egH<=vI5|Z&E~>2=H_fsqkJU%fcAs_R#fHg;sq-Odb&fAH@^xe*5{I z;E6=r78pTwob4TfWe?_~>!2@3uece~rUEtDR8HAl#X@gaFL_(PH}?zEQ{9_`POn8TvZI0(Y_*Mdl!1&7c2`wr zTE7Z!5}zj~J|H4|KDo8xW?KMwlhR5-Qw4&2=^!X51cI&}!0#OhddmqxyXFui^cjK( zT|Sxh$U*RJBrjzowY}%}v%I|VdMJ8V=9c!ncBn+-Ly1vDJ)~TyRb-pc2qfO;P!5Mv z2AjYoms3+xE9fLKx4t|Qea|z#cUFCJL(_PI`)QGml3?pZPXF2WIqT#8;7^;% z|Gt&;bEoD19ECHa=YJ0Pzx($FB6QIcTmN^vcO}ZElihUb+$dUDzOK*0TOpI(G;Uj= z8rD~wMC>^mC~JRhe;6Z5F!?oEaT3MlcYacYY1~{KRnSCHzvd$;)h$_{c*V6=T$qi^ zd}F1O&NDaaYAj>jW>qtHm?`R4=kK$CfPjFF@PRsXmgSgB94=^`lr5hrGBR?Qd7L&> zMsSJraIE^_pxma__e>Qf7)ST|#`@0X!3eL%XnQorWiV=|JMU#8{f$p{g~yeM`<8O! zW{pL6c%fh{I@2C$>e~^xzkC@7yK^YY4R2kNi~6cVoN3B=TxrUN13_Wm9cK<5c8(eygtT?hfAA-? zK|zHsHiFI=d+X@}=g)nGE9}f*xTJkg3GoFc9eA6(j$lTlVeL>8fP(z$mj_s#f%1|%>O`Oc^JZUE;T0E(CKIuWFM3*9+BHMA_wQV(yxGIvZZzCy&!|wO8aK1n z1xod+;OkvhJojeLd_|W7AN+Bo6pcAH?+$inQK^j8)qnZ9y1LTnR+t`0qjaX41)vsd zM=iJdb&rl>3w!Pdfis^h)-qUoTz=u5Lhf5bR_EZt^-# zd(Q{1tgKLggJY8Lg+@dmW08xXWDIYehhT$hce{tF%VgE@{G*(4quZ16YnY}YODWxE zz!Ygh$y?q#(!B`U4IyXa1;goJZ zg{R3^{~JsriC3Wgqti}Bp6I(;M$Dz$k`1B5oR>NnVb;VfH!J5~ahp3WMc&<}^LWXW z>qhu3KC6WfVjHHWy!e&7_VBe?M~vo1WbK3T-M9#Diwu0Ea(Lk=0|KK1!TutruNgas z(F@BTA1+q{A53;s4F|dOJx@*!>Q^kMzUkl~!r9c!m3a_<>~;I7r9-U` zlKEw$e*(!Vv5`(qQf12WdHoxnh$Y_}aS`D{kT8SC>=3EG$h70>*(Cp)(O9NLltRJF zCXX+kTJ>3GW81b%q)e2gPL*V2k2wFS11>fpGxHr@P`>qGilW!}*6Yel%=ntd-#+97 z(LHP@mOR8%$@g>5R!6dg@rhXp`;<|ssHtRPqN3d1@iQ`_EH5wP$UefLH!Bmv5?EOd*0Z!}vx`2E(C{XjYjx=Io*~ugAaE6jR z<87vEYjA0D2+JSaykNue+UyaOiBjtQbpR#vKNO-V?`P?ujjv`<}?0I)-!#t zS^T5L=fu3$@ZVYlMKucO7M<392XmfJR+EA!JK#s%TV1(MAw$fRn+-bY&X z)cT$w$;rt&d5vxi!JC}=TyT5cZW7kGDD+CGAwB50wAZr1i3(J+rOx)6ibwXi?+zQc zB~V;rE*%yds!l$JFS(L)G5OUA3w;;nN55aJCcq;n{yFL3G3z_~)ageHjGeb4;0}Le zGy@&XT?VxkPnq)h>9V(zU(StPw@0!HpoY#6WIulA#o02)@#X$D5%k(`wa^@h)~Yt7YR^HJ`Y9jDvIPsNMQYVl!r zO)TLJzmCCB+{b(V7Z>%=A-MA;Elz29fn_Mp#^$CZ4r0sQ`9ds%r>%RBP~F4b2UVLd zGTKw!-5O$9GtIk+3Mg>3hLj0|R7~U_9OI1BCbL;~r%JXz7#C|Z-~7=?O(*S3W}INr zEoHPQ2a{!y?L@N}Z!m?eNFo1L`1QHcSdV|@NyomFW4Y!@QzqiEi(g3Ktn$XA(sTHdxu}KU<2n(2 z;`>{U%{dU>lTZJs14Ah zYsiLe*Ng7X{k!?&JQnskBt_`>Nc5u12&TEVSJ6HV7hh&nKLQ)9PR%$T($PsrIY=g| z1r-(9zF4v)-}G%Kk>H%j@LfR;Z?OqDv85Hs>X#iBA!uY6gj5SJDCozwQaY(aI~-~) zSK9pPgsKr_RU*!J*jWkChitgTZvRT_3OyioQBVZgYI#6GW?AWF3oat7j5+_@=_T{0 zI|^kpjndD|(t@umlqDYK=zD$tFiLP=qy5^aF<&46`9$_dLwO}{{&U^SY^I_@9bWFKwzZx(gaVbt*_p`dVyGxh;9p4GHP zA2}!k0QGNjABkIpcQ$;;SNt!QM9Jm{x%8}6ZZvd-%5?WcksJYpxQHQV_6O+ZYB<>gNjIQ0wFat?Kt2|;o7Isi+c)`>6UL>LW* z6q2XPfjJi4^V`iArPcJPAuVa9v$e9a zvdbqxaRmA{!SZH!24iqGn$2fL0prfh()W2c2P&+p%zw^>wcDuNt z@s~4vi{-imExZf_daKSA?YWp<(zwg@#Ze%B&{Js2j>j!hh8q4Sl7zdPTg#`!MA?u| z^(7sli-Uy-5`O1gpOdXvJ-)e&rG5I|IrB!6PG(2dvSS-}FT(8Ywav}V&p))8lcivq zaM0Fh&e2bI(4j6zNmvPyA~`Cqe(7lC4cjO=%vD=k2XYMeV7{;iS3MqOdTiV)l$s7E zd7|#$yXt#Y_qY213o)PEYyw)4XzoBFW2i!uWH_UajMd>X;o*J0cR2 z4FGpPD`cYy0!D7W+l^5-OwK45nfu~ODU8>Qim|-a=v8{i+4!ADz0(zjK3@HO;O0vb zePcpdz2Dhxk6>VZOSMa_A-6sg;5c!mom@m1ktWTaY&A2bs)fy3V_qD_4LCQs*py66 z#Ru(@Clvyoz2Xm~CJk@$HbbUcKtWju455dNTfD0QS3E(?fzfFX?;ba}R8?2O z2wd9N8ZM=6UwQVdh<}-K2vk#1F_CAg)!hur&(9aZMCzuL`pF69CIwWeGX}K0-O~-g z|EOM;o11$?hl`r?`Sa{^sH?j>kUvei?)3E3B59l?d2;=W<_-GEuEbbV^PT1R z(K2yHN`O5Mg!qL2Hep-P-tJE^4fBJ={oB1M(v$8PGX)yz?yBv-#q{eB7jiMwm4}5x zuS7+5CyU*K*BdGahUoNek;1-26LR#X6!xFI`&`o4q*(Dx_TO|EI^jSjSHAO7le~9! zoJYNwo2spk)|<&PqYK2*6N_>lrT^>(7}i2l$&MvfD>H0@Y&dEh6#@+QlVk1t5ihZd zRhh1El%|l?(Q@m1(!M+ZSh+2&tk&_-dZb!S0}TttFqWFVDiTayVD$PEvw|^D%@V@T z)h*F@t!q6+YZavuQ3-7BZycQ!t2^S>E@M?jE7=>$jF zyFDJ{=q6;<|EsF6Kil!;%a@bG^pw@r)p97?akg?T5p>s-I>#9-z6?yi^ZiHwwU-I0 zsHjMwQqY8!RG9FWCY^|%KfhXkkAO`53>Wt`0uqKkDincD;mjIEZ9h}KR1q34nKV9; z{PW~~y)TYJzZUGPrnmQw1Y*T?pmPLggsdbp9$Dd!F#*$gu>v7`uk8i@t zsvg&yw*&v3*X5Bd;xnG0>cztZvzsZ;8lI|JSkYhGZ8%7Gn*W}cJm$fjg)au#gTb8v z^FYSjoDvk*_5#TeB(7w|u$6!t%(b<(dvbE}g-6o+?s}(i%Ik2k5vk+Zev}30;flFr znXc8rd~NJZ_pDi>#`MZmiJsRUa!7EnB@H$8Irxy5&v9^8^!4?w}qpQ2vnLq|Rrz|(Ub^Hk? zNjRXL$Ifrw{Jor9W!Am8R()ogw9^ZrkO5%kupWbl#1$XV4?S@kWa344_TDmw8D>K`2)P2+V; zv0rZSnb@7FSULNdK%>TIKmJ4W_3|OFeyG5B;^)lw{t>csF*6Ji{yYrF=M;p`WF>bZ z%WgO**-CKQ$s0dViepnJD_OR5TMBK_nJt<<>FzIrXHG@~=hV85uVvjD0I;&RpP$|( zA3R`fXiq#37Y%-&X5($xp*>1Iq#cjNX1h;RmkdYsZp8k&7jb1nh~Dmlq$Cn5P4ClQ`tmCU1av_Minv6IIAFqD{vtEu()pj0J)wkGXYEGV)^U4v}WiO}EO zv4TF@g0b0sa3cHw6X_vHFb82ke~*tf1Mjc4-}_&mHqOJ8Qf)+iPd_ImB)q8i7G^7B ziV}E+xA?d3PQDj=-tQ-E)@{4jp*D8hPhoeq1>qydozShA{*9D!;h+sjFj7ME1e4bh~@Aa5}i2^GhNE3h%*#{_cSf`~_$1WwOoYYmDUT7IkWUG1& zC7Vnvd7uRc)j2Kv27(}dI$P|z@pQjo*?A+FHb+Flo~7_mb#*l`H^vphT@agHPPgapZ062dHv-%1Y zyW$t1>XJB4m-=irZf6_STlPdrLD%EKQza2OTRy7a*#5TG1}q&%F4V=Kt0^m&A8ebc zuuN$y8C=}eGeDm;xsF{Aw@eghMcC=UlB_7C<1Zh!cj4EMX~%O26g&lrB1?=p85nmU zr~#S^Xi1s+q%+F?7?mD<@6_Pv0e$y9{Q3Bxo|%6b_^$oog6D|qHEy7L?I0sVDauy% zLx|sW918&SNSR=;M)K5h#4fM4b69R!`RXRKJir_v07yGwi$$+Iskqrrqi0Fj%F0Uq zsniz033|&w9p7JRrvUop(=uI0dgwclvgZNv>hDiv$Q!eZPe`bu=Hv6^+q)bw7YRa1 zX&rxSUB0gtRj!;OSFp2GqQ?=@_<{%n%gUNx@BE>{v^5H-`^8|>L6jf0v#y!jg7l(}OZWaJ3OE4AFtOA2??r)AHnPh7n zrhwoUpOO*|)HyQU5`5y1NPv$>$%8B4p!FC_Vz$bLjUg| z`~&Jn9drpS3l{ZLct?3+W%_4ezUNIju=)7->}Y*et|~XE3Fo*UfmLG={2H9heQzko z^sx1bPKig}_z-ZqJ2mK9rUcXM3plg`tJbvDcj?*KT(g%;+8Djw+YdF*nVq5r zxJ*g=I(1lTM1A#A`rTrGr*b)!lhXs`yf=;l8w@>|^Pp7lIL+e$6&bX(N7Zy3rqq~F zS3LxyL=o^kWlZOF+)~h*_^L9NFN+Q&wuS})1zKECUAkdkTcw-j3Od2!>pT%bp)z1l z%f>(q0;|(z_smy3q%#PV<$V8}^QpFn`9HxC;SizabjD=;=;{D?O&sf1QC<})*U^HU@ zWYF82t9jHxPklv!USL@7{1IqYUkVG?XUqbJ0fUZx06qFgv)9pbxkM9KB_;q;R66aOsRaa~?te}l`t6#nEkBF~$wSbKkdU_?HWpycA> zfl~u{n<;uBN5^fr6C}-Sc3UU308D#3UaZxw)T_tn-rs?JO`C zME5{Pt8-r3O?h6OQGA^KQ!$O|x2ks5whyaO9Y#K*iz@UR_;10t~~lx~4Q+T)Z<_^+lmuX2$P7$#=Kvk~nr_?An^y*@k7=t!|qGxc-Ox zV`JaH^LYFE{ywN*{?v9ek3Q_JvidZZhBM8c9baXk);9Xh#_iIhDYJw;5kcf!rfv~Qk77n8P#y8-Wf;DM3@f8zM z@{LS6(EATW%HZG1gRRERp2G=Sd`|O8AB<6hS5qu#LR%I9?hv%Fuz<7bi=`78rQze7 z4(yG2?t>dCBj|IyQC;qc8q^D*kzNf;L}x=Bimo+Aig0p)B1|YXEp1MYJvEh6&-yuA z_I5&cHdeCY+e1n6$`bl6OYW0&EwS(30QS#-uFK~DR+50{J`t$C;f?Ow%ZdsLM2bvz z-B~MT1~oPapbrAK5upPP8f`ruVEF;0y|u0|AxOBjrG@YIbV5x9w0qhG0G&F)@;q;{ zFMplSxNKFLc`^w`I144EXK--uT|mJ7gm0^u8GEYV#`ZQz*2iQMGaSTzprL3&GN86* zMQCYRM#9sh0O8|+IY|uJ-rl~!?}8nuhM+{KdRwm59A%OXv-d|}_qk36lr6~LCG)zy zxj8?GeGrW824!G3#eM;FvM{nSrMC)R&(Z3S+TW~o<+n$Keo(OxNLckDeoVt|fvcb! zuJAZc@5_OPFrkby-t6fV z8XgYHr#YY=x?aQhR5HXQB!dVNs;XGfE4U)Su*ot-d~gK?1vB70{4SQfGU^GI^V9^uq=VJFU{TEJu&Nqo0IdGUYTwpSQOF1NF|`+_8l!YhJa3I zJCr3{uL_8js;O!A)ZDA*7)T>4D`ss##-f9Gz}ocoK~gH23NO)S?t1`wGAO@2ptvM} zo*WzuFC!}}SvWCep1Qsg;m)0Qa(3_zp<<}^uyn4%Ok942%}-{it<naqSQEqs*890Z+REUP4pz6CFQ)z050h znC2K90urK@B0vH63dP!r8Y7uH5C%{^+Wu^A)^3GhixJI(YL5<#)|g3$+8y6kQx{Gm z#?cc^P}X}ul)xDfhA$a~h1=<%aGD{i+k8PMKQx!Cj; zojG|ItC{qHJd=hUM#Bc1X>=^l9R39k!kmdPXrf}v&0{}K%c@_wnvF7@DJVNi>(Y9b zGWaK%8w`sV;U%@5lqV`T0`w!hO;NR<9tGZJG}~Wo+kKl}#Oq_SyAUAG0F1oz_kZzv zmh%x)j7{nrEdBWLVY&_Af6*J_-T1K1R5sfETlZS32t8 zH(FGxrOXF_@_zy`sXH9wc|Je!$0CCo`VBWhFem_yfo=+-4U$Yf;g}?+LRrrGKpy}S zd}usBh2Q=QX)prc^eV8hvE%$qN!E6DP(fQVZhQ9#KxUpvEte|Puol?!>v|S!I=s?k zQmGYX+!Uxvh4GNTHa74?90 zW1o&Bl>Yhi$J-C~=Urlr3rDPRqb~+O1~Ct#N#Vpd;!n(CdaVs(1w$U7!DXc0-*7ExsvjW^YTs|q;eCIe02q= z^6$ggDy#k4~rX~g^|NW`UH&udX<% zOYJiUHVZ<*rPI|$ckGyjR=v&`!!Ij&kWn?U%KrOAUqqTNp zzb_we228-s`pw(@(0I6y#Jux=f%{o(Woa4um_VSSf&+24`hb&R{xILxHVPO|gh^~5 z_Bp+ji^~x%w%U2#O|pF#i&D*L$n((?eETL3UXT`f;V_p~j*8#vH<_*4{MFyJ+gL*{ zy{BTQIEH?4?7KcImI*%(%UJkIHgvR$LX_ifR_B|wr!gFdWN)OCAmxeaF$y7t118)EINkO)Mw?*_) ze)m9yHj;$=4J)WrwLm65XcQUsnsTVkbEp*>bErL>-tlnJRIHhWU0ytzVju&>m~^(P zJ%-tmkIW3F3mze11hXBzUi{<&kWJPWr>d>0^v78gZ8P|s2K?|3iiwG-FztUcs*JJ< z3JUYtqJHq8B!WaDPzUoSc1V$;w|&$V!4!alKxzg^43Av_vg3KoQT-emlJWKy03pw{g9A*MCMtyG{sbcJqoSur0_7Q*>eXx@ubMuC*MINg zMM%#pE-F4gf`9-1J<>*Sm%^{l_Gq}dpMmqE^AroX6#yPo7#5k(Z6S9U?^9rzf_D~i z0c~hhyF}M%?88%{920;Qw;1d+|q5D4*VUwin4O9aN?b*pNiu3H6pX<+ex{`86K7!)HQ+7HdO0A&7GBo4qSAaq6? z0+Q_y%I#88Qj+U~wfmDw)x-bJMRHC6Xj?JNCG70%O3(?}TOLPiq|NW*FjAfl`+sxD z|5D>Y9t=ZbMgHIHoXG!w8k_&0kn%qT$;U+#q}ep+l)xOL{suPse>2a+57}Q?4hAmc z0(p`&Q_-Wg2fyvZ=Njp>_5II2Cu@$nuyPKin#;AU+@j>rnuiB9rS103Sql8&hk5FT zH>t78)S(|BnQO>~o-TA&tpj1q>h?+AaK5|D{ps4i$P1!}wY|IdQ)jAgk&iqQYvC%N zO1%+(+i&Koc3ntuQ&4*4B45N<061(N4JBo+JIIdcw~&MBuquERO!;SheO;90CIpZ# zv%VicL{gKJ>D)*o{{DS~Bh_&N@;Ngr4X)iMM&bZQs9&Nxl`A*}j zn;Y@xL_~kGva(d*C|OxCL`Dhmi6tumL30ml_65wNFIf>*Pl*E3wZW7UB~x3bO&-P8 z|IVcqVdHVzK7Mn-o#sEAy#HAWd+yzMRR`Spw%PtUsYU$eGUPg`g!eK#nQ_!v?fyDk zc!dIxn**0Nq;Ck7nu=QA{#uvEMAfBY5*goCyho@;c~iz-xkjDKF;z+_wvSv46#LN% zkedG4)g?vN=Sms+3rMdwVsv7%8p=(8YL!N3lz#C&+sy%$(GwU8z>2uBK)%5Jh~ zOf(&Yt9O81QiaWu6*yDH|9ZAkdH6WCl~rZi16K;?*)#W*om&Qnds|Ebh@Fzs+#NK2 zVW+w3u;zDHT!ds~m_TvXU~M|j;C1}^Z9neGlPCT&AR$F%RQGy~&t-WCbXWLLoY~iW z;N@{Juj7-G943bo8p)MbS}^5Mh7I9HZhRWETePh;6faC7Xet2RLYt7?xPigNup%Y6scJp${1BS_qtM_^-&6iZK-J$Yi9!qu^b-JSnDeluN z!yn&B^v&`7N*n^z^}O7#b&`$i%fPJITjDhcENG0vKt;W3xIAJ?8o#`m`VJSu1T%#I za@|e_BmDjC-t=dn)p#a6$Dl|H8pQW+_vSOFnYB`5 zJNguKMqM&tPvxmf3+cZiE)^W=LVte&^A)WII|v6Cm+J^vP$Z8NW-6IQPa8~V# z#*Fi~Kt}eT-MLkYYt^eTl_q2}{37IanEB1~U>+u+d9kX>NoM0?nEd zgka&|;M7Z|)R~iY1U)aWuGT%$2?|cFw=9&DgBK_|i_)c}1OA*eaZ+!Gt8{&c1_XISi3+F>V643T~ zn;QarLCJdUeYKei12~Z$I3}RR;2`?>lu9y{QAJr60!`<-2Z+QnC_cfOO=UyXFV8-r z$5*V|t@EuE&gs>pg5o$^DsR+t1-KfoerYjs`{VuC#OrVpH?ewHMS-y)xp zn3|db=Ti#!`2RK%)qMG#<~`gP3S5Uwa~B=8RvRkK0^1499|HdbZH;GVIl%BmKO`?_ zNPQpsVuI|_(9)ue8EQK$EAY+wcQ*F1C0(jARypTR5oUhP^J&jW@fW!U``w%^!1Qbfsy(z-=KgD z!R+1qVEh}>UZ)ix;>4j%7-Vk&rwWLirdw6dq?k)@GUHl7>q7vubwl7BpqDNX*avBc z_`yx^1O#2m@o|Si4VcadsjLRS;UJJGl>m=dtgf#kfaA%V>YkI{CGtKbA`LF{GlR1C zYgGJUNN@$(bZcDiitm55Dp1aqOaPvf@o@$PF_t4uQ3uVfu|+c-cG~>*aPcYv%tHgJ zWW~IhJ=e9aCqOlqq)*HP`p!GR0S|!nEHWqnr92@B$JVi~|pDCN_3zSq3f8 z_7JM^wNalcr8pmk(7{>S+{qMhj z@8jaI@z7+G2fM^ktF#YWgtx8mWuo#`$*C#f@$jhe6H?wGpf_SPc-ZX^mQad8f-w_AW7N4KaZ_0ak@z3V=t)!~81>0Md$} zchps@P@ZW{-R2&4I8Q_kZSq8AI=ZL7Y2Hl*7}y*Q@JS%Si;u z6wKqeIdeOx-Zuvq!1RV1;^X7DK@N8J57yfHx|YonZGr-+(vzy7n&J- zd>VjM!w)!K;IWtbSbyNiV5xwo0{W^JCN_;{7AVY_$3Y!`Ui*5EE8=TKg$pVs@aaH_ zUDlFctgx{j^|K!i4MhYB?2HD(T!Hs_xg0tH>zhIIheGhEfdT+A-dD%gha3HgU|3O5 zP$Z%W*r3PMWWWU7+3u9mx&YRB278|?c+e#F{1pRDx3#TpG)NC`=!%XZ(4+DA-}s;I zParQyTd%@>Z^;BJkRAkMjrJKj%MTX$OTG(Ihk6%H?YaPe>Kmx%po4>OKR~(&eXfsg z?ee=56#xq00DaTs1L`-4lmcMp?-SGJb#&KG|Nae9gt-y1-n<~JFHUv-^s)`~kCS7b zgM?6^X$o9t&JC;YsDVdjPPRu=t*;Nq@W8PbK%%EdvS7>{K-1U*P+G(KUj?_fivw1( zp~+1{6Y}-Tmv{hHK*Y8KtXk&es7H&Tf(0*%vtW!7$Y21mvlVF+gx`_cyDT=W>1ET8 zo`C4oB?tj)NEJu}D37zDlUd zm)uFDF|^D@pYN)>Wl8F2Xm}S5Rd^0%S+|>K(Cg(4`%KWhf+;&JtIYSN%NktQkwEW& z1KHP~ePF_yPZnvQprN^?9+Z zTT1KVL>HB#8ce;)nF3X9?kA^}7Tv(q2)ll4bwrSvuI>af$`gp?FG&C9e#{BQ;` zPC(8>)$+-4}4NBoq?WtAxg`7>7>`>s_ z_=TN!d47bUEU$<-ZxCeU<*n{k16ENuJx4VZV49_Wmf*M=F|00b*O;@gh5_Y~z>}4c zk&!5z=maS%U;==m2Ii{_Xy1?B6Nq%Zn^lAa1jNA1ExZC5fVI87XaLhe8<#ila{lg} zEw8PO2P8xF8k=D>-de-5HLy6+0d6A)jR6H6-CbsO|EnF4GwFEJdF*4z_KWr0&_GNU|>ZUH2~#4EI_Wj+)Opw0=%;kRIJm(B_nV+ z;Lig=zL=8&1Yu(-#AC6=E+H_5x3_T6pttR4zb<}mx56x?mNa}qUa|DilZ1E;K~b_NpD|~wsAo@$;UsXo zm^$?Ikt4_b=jk7(kxan`j~z{HDFrDXm3-?p%uptPLlB^&W-o?K_?HkT;vaj2>jU5e zL+Y)*Z$C&Nz`yH5a4fTyeZmAJ$}m%x(qH;>4_^4jbu(uoqXpoB*FPY&0A>srC(>a- zYuOjZJWE;-H5DRQP(UU?2AhC!)BXMD|3lbY09Dz3d&3)~Ll6O_1*KD@Q;?FBMx>>s zyDDQS={X%vu7X#}JsBt^QV`(69|=e+NkIp56ZIL{ytvG;vn_jRrHt7Xa!UAxRy zoylRZphv07BN2)_!T2j*r{ygI)Pl%a1hcZU;bcLPM7+7K5YsG(jp{KY$*ZU|*VQHe zv$%MRhK3+w@h4DMvZG6Yg?Iq*2XM@ckXytek~4H!8%F0&!efamlp4tpRl&u5#gFLGs+Tb(;lrSjIamz@OcVxt#3! z4csu)j&M*put6!gM7j$7={vPhY%=K?JU`rMI+T`0ve8>JUnXr%Ksz>XV+0qC#fIZ! zk7=rIrDZEwc&GP|F-#ht*PvWPYMNnjf(C1Ky0*f!^(}fT%gb_&!mO(c@JRxS5eU@_ zfL8Mx8@N!n0boujsmGU~D*w=^1tFX19HAS>_X6rCx1yvEYN5c!fT;Bev>I^sAX(!r zsJEaugxA^L^H-$N2ahC%{IcVC}^`&1gQ&xu19lQg1xU|`^k;DlADUuzW)gP3%cawy{|g}43cv7V!me=dm!r?2R>B{;MkvQE)G{BU=`Aby^uXsc|2atnnlIl``Q**0B;w#sn6okCDZJuAYZV7eOE`wbW+6r>H6&{1>m1FBbS z&`1tvw0{VpQ*GA3rP~yO`<)cG?M9?H>EY7)u$eAJ*izN~*98*UGAdMJJ`;TgWl-O~ zQS04s5h?=}h?u5U1uF?iyiglwgBu!96Mw}25mFE6H)p>hHfArCrAOTvDo{FXqsx|d zI;Lv8ZJ?~Lf=!EshZg{){w*^nMlVeaK5zZil@(0z5?6Tp%bexDiz31qGJj*q``w)P z-HL}^ZPMFSqlB05Dc3enk8CRKX2>@%k8jYn^m#`h#gykL`m_m8_x=oIZ|7CCe@Pc` zM7_hpDW$XvJ5eOagrgJ*cyogm7*cb{>HueflM8Jg1?-0{*mh z)vx2-U8Y-&z=$M@`3eDbvcRPcogT6`v9V!OWKh2h9cBRy2hbCLHdXKCsyz+5N!9zJ zL`ybp;*R$mk2b@1YTKzVFWtLaOndHv?^)CwM` z6~r<@IaLpy&soQ&)bqc!b!?n&ueK&6r%a-F|n3^ul2R^hHl*B{?Ry@g-zGg+-d$fhosp6qzFndE2T(|c^ zO+qZ?NX`rdWrHZsfy;xP^-t$Q`a`Q9_gc&`s#Z}dZgSm`CfK0S3JuF+1W$-0CL*`6S0tUMDh7jW?Qco#2rxRXG*Qqg|-cY-ho)! zrbz4Ha<(Iyb>$ki%P^#zcZd~ChQ^t zX=}QiSUL`lfm@CLc6VCNgyC9UwaSuZF0{G{QMcgC+AB z)AlQeHh=0AtQgpJ3?kdwvdARuK5Aiqwq7Z1S$?k!X+Y*=j< zJA@}Gch0PyN9nuMcq|FB1-J>|rls-$rjHqxrD!fsHc=@)X&4Dc>MhSx^h7}m=~_)R zglWEE>(9*ZrUd&us`4=?B0DbnC8$OOT`TJHvKlffs4iZh9N>Uj*QGc`z>zM3T69Vp zAYXLc@&wqpmqFF-zPS(k_{;BShu$_Vv;Wp_df$d(oH}i`RW4#~g_~V%7QqtAL305( z7PG#%X4b_|K#?Y2+yRT@P)sl!s?_96`dKY>*0UgvEpkM9_36YPN z8NPQGe<5G+JFf(anuyl{pv{JEdnjLprt8KPn0UC%dWk=f^Wq?*FDeXetoi|nl%3D0 z#CEg$R`NrTMPWqMugGIIm3Pj2r;)qg%Z%rG1f$RIP3-tK=py!dS<8%Ihul3rcAs?b z+}2|?foJcy_;-V61&Gr6pkDZrD(o&}U_cH1RHjzZ(ENysLR45* zK#hYI$Dq`vz2*D&8&L8`@VV9xIdSWZQawV-mbqnDHF62!8~=b@-!kM%d!V0EHj>&^ zsyy_Vv2;LvPo1i21GJ)`@stF7??c>-UhPW`eWeHFw{EGL(5Zz;shQ9X`+MKcG_Zec z{N_r6&x$0e;tvWV*iRo9X_ah0)IR$Bk_1ndh&E>gFy~0$qe%-fC{a#8M6nM_B4Jn& zEV<|{CVWpUxFlcb#A5PuUi=-7y-X>X`#iL3-+XzLb_mQWJIDvbC|3ryY_ZuqeWxm? zK)ge6@8OADQzRE}4}eH6uLejWQl zo3La+ir1dR(vLewf3~&OhGdz2)}X+paEY6V*ePF38>gGtNmhtNp8kQ;^W4ZwD8>LF z0yO-1+MdPxVxV&g)?!yIvwFEn2hJy9_nSz<43My>w6q8Sje)wWOI2R+bG*Z8&<+B- z(32C72Mi2arwzid;`wwa+)_K$XHqnu0wqi)8zf<2rj^Oyy!qO`DdXJfO{F z2)na*(H^pz7=?H@i5DpO28xmtSD~3Ec`efRNuz=>YbZMe@np>OJUvx{2d=dl=uCH< z%?&sCwIs0)yc)AB%+0dsK=JRmFe%LB^0S<_azrh~)4AIc@;G^YPuHUKc0MY`qysPk8ZVS47u8UAx$~NOpHA8DryiaU>UMH4@a6<=RJLd-MO>I z$Sg_MP+m^Cc8gp{G~DO1-*eNG?=IC4dS9#;3Ei=cXC4i)6MB%%1QK4NdWrdjB_{K? z_MG7p}$eg^^J&7$Vq5h>tXvb|`RO~i_P_4g64WsY*es-i-U00=eC_9y;Aj4zBG6T_E z=X2&RM^NqD1DX6n*mY1s!X2RFmbEHUr09mKZ6?*MIA6Ohg8b_ggz6um3QM3Ea~i_j zsJL}sMkGBp_U~<=WJX6dx=p`kg=INgw9nL`JFBMC={0(hK$$%T_{ktkiYhn&03(jb zlki6C>R}r$)G*CW=#`?}Odf#E<|Wl5b4BcmCAT+(Xs^J`i|#E1vN5C|1y&(cb?~!^ zqJ`b@;)_D0&?R2?m`c9CN%i=@!d;%{cK3-77(JKH8aknUki$`ke)nD|!S)s>AUOca zv)}siHBzIJfA0=2>+?bptD?)gru5S}DID36c&%3_lB)AaRIhH6Z z#8LX9?Y2_+-lSVXLYXPCCX^-;l*cNKHsNTO3E-V@>ayegFXzHDPb?cgn z<Pz7Ci z&Cb3Zqu=;B;&r-PTH)8_6#J$SI4$FY^+Z`zSrafe;7Kt1cHGh4p5wYRD~hy;!JWvh zr3-MW7>omiJCGX+kzy-ovg;oR2-LK%N>u6U|1n`#sHpkJc`u*=ga`FINIFClPL8Pb zbOL#1tzw-w@N`LJKAVT1zB*o(uAD#8_*Vo|>v^&n8Ck?4m||m%OIbwRERY`VMBGBU zc(&)LvB_$gY)bOXVC{&(%=298jUyTOegFRbW}nS3T>&68B+BdcWX_gk$y~FhQ%zd| z-XZvS)|&v<3jiT?jQ{?uQ)=$5U2=})P>Kp(S0rsE_%y20C7{S2T?brzs;9qSzAXM; zsxR3!aBbACdf1AGd~ZmW#uzrZ;~#I-2Rxh0Ub=Ug#^o}H(y12sW;}bJA@PAgihp^X z`1)$UR6$Yk00$amU}>iL#<+dxLTHm=abBvGVg*QVdZ#5B$tG;{&HDc$V;;)Bxh%+QvBYG$Uoe( zgPY$oU#@%+Rt@BO&LZhTM)-(haqLY$m%ZhF(eD%+c+`VTtKn)q{~=_Kk?fe#Ptr} zH!f%KVp$Nld3ALa(YBzsTlg=hZ(jszfb7LeUzFESN+6H^?GGPL!U?$>K>s!OBbirW zToXAha-OZtejZ<2N#McsikWrGEOjxI zfrtbR1xTO{uo=Pz0EF>DdQHtuDwXH6e0=Q|-7U)DSOSSZj&D9*tZ<@QUJp?jH(7l3 zZswsdKVW3r=ddoYMFtn)1m%1k0fRb29MXqg2xIE_u#s<(Tizwe8A<)44F zua?JpxX|5{9+mLo=%-7PR7)Z6i(=G4`m6qYyQgsCnr}{3DPR#0lzo-+HrfDmf!Z4| zF`td`vdC}>e$>~+9uj*$wwr4$KDGnPc`;C-&^*Jk7)*v-w+(9MjXY`vXhq{Te7LCo z9h!~Xl#O+B6j{!buYRp~`keNuq4BH-O8721?Dko3F-;-%>x?Z09O$(g42T=8>aOss zx5cTctz|KtA{Osyf4&!eJ?Sr(rzY`P>Or61CW&+*3q>nLi2x~#6ykyk9n9Ml#5+JZfw^_C5Y`1pt|=C!%f6PMB34?X(w55MjfEI$j}G0 zm~smy&wg6b{Oa!I?kx5>H6SVx48Go3l9{W;BWvrZ;PPm)<{|eV-#AQHmv`P_EEyQ# zj&-CYF_(cqgK%7I{uSW(nw79GBznr2lbb8LEbn}>yI^J=pSuxZ{(MD`xWlPGPM9PL zc6mT_Ae;;!do+Ll>+4Z;w-c#eSrXfwznpWJ8B@2@OB*ZrM>Miynm3O+$1$|aR)s-W zFAD4Ypy(b}G)byG<9+J%=xEh7D*~q68mFbulQvvVQ*%>O5&gJD8u7iwK~kT8g>x-e zTQ6P{CMqtutkY-2s;<_)RLU)CYJ+W`Hzba`I>W1cUs{b-4qwg1+z%jElDTte?dXSd5$7v=o1#8+ z00IcsIB>Rqy3WhFPzemHrn!}D1jH~44}DU2>uBXosN$`m$Bt;>oV&*-4 zc7BGex&hmCs&aymNjp}G zb4A9!RL->(R^yC!_df5Dd9pR)^^ED8;onQX^kDNO$XGN?tpufL5+M0ibr~7+X7W~X z-fJp}B0J&!zpXN3(@?mU{ah7WmM}2B_dS9tyT^UjuRa3n1V!3eW3OeZ*OE#w`mALI z1HkmB&@7Z_?A+AsXg)X8v9C@BTtentxBdDwD6n%SKM%6j39Yz{|K- zZ-}pbJ0uN^<@?#m&EAg`2WKiuCu}ZfEUTv0V~1G|fBcu?M^!XGqq4nS{Z1GI)8%%0 z;wbd!BD+GDWi=`nBx|N!SA*jh)!)s7At7W*G-pDG1HuSp#_l2N;?!&FM4jFf4wvA> z9dqRM{9jR)m~L`uCCx$iLi0ZJ;r~yZhw*<)1|d4+KMK76ufR$Ts(*-;MR*1Or7wFe zUH+dB{zs(c|Nb%mTN(NPBxS89jCa{2<@o={i{@7Pzd@OI|65A=Kfd9=<$1`6lmEQV z56#%989$;CvBUayVH(CfZ&-c*$B(-@=Fzv(?)1ON&Wyb>!+mY{Ka`%P$&piS$yj8i zXhowr*K{`iXvxUP>Loi_x@f#8n;3eQ=!0v>Qr z5oHf0W{q#SGcYpx%QKS{WlXls&G{?BpHx`f^hh@@$?GkI7sL+wN@-|loB+^LYG!WE zkr#Wl=bj6%5u>j$EOLKuZ>>~=xaeeWzw!^1&Rs+BS3v*s>&5=tgN-HY< z(37{4lRgJ-cmkCEqsS)R7G#{YPlE7T zAu_xm+;>Y03##?7EtG+-L6nq&BIS5kfpew-O3YIb#LmF!BHRT;Q}K)H?FgU@RDgW; zF8D|yZHwSU@xXh07lQwrQFUaP8`a|8VdLZ5LX(nDB&iGWC|p&#sglg1TF;*CI$B$= z7Zh3s1qP0xaTyQ>2&D9r_UvESru4hDm{<6MPSdG`C3&k&^emKoP=&pLyWyu%ob}(g z(sblR(ze?NFWqtc&lpLGlN38)MHGf8GTcA{eo(eXoe#yzJ($i<_nT5AM1z*|OGd_P zWRdHyP{B+4U=t`#1GR$6A6vjHU!EO?f$Bo1(lVN!m9=OM!ckS&K|$l+5lV6cvI{A@ zP80I2DkhPUrjTdKo%9nHlorM1qt7Ua-vi``mSew;Sb4L9+bSZorlzJK9&fSXTLky* zXU!tgW-vR{#XhyC4! z?@Le%;GZ0h8@@-JEEwm*3e_+w2WIEUiYHkY$=t<(pu_XMO!gO)7Wk>02Rn1(i%`8O zj<2~~Kp;|)|6a!(VNns0kHA{#);Zq4kGSe`oJIzcZdT~9kpXr2{J8zLO1rB37zk)j z0|~#PwJ>hWbYao@XlRW70GV|U2qQkqf)}ko1L7z$&Y%QuyFPBdJ}i1(v5d;eSyru_ zCSv8N9up7{(6GL?b~+29T@vVq7$HmpM8^1$)S~1SKBxawfd;Ao#qf->1*0U|lYVPq zpY^KEN{`9$cEgglkFnUyD;_B2N0Rfq9n|r;zP(8zH(Y1XAlL67GZb|Lkvl4fbqX0o zR}eL~G1n{(GC673EMY=MVB1u)zduu)JlyeHErUza$-TpH&-DOtcLh{*@Y}0G4HiJ9 zQ!hm^hP-z1ng*1bJDjF09Sxm@Hgf^5;ppQ3gJ8Bz(Nyurb@vmq{d}_p?cNoNo(dfT z>~silTOzxC85s=t%4cz_*HFeSgZwKNzQ>&PwHdgred&aSy@voT@)3uPZxed>2=sCY z;;p(*0qTHbxSso05iZe33Z!aTn_0&4jyg2}K;C?Ea#97#mVMvr%VQO&Fp%cs7}!$rpldjiS5X<{ zKrkf4lzQ_(+c!rc;4uFe^m{#Uneaf>2l-!HTj4IHt%VvJj;$T~Q1eX~0cKkz+@J4%ah5#6?)kP#oQkpsdUz!CGaSz=A zBy|Qq&Wj2FJp`fnc%+qcs!dt%Y}(^_t3!N;9n^T2c~g!! z^DEG!8F4)>8-G$X_6HOcy>N7VOBeBUDgnJ{pmHLYaWNPL3!u0i^_b`y;6aI4+(zZP z@zaUY{oIcy-D|xd2vS?#h#TxmL{w5s74XAf8$Wi3Cr5Wdxqssoh=%jHlVgWd!I9|q zL9H%P%{n`_G#wa3+<>U`JYY(b)#{o&F8={~c$6D^b>*HD6Gxxd^SK4|pKLU~2SY=E zBYJ6DTU$H8gS)6AvL_YZ&>->;9&RZNOw8lSYJ0<cNB2l#krdHGOT&?ev_GT^t>fyXizU?u<;su$rNV9_4xS;5cY-{0RqN21V-E1pe1 ze8D@2j5Dl-_Z|j{@DhD140QA{Aly9mA;s?*Sa{)~gcLUrqTb`BM`y;~lM8DO#O4$! z(_oFe4QnU4X81$c?rPc1S3j+$Pp%i*0-`5KSf2bmv9fG97HKp04V}vtas0Qo?QuBv zGzvqi%9f&(?1EpaR4gx+g*jJVvikzK(NZmzIL>AO6Gh!OCx%{u3Saa@_egVpm9Xg@*<$SJ&|LhWLm=#-R{^UQiLPdpdNwwj zAt2+;@9gYMvxHAfUsCUnJk0qW%-}QJf)Nm5*~TbJrG8qQeD^~$c|z)Rk!F#(*J3#T z00a~4L-3(~2{@nlOH{Kv#~9On{@n?ed0BPb;~297k9lK1q!EK)`)!BGLX|E%0r(ui zKfMc$HPHu|`?fQ6hw(tSHlP`qNWZnNI$MH%ho$$CHk_sadVqE=5t2kq{{8K_zTq(1 zq2zi2$o>+bew1Br)Iy;`p=A}N3VQ2vcYoh#VDLs6drNSa7YnKV1P^vga43(GQ$OY$ zyFSFP1daBK$Jc@(tg-w#yT|qS$eyA>0xz1DspcXhkn|cO!)(mB$(VB6O}UK$oIEap z?3~_PZb}uCia;=UsO%>XS>{~F;z}{Z05k^YayIbtX8@2;rHT9dxu&g*y}fr4pOCok=#Hl~GW7Eo9KC@2So?h)#UsyjsJNh2+R0_CKNYQod z1+`|xXO(KP59Yp>Gpi9<5JbD_e~VO^`YbAaIy@kXnX;=tp>GKpMH`)*tlM_+flBz- z&`KfvB20L1y!Y?lkjYm46JahT)ea#QUK=$%rZ~9R*n52B;b(9f1Tn?+K91=z4GRy~ z2cnZ5XeJO6ee`cbm&8J$MS}$je`jZBr;3YBK zYJ*Y5qz35hL_Ag?!&m>r`!)GOTt@IVvU&IAW5qY zDl04d1NxI7C1ZTPHch*X=^?Ux1QUB`$%bA4nR84zestM1oQP zcsc9T3K}dLmGhkwi=aSRbrC{pwTs5;8fpN=0MVSJygUvf;~pbL=Y>xq&J~aLw`s~? zFZPD-ZBSZ&*SE3`=OZHsJtz^U-Cbf{+D>qG;1sczeNx6RejwP(l#2_x*(saF&hTs~ zD0e2sfZ+c?BTfyUsK0<{s`QyUS5^bhC6eH*i2%ZnvdouNbp2~1`RVZJO?yLO^#xx3 zKfsLj?MFY~YKHx}1w{UPrVy}1fpqhh=ozgGE z5}i+fbw_&0_!n$}&}~iDI%9&&w-=Ot4{gp4#-qUmozmZFo&O#LCYvu&NfK@nd}Rs3 z(5+IF#4Tg@E#hhllG#`rOcA+!Ks%DBg4^V|n74MB|cjpX5ZdjP6D zfD`~GYTqzmXCPkV!(5}c`@6!wt&mb94o|{lJ)C3I0QS@>GT;(P59N(-jNoB>Pb$o* z&@jmP1Uz&*C^|uje=i_sddE{;uC`qPvpQh>D7^hkwrpmUQ%Et-qbp5}qKu5k(2d8c zn3!aBLUR2xu*ix?26sDBDk&))hDSzfgI?VVNQ|Vd>{b5PyFVIB%v%ud#_1`~d8RSkneD@sjQCoPXDbQ;dHG^9eA zGg__&mVQU2{oL$>m>!S|1j4$GgnSZaSOLtxd@T2kP^7cZd%1R@Pk;`AiH%Ll&aMQyO^_~Q>gSnkUQrt`NhEzMRt*eXke>{thGSoR$%)B=PqAVB8@G*L z;TM1d5K2D`fwn?4i^=coyfUA-e5$h3_Z3dH1@2TC=Y^jnr^D&kMz*Syhth1{NZ5-n zPFBC{e;-ZDfd@QY)Y~oP^Jk_q=s1H=yV<+2qyb%UGF4WNaDjwgR(NiXRpssDxvBfH zXlZUlA+XSl(92`g>b{~@&=E=Qp6@izJ(^N+p^jEPWztdxEQ8z-w2;oq$^+}ezah)K zIWaMj7Wymy6g98xj|6tNIrZxfqM1T@1tRK|m{ZRXbUK_rUVL*)YPBgUjr!;Qfpkw= zE1B$?{GC~qE-%DiXr(~4oP)eLcBZB|15N$kzdzYoS;^Tugh2hl}VpSFhdk z_6A3}ugWKZg<}v+kBYgjYlMT4!W9-hbYu`Mp%o7IDHK4U1j2uqh=j;J(y*m&XjIoL zt;a&)^1jb>;(HF8Ja|+-UQ)s^?b+M-);r`cFE8K+@ z*2lR&=dI;gLPvCIiHgK%1v#7TN|Ms&kC{}Sg-s5zVYLkDO&mGFFby%(R&&Lxe9~m7 z%ku~*_%?H3+j!PWj7}mFc!!vjlb$|{e8tTOnmZ# zK7dfNA&8m&hC^g)Xhejc6GZmhfcorrBH?g?n%9i}CA5vys6Uq_(kfl=ta1`RSgfCiZX^}QTAnr|Q3Nh{Gnrww3)=3W0sP`*EcdJd?z|*W7Qf`TlJVWJW z%isxy1bQg^!a-KiL=pXg9u%l!ExCql&vwlpvDHqNFE6#lr{F8+2flxs;Z|YY{WSjN z*wGWOqOr3$g?DC5pSax)6vTI?_l13ayG#7qX`Z2=DkQ~ ziVXDGf#<}t4DdU;*9A*fP+X88o&1RpUv9fLkl<@FflTy+oD!;MY1^QA zaE5%Itz+PE4yGX2IF#@!ehUqPJB)_%5{0r5Hqc!lxn3Qv4n5hD(LX)}y)&KI%+4Fz zDaI%!G5mF<1&U{{&ys~#DU&I`!a-+-NY-xCY!dmGn_wUh38>HLXic@q z>di%ur=6>z5mQwl?$`>5GKd|1RgCuVu4b5#s0vmH67rOVkbp60amheJ>07dB-Pbz| z;g_5&;^NJaq#uzHo5sHQXKPtR8zc9CkM?giY)N>h5C?bc>EZF0253)6-g&eGAOc7S zTmj93ib@s}VHkTDtD*adm-i4*!D${1w|!VU+@3trmE z1gI8DlHGj)Q5GP3f9STUg9i_IdlOVlZE(GzOi!l`_>>jP@gRVbO{_Ywlm~)`bpa}c zEJ-PC8;&|dFc^BexVTvLi-+=-5Nu2^=L&*^?HE~Dg-qIXg09_&Klvy=fq&NHzEt+m ze2j|NLqO5po4t*jy&o!RAc=?d!?BxVT zuto?c;BkO1zY*$LGiaN>jhTG;IX`cd2}l-lj8M^%li)GPEzAd!9(B#A810N)-VmT#Q2>G#70s7AgKP?xN}f*m~u6Ag_J zXn3fIAeTM_3Bf?J>PcWi!uX4A>t55Z<45TNz#P^*{CC>r#niSj8W=PxEuqD5w4?Mr zRD9s>Fkaq{XPUb=lke)`hcsb-ovV%68SlFO%lZ36+!yGd@6*xBjCM9PdOx%{V(Yz= zw^cnYw{caD`_^}WMU@yG0aCWR;(j8Z48toR5CJr^Fz=U^=C))LGpDs?g!v&5e46gR zAZeCEVdSJdQk z$e<*G*oihb;6MKc?yOOdwcLb{Aj5dij`-I*p|TI&+@lwe_!15(+c^}j zH~qT5_9+#ZI#pamxq1_UI$YY4Ov!-?X}-F zbf#oPecf+<`-9A)oQBC?tLMqU1D(XLc)oHp4Sqx(J~$V-{0?f63c{9}(4&yBuos6g z^W^3R2#U6VIe6+1F5y7HVN@mMl2jZ)l_C?nFM}!!YQ=&*@Rxq_S_r%&0=WUJ-hhJs zhSPi>7Z+FDY-~gv7c8=I^5`Hphw{BEQ3A`;r#F__5kzX9B5Z8M5`Z=rIa7A! z=H;1#x{)EVe|ZMshjI_H50|YFMZF{S9(#YhVS{dli?iogt7l-y5ObhktCJc>L#@4*9~euHaM!u%Oj$FvC1H(8UPZim?=A9oB1ql(H+@OT?zQvRN%p@355*6Zc@Hx=5VOO(aGtB{ zFt-+&__1}(^v!1S-$b@kaqO@#iRh@ z?3x;ajdvX<<9lE}-H)3TpZ%TEr%-rRAVa@X^ysd5<5eGp;l-VQFm|FQ4Pa#~1ip)q zJ~$-hF&!R?i~DN=RY>CQDkL4fh8me9L!IM{mbCAU>O0<40w2-J@8%(XDo6iqY}`8# zb$9jtMTddYjs3>++;!cf)vRo){ob(m_;In4VyvV*V)2MVqg7t$KSNBC6iJ^jQ%PfC z(*;cD#`?YFPT~-;PNI+LF~On*l@!c9s1Jy07No&?e(j=4>@+VFjL0pPOE50|Sj0&+ z+1%kgBI7DkA(5^mP0#S+ZS%cs({mVu4Kxs0L)(^h8UH>|Mo67`Y5I%a~ z#Tb$Uic(iIEA_`m`@JeZcanM}0bG1_bg0A=aM55*?S+487;^X!2kV8l-&?UkMUG?J z#m039Qq`QLUoR+Si|@F!j`U4vm_}L8wOz-_-XbG}Oa!Y*bZ2I{N=lmaMs8nBKsAtL z{za!Zbu4-1^Z;~h=(9T#fqXQv<_}Z)E~zAja?rt!eBM8CGgQuUjRk%RIv1OoMF+JWZC$AuxUWs z5Z44jeeZyXLqp)QWcTljocgX@G0n9Qs=MiiZk`(8%RT?SiBxE=s8uAFDvQ}+f zM{basvsyIXdi|A-T{WjI0;Y!4`~En8WxL^bsy?DA)KB{2v8R`4C+F93T4U|fnzH{~ zMz%KNg=Bh~b5paG`S(h{Azv>X>hLTB7oI=5d<$Ncwm+}~G`!El;&4%F%-GmS61%YoSdA$?2YS3_yk8p$RxP2*XGmgbQh5Pv*uLxp4;;AAT0JjQ*mBuu$vc} zpw2~w2GeZTlIP~$!GR5Xv>dADY^zCWrFncj+6?zAGb$PU&tn_mcZ7@whG$OP`e;}i zByU?>q(t(=Q)&RlDfvX!bA^83h9LF|5wXYx9r_y3ia;1)?i7Bmb?_$YUn7<_ck}Ta zvPoMMOj0>1n56OfRHju_Aes47J1kgm%xrqtJXUR;M0X{Ue$FQ$AO4pfM?&+#u!7y; z!YIW-B9GNa)dCH*KuL-4ysYP-P``mR(L*M0mUUHf@(+gU{e@pMsB-8x)vyT)TAq+; z-1*w(0cQ?T@^+r{;G`*&8PVszsMfMU63U0in~$I{9_s7sD+XQwlwueg&Amokh34go zq$w&<>HJNX%P$mtefi-2W6CpQ(R%oHviV$XyWsg1-)GYr$`=X$8l($JK42XMToAnL zIzT&4%a_-G=cgBG<;=$k{SYS|Fv-$pLNX-SnXQ&gnzFjMl-W7lf&1`qCQ{+=_e%cR zHf@@w@Q{~jfjuVs1@c0yH%8ccfQosi$uedEW>4HCF5|Z!aIB5bzx*~x_o)zWH{#xp ztS$>#!E84f_&OKXKbD$6=j`0!zyHPC%PT_Xt7(tuG7CFXExKYdN4KOBw!B56Rz_<9tO5cwEN#zsb@Y*MDm~;P-TEQuznUf))%8l@rR74N#VK4 zUjB|m4kZ)QXE})i{OBv|yRK96*BOv71jAud`r)l%13?D7JPZsWKv>Q;)H>69uYh`k z7idWyat8|HvDER#{k?GkpECxjTT!fh4CZelssayQi+`W7J z5ezq8N2g^~i4^QRHXba9os&-~@_&dAGmzvHi@k+y~{e z&%zhQTc5OkXHnBBA=bK8KE-rk9?B@wh@BGN#-Ns1Tw2c*$7R#R{?q=90KpTnmF5&$ zu;tNh3c7z(JfX`uhjk_@fvDg}YeshnY;%ENR9ZL4p%XlnX@yk_7cTRBzGtHL==O!z zD!C6&+g15>Q0-ggd|XJF0K_z+dkpZGCrS*rF%fU?VfPU}A>q5V`%h6?Svid+HY4E|%B1iI~((OE*-JBY|SGGhoFNCg~Md5|ddx8XDeUeYfwP8m|3(W2UgiLoExH zNd-BnqhZ9)XA(n!BSAfFg*8R!c)e4qt@5E~eLODs*? zjEDnq3^HEFSMM^zxtUd-8PXAuCZ)+8@SVpA5fY$BcH5QBRa{M|?7UHHVIZYotDrc3 zekZ8p>H9ZaNk61-iOLrd_jnsIY~0##ULsan1=96moUE1>D?|zm^!?zlKmK~ z)^SlL_Pg9I$;}P$0#TarOI5D+6WL|%?IL)_5VgKurQ*%&#cOs#6r*@3Z^==(%R+lU zZNdsxDOpK!U=!ijvv*_v_Akwk^fY~1T5J&>l!I6xpG1Tg@W)RCX&#qyl+f$>`@$um4M#@WUclLZ0l z*s0x#k(VKQnX$=A46Lu2bF;OfMvY`@O*tyKTle9`)aDnvRL{@@nwQ(+3#dcbc3MOn;<;<{!rmJ9E`AFk&?qEdo(o&-yFLr0O|4BKy4UF~B@ntUq=Ai%c9;kGHNC~i7hL|fK$di62( z3GU9Cf9~RA^n5-(h_v5bjQn8Ggd+21!e&6}C|2#PKhz$-Y3yydQ>~sD0Cv?=bI1eR z@7y*Uvfm%-{xsq-f}9SSaG58XEF`=y^u}qREPXj^_^M)@SGko7>n)-p+%lDSMk!x7 z8;emX`N7%ANg_;O$c4cp7F1vE!o0M*Y^kKAVI?&oKi7kW!fC{>(tIJCYHQdC`)$+} zK#;MCbf7W-(7R=}_LtpMAyI4c=`Yjn2R>hDS-55Bawh;DwmCI>|I#omA!jbqn3X$} z^qH=U#qb^OcZXbi$H(~q9AE>D<~nB03z%|LYHBzjN2~kJ#n!J%f0@Fld#sw2L~u>G z9g7n+N0!sRvyjO_$z%D`wSGC=aOIAeupI_kL6*bc?&yf2z!g8QW``DM z^(C|=es9B{=qiTCeQ{Hu6smKC9r|WJWOvH~)U0v{B{CUY?Wc_MvrLk4@@9Tuk|<5! z<&K62pT)ksSPLF{-*Olk0BNQ19QwL#crX~&fpTTo$QI`8w*O57?mItL4QV@$SndRu ziwQ*k#cfNy`hrri?6dxJZASFwCCvsF3n^LE!F~$M(gX{)O#~Jx(_>~FTpXRJUfqCn z>qA0Qu*XJ8wJ8YRk)k;ut6nk#k@oBvA=2gK3=4MXdicv6Q20f_r5J(0>m5+09N0KG zbOr`i?IwIE86aPKqG8pbetF~jcFwd?yxGr&N@ zk6bCc7JAkU%K%SNhuUbTj@5Q$DB?)v+-t>^z==3hGV}9ruq^VR(ZYU!n&7_WR;bNe zMWi)^l~Q17jSg~_1Ou<0FLSVY?m+tUBn1xqABd-7!&o8rETQmtOoGSL33 zRCn%ZXG0IA=jO%-MH37vv5a(D01W#Nz?3nN_Dpb{`;yb|vi~g%2h;}|;cj$N(y52C za_QXQ+<;73e%Hr{#`o4r8qXf&=8gTX-}0U_9QQ-7=;29@l1|tf;fei4Oq(du;KMGT z`%#F3Sb}hVVd>T0QGvM=ACFmh4(rZD-*9Ewb-tyRIdSG?^+Xj?I-i1DB##j`wHnYN zPNQ%1CB)#!73QJ620$6CyUSdV?kTVw?#w7m{A!B(L$@X8`e+Q4_F( zUzPJyMuC^Q{wvo9lkiwOVuG&*#Yo=4_J5P=&^qxY@xoM@5zi{h(kY4%oV99e!5SgICUr>t{U}sJzNsUqs584*)J$CNE{~rJGquM)?^yUO8!SW26 zd^{&W>G6JhuDLlyIX?_4kpc|{(lQ)rWf~q(&n3T`eBcI!@a7|tR(1cR2}wn zw-H<*ZRD2i#itQ#=)J#6ooBxH%JJ%>Y5Z)W1MO|>C`Z4T-_0u4cpkWPvrK20G(*BE=3oD)^CnvdHwVg{c`!Y=q!W2y zYqv~Ju<_%MmONVu=kf?;{1XTpk5tj9H}<=d$d;CmLl|+BvGs(wFOPf*d!;by+jNMD z5f~7z%`)1XwH}%HwPKs&N3HAX`TIC6wTtaa$RFMTDbpBCpq$wPphs`Tw|7b=)iCdQ zkhzgYg@p*udIG-8%bbLK3okdVUw=kl&s~vDr)CKH1wP4^G6uQ=yE3U<(2I6Sns}m z%&deQ2+KvIO1y~RL2(FLthw>@>CD>m_L>Nz@AvPWTKn;f!Uz6M#!vX{Mq7pu)S)nCn^2w^XdCHx z_7{9e9g!{EUfw`N@%Y7_xf)2z zT&@Toh!6zk6X@=V2uN-;JKsCSN9@$7t~KG#<0GV4;_R^S@EWFI6YPW;n+#B{wFAMQ ze08xum@dyH!Pz_3S{(CofpNxlCe>kw)8Qu1Pdr%}3bn%;J!o-}cRZj~1nT zrG)o)j5p&?h*`zkr)M{jxuFl1bR6eHu|+T)^oDTtJ=Hos5h;zE`+Ku6JW@iF8maQ1 z3c%s;-dYg0RrwPn^M4q7>#(TTsQq^cX#|lH zkXAxaX{4n?k?!skX%GaI1{G03KoO+7K|)ID?(XjHJZtv*d#`iOU+2uV_jX^X!!Yyx zKF@mAy6?{oj+!UcBBOUZcM#LmrRzfyT}_W1g{MOp?nobOj}Vo5M_HMa*1w>0aWpT$ zq7y-+0g6+RHHs)uoZ}TZcf3H!Vq37?4{ihiTE&4k@IE+gY>MER=nT=g_3%M@F0KOH zO%TIhL@!n2d-NmSGBD)~sX?Xf!;Jz|Vk-$r$$)F{Yv2Gp`&0~RkZ^BkY;@h~O%Cn> zGX^+c_{)G~&hYTzM;LVRioBYs`-@~AhrEA(Aq*>VaQ42$+sfnOYGNV3ihxh%U;89T zeso(Pf>2I&9QtwyA(#OYKTr_>wM_l zoqq(AapRj{E7BqUaFwPQt~F!{FRxZGt~K=ctZ`^J&VkZU$idFfNq_^4c8!lqd!e)h z8~7f(IniHS1yy!>!BnanprA07lGOcC`@sOTF4GE&p2>4B>|s1#Xb2ZnW9);E1h?xeFK4iM9VUZdm1LOP2%3+7 zeRFlBT*_-D&@H5kR`z}J%>IE<-CSe5#8=}Odk3pO&LaVEQhbp$tL@wR+nH>iIz7B# zF^mYqRphI7A#;~U*xwSS76qS+5aXDNCY!56DnzsjAy^=&lrB4y6KK!wc+j4UhrLR|x$I z+uo$Wje$&6E)=}{XIx?r_Z+CHUYXAJB`j#4Ye?KaC*&*o>hU!ojt7IBZ8xN22n|_Vs zOF``UnQ9~tSlZ=zD54Zuzg2=nGxw-!t3oGN8s3Lb23kL~%et?#a=@z;rwgNtKPcRf z^j*Q3ULjR+{cRbkD^2h7ZT{nZ+Lzm56g50xRYHCLz7wKu;xblgJLAUg%<_qlB)+Pu zDmmWkZ7}HDNwjh~2CIyjLVBSHqN}Q+;x789>)MCQ*Z6TXsr9V6Di5=D?z7#%xJix` zjSBiIbX^s<@Ap{Pm543TME{d+t_$!|Vo0v$^N?v%l z0u%VT8k40zI03+sj~z67LS6v$)5xywe%#Rp5{YPN*nN5)FHl+ymn!6jr;|iU=Pmqw zEg`b$n|z+(__<|zSnPt4it^_Y#g+xDWmee1gA`7me!bGGj<1AFP0A1bvSVpGMh?Ox zi9{9^5_?yab4+<6V@o_#+ADQfe@7w^3C1VVLL;!;(Ey}|O&n_zE*ozcYp5fm+JHhu zM~DURo}IZyTx6DUbab?OWgawJUO7AahlaL#*;3$P6j^jqD8u5m0%q06-#N|Y9U(O3 zFPKz58(UbU`R>f1fPnrj$k4fM23nY(gHKH)fdFvmg<5#_G!|E)k;8hL4|!Oqof;T|qjnt`55cph=-*S%|WUcCh%Taah3^;MY9= zl#SHim>jl+L}*BXokGgQgkCX0$`NXW@LHV`F>2JUi=H4VUK?FmR&ED=MJn zSJ?!o*mV8s*QH)YMn+0dIHp=FD#+;wCwh%odR9CUv^k0ER?i;v*jotgJ-^6rD+f3I zec0rcY+hdt3fauoY)y zj7&91evF-Dr=`B2GS%G$-1g3#l#tMbe(TT9;CF}#6hbP13L>5&=D>A#w;hiZQznW* z%i##MBzqi&Ay zQ9fjj{2Bf3tAfI>4v!)!)+oi7{e=ooT@_QjBcv^jKi3A9q7CTi*c2G>Y17~;Dk|zj zn{Sy05SY(1)#41Q+}O84P|;nYv)KfDb$n`Im$67fEdufE`SVjD>K8i744nvP}_Iiw>VHBWR2kujUCUxr18to<}qXRwk!@kKf*4R7gwALk+5vXLZ54C+Xy`qHbjV;`Q+ryzZP-DcS`z@y>7}HkvVb&H-`0k6 zbaeEXkFObYNl3O6Nay@i!r+vkzB-nco}LUyJP>Nw#ee?HR#@!b^F!4A$j+5pJNh01 zsM!R*zP?YLoQfJjU-TTD*BfTGwq7!j8DR0_J&zUwNwb1GgBXV{QkIq&2N@y+`hCz5 z*Mybd$v$7}H}fj4^6jKb7**d_IM&H*6?lQgQdPT}>U*xHHmDi8WP2;xN%{U$S8j;T zYv(q2aF3BlPFj0Go<5SCN1cogovmG*nK%jDWHC>ikqHj~8M?tQAdmzuR6;EDkcbH1 z+&9r2d`u!DK01J-xP(HQMNU>$45TCw}bRCdZm*$HWmjS@bSD3kErQoUny8lk!9bv^Ru%&=3G)cMV2U#^aN~9*Crsu5=7o) zeEHJf*!O4G3QDzH7^MM`)_Gc|E7c+;@7i%NXwlj78S$Hb?VxUn0V8cvA!>pL!}dds zk|M7mv&-eH%2+aYoHjab5Frs0QK*W+ACLM9%#ZTMZNbgcrOHjo{zlqEy?=*BZ5Gn+ z))o2vym5emlbS?s-AhIcq@|4DhhV&|FThq1+OAn(;L-F?ao*2_NjfsLEg0$UPaI=X z8QbsGj#+T9o_E=;O8x$7IS_;G@&#ji9qNV*QJoW{As3aD=((Nj7`sQxnn9kZZ8@aT zgej)$>RRNldrG40G=N>r_!8U_Adl+B2M06Fy{ z>uVuaHJUdhvz#Q{*jbAk&luAZ5ub5+SejxUAU=JM<9hhi7>lBoLjLEI8wdqKrnJGB z?Ow;ldl{!`(z-?>3He8Rdn!?+S%ArvHZx;{cfJ4+3P9nmeZ8vDY4qoHD5N||JY$iP zejS%l8E1}>JyHD+=2@qWjg6o8ma?*-PjvUIiWN5nOag%CI|I_*{0?<%^jw?ee3pS~ z*J@UoW9mWdVFXq?zKWHhzVl(wZl=mXdJz`sRG*)ArrMaQyc~>P-dp>sPZ>dn>|k@8 z42*E#xqFEQU5&#+XVE2$VI%%)fkEJ z#YrelreQMi4|*DZru85rYroNCSF{KZ#ucKlV-ak^zwBH(O`q=^dt7!2V|I7^s48K8 zAczUX@mTHAlb7|JlY!a4AAO|0vR(o0+BZZ9%j7)^xX>hI-jf$r+m&P7yqV0PWv(8u zeNtp=WIXR}+>|u^?55BH9Ul)y)_d}D-i?n3F}8^qlfbEoY>c{#Ea*!0tNojX3GnLs zOr^jfg7*C7L?x8dRNm9KjaeRBE8X^0ux$>Xet6osCL4elW#I@B;l{_x%Ry29ut%3{_*kj5u8>(BEwzmE>3oljA>H9^N?$9RM4yOKD`ssT($qO6DyT7Gq1v9b5NhMcDBOPbbBK6Y&{~uC7f*_!NWZ7nPknc zD+8HYYQZp$3Bk~n2D}u~^{zYdTjGI=w9$VX>hEH+YOKu7IeAHT=ZOb3WBwzXllnQf z@~zw;pG?$qF96}uIgzQBan{lwtf#u!wqAJO_QIINET!ro{!^IDlrEDR2netc%UEz>j;#g z5&%em!j(P}3r{tb4mDFFJ9l<&?j1;-L5uK5r@@2+gh3#h`mw9rxOOdwx7lBIex{EZ zv?2V;<-JZS&d%;pl5)hhFqN>klFZiHD{m!#^{2o3>i#yJ{w>+| tEVGbFgd_)?a?i+I3k>uW~u8yF=kD3#{ zY&3$?7P-*+{dulEd>yHE!0&0!TaBI{*Dd!)o9+|b{xC$%M&!D^ZP{z?u}@4Mg5v*E z($&dEu`*rnSMXKWcewI*tHDAIT2;|un^I>8F+KVgu2%}F!Mc@3^{C$H`BJbOFp()6_qrNnW0*D ze`?fGxNyCHU#VSz%@WHo$5mEPK*$;S>G^w~F3P^Lz}aByFR_qc!yFcV3fycB5R^ZO zlEhje1Pwzyx7?++F?|ExUQ2u_<7AHI>JcZq9BW^UWM$>q$~^P^srGi zW559O`EhVLCTmn%p57oWbL!wt%P8rBtV=IX@*tE{V)z6(I5=LtdgW)3AN*gujD)r1 z9r&uZNG)rtnG}6*I{-}`;Ls0_VLISWY=6{&#wLcY2gHaTTyt!}t7}pcr zFBDo@g8DH#W&4- zZ}&EZ&|hYAxU97V9*R(M?nsZnO_2MUFo}{~&ZOn}X!4U@1_gO)qBZOgg<5}n53eq} zq1~Yn79Nf?B7nD!#(gV1mls=5$^8p zn$?{tA&qmalx&%5IMHw12@_f4URVDlFRo#YGq-+VJ8`vi#_1tMtreZSqj$A7HFc|A z#q7^FAW~FDxu%?^lLVwjK1LW#^AJm@1A)|n04@MXq?Lxf^eIcA7F!T(f&jjS)g0FU zy7}EKqQ<1x)jrFQAbMvLr1+`k&CFa{0E_#glB==J-DGsDUEq?PEf-^X(cHm)&Q#g> z(cj;js$zdku70BPNc`qUR+$2FRQ^4~Gaaoey_gcXR?2jR7SctY4h3%SWg3hM2nk)(=uc8( zS&vm}kH0vpyJ``csPLf{&6|4f(Bz{$8~iywo~I};JF)!@hImW$vG7~aoqK9)J<*M^6v=s*ROl(fEYYwmGs_~gwH0>8FPku!z5!H^{Go5^ zw=`tFsAO49*HqhqIUjkblTP;Rl;yxf`=u1p&>+dCS5EjTJ7?(>A3*L1JYK{PY&xeqJ(P{_u?3_v!Hc|$N6ox)HC|#MM7FE*Idk_8$Wb~s+ zA-NEBzWj#?z-a6u6N{@pQu5_>fxw;R5Ds6k+<KeSJa9IMeUO+kTLo9q;{xJb!J~(i#0Q zS)hW1V))Od!|6(Ru=n7by#AVpmmbCSzJQ!^A!;K9`wzW%{BK)QhaZ{ys5qsOeW5}4 zJL^D5;au#Dl1_%~QxxQ&8BQyJ5C@@sGL+8mA(P1uY@69&e8hFIiKa}O)kVC2c0U|Y z2$flIE(S9u^TUTh;o-Pi(Ty-`hg8Hbm`3g}wiylU1Cq22p}2=dTAIC}%gWtJ_2lym4;9SRl#~5u{lzhYzN*DNb4d1pNfipCkQn5LEXy^mg7-P=)o>L(ka1O zT3Uj_68R08nd{&pb%ev3aH`95&=Y(O<2IzkwC(FYe9#uWO@X<--LenSk~LY%9HxDq zU{gL@^3WoYDws;sCe@$YKLxJeKRCM?Qle$sd1{i(3iinXnahecAYkqA%o=to@;oJG zJ=osDG_ogcjE$9fZ$=kzK97{8r^Q3dlzgbp%5{5cD17IGZ9FZ}sP4DT{o2ZH2fY5B zF(o{Qjr}pgn+`Yol?;mEsOgAEVoAlLV?67edbem+{qNsDe@J$Fs4Q>pa72G0xOdT< zbDGbggTfc6mB*6&~g0!`w#oyr_Y-2 zZ$EPKO~*Nmxm%LL+H>!#-Y7Shz5Twy(xu&x8z-mVb3Z-%P0DN2Kj#piT#z$+4%%fI zObm=TWJui$5Ct3Bo*1ape{Ey*Rqd_Bt-ZSVFd&M4PS*8UuZC=L-tpH`Mj?esA-^3M zg#OOW&DF+a^Wkg2HAOAr9ReP{5YW#5Md*3Rpj*1F`hD?+E^7yLTwOu^;gt`1+35V-OzxJLMXgC1{)-Knp*`l^)qt19W9+#1qu%=#0?$tA@Tw|1y^iW^trRR6dE z8ht9%nfN#=Ds>L6Y0|*_0hEIK0UfeKm6BJbgeX3G)u*L$zaG46HnlLLx>FX0S|RlA z&h~c?1zaw29DJ_u?OYRGnD?3DS&XI z3Yh%81qr4N+RP7?%!&B#-*t0;iOPTIGRRarVxVi#W{b1|vDNFjH{9UD!9jTsc^|kw zkpG}g6w1iYz%XCUt6_yv)~co=3BF$l`}lxi*7imC%W&;f_C?jLi(SK( zqwQSljUC)3fC+|!@8`>InI~p@huW#DPVP{Ku_6@})qCpjoTOjw2tPVWY_YS=Kjx`4 z9nvq3@KBRZ4Wn&=+x`piQVao~B$)3+tc`yE(9?bmxvfIb$O;CP$8VKRXa&k+J;9{C zDdz1txwqbalqvhgKUu}UQH54}{WF%4)~T!SoBG*D_Ia#(TCk1@Vb&c>+!J{O;iFl` z;xAtw&Ae|8774kJd%^!ld4vyvb;Ad`v(-l=E`iiecJicrHvJ|htL>J(qO)l=xwGfz zdu2h}>K>y%NW&Xb;LV0W>{2UrxXFldZiIz}De;!dC@bFrG7U5Wvkp?VY*dC|eSgW8 zd*9RHt9&3X0_Ju&B0thNZ;0g+WX8tF$D<~OLhwe*NNduAFf;XI0HI$Sw(JS+5J0Yb z{kDWHoL?KfWve%GO7IQw*SXT{`YcWFdp+c`crt2Dd8IjAWEXb}F)%vnISwkcN$5^G zNPnKXu!qaqV>rflkp~5G2(m&?!&|y`DhLfL|}Qyn5`G~(g&ccF*qHa(4<&vzFiuX=N{K!i2rdv zz17+&4t_b!AIN!jp1d00qJGQC*x>(u%7rYf3Rdx(|MU3h%e_sN_Dgf}^VUCKkvV~9 zuMk4i4vqlFYXXY;Ayd2}U#$Q|03nl?*ZDR}>T@hQ6On{#Mq%MMk&5Y6Dw8g^#P#k{ zQPo&#mvJEI61pQmi=!>eQhiDtX93?KS1a0;<%z3-G}7KAZ_WAbHVj+%`LpZ`UJuh5 zAqKGh=l?_oh+3jOXY<-kG<(czh)_mssmS9_F`--=a$m0!ij(8wh93cS${R2&XkhsZ z>05RD7=2UzL}bhj@?3t@z{K-leb|AN&g@BQNd_y$(9qB%umpK?bV|p{!1fBWczRaW zHqVZjUQmxJdclFUCd;PM&fflfC`;XT5VVbUU~3acM@50byna&z4b9xjN;wbUW}MV{ za&vMnY+%zxa_fqqD=p4OIzRg_I1M={b8~Wf4ME#ZX{@i`GHhc9aI(`NN^pLOcuPpc z7p|Ajh5GyZ&ogjpy;&zDL|k<~PFUGxC;x zBAUZ3w2w&rFyUZ3R%DGmmEuq4$s;`!yG)3h(f#&{7US7t1h-kDqmVb!K+cP z_u-3q{i}qK$sA;iju1i!Wxadq?Becj=sP_lDQiH1_z_IfL+ZABaSnZ!jn{;TpydS6=#P(6KU7QnV+k5p(5xbAL4zt zbghCfB)1LSxC*13HFUZkKJOczoNSs1weHoQKYtV;%>JK(C9lVHgea3p!uC^^QsztF zp9c96TozrO?#A<@Sq~bDj1%qNU?7ZRFfnpX6f`;l8MaedKKtD4Im4?X3i51OBdIl) z*5|KZ#QR7fMC{9&~RuXkK}uN6qz@JfM2as@AUzTGi1t~EMJxQY@M_3lHb|nZQgm0ieeFU?-L^!@r z0=3&0^`zM4b<%O~%lU2DH4q8g39-pc^XrIaedwL2c1s)Ps))W!mnARd!kD+2NM8jf4Ho z)FwYm>`Wd-YSD>4mYFZ>I`&t7IWe|U>VtNJg$l)G_G2+|x-ks3TH(vPtuM*CsI0fh zcUsM(S1{5=1#)M83Vh7k`6j(}PQN-%P2BQ)!GQ#3CNf%Dzts@*WbC0kfCHWr zXi~`N00)I-%x$8x+MblJ0#H4W#4Iwje>Z?4jEHx zZ)^KqhNU#uM1Ty8*%n8Th8F`D>py6a0KMcdXjV?41JO^9D1I-;^zU&e1h7kMMbrP5 z4aN;ebKGn;V&-OZ+Q)%84egiKlmNoprrq)8qfKC#rW0#z*}kX1frG1XWy7t5g^sE! z9#W1I_Yi4;M1Y9i2j(NPVE2S{P`X+>3YxcKwDbWxA9@E`&;wF)s`c)dMz*K$vYBt9 z)Wx_`#QI&tpMD`UX`kQa1#_3k?5@W+7TwM5WH~JC`vGi_>t}g+aX|zpa8L0TB5_$O zS8i-N`q*b~K0p9GhnC_rD3+Y50lvCc4RRx4@Ly|U(G?wg@&XN(7spn&}4-*u?P6Cm| zSRjuFzGip<6yrCcelL-a^DY*iXL`1A(pi2hjlj^RaB)L{>Q7`CULcmf7Xi<9Pqi;* zI9dBAC5#lDNiPVl+6UCG4!y`wkMkx-R&=uU)h-J%Bc6BI zGSdio_<_)j7D%ul4LGxUNlhmSkh~%~e`IktBk}&D;t(9W=LWA&T7Oc2 z(`5esi=W;=hkPmw#@=Y@HF+>~toB=;0ceE~(#3$Q&kTn3_{kKx+v`A2e=Y#;q+X?q z^-a13gde~Bs^GGUskR1Vl>FOwp9$1+YwTX?B$k(xdoMg?B;r8Wp^%?1vJi(i!Zb!j znvRGwOi3#xNF~!>`bJ3ShNoB(55kl(eIK@tgV(|(I_zq!B=8Tg`Qep;`Ws6m;Srh< z25q_uN2FS}X+U_5e!0a%#18o^{p}1b)1h5SmCNav{07(%$&NP1mzNh81Ix?#;dpf( zL?}+7Bu}C~@Rq1Vnsf5FJD_cCcjTPo)#o3i!JAm*vNO~$j@d18$Ne^Ht z1R?Tjmw9+#C{zJ+&!L%((c)t)I%9R~=9Ptofyt>UAK1?_Qwz_DNk~}w`uo$N-$2Pj z!;)I!2(2ve=FhIKV*gSiU)$Ia`m8b*X+9dOZfzol<%oliUy6;3%b*a=h61!JR8Ryz z#zT86h5(__9;gr=h=+XP7!2h7nOn(g-Cw93{^@nci}Qr~I*K}m*E`s_8cac2EfV(E zv<5B>{|G6!-Smr1x~Mp$i%o}Lc3yhha6KRpkuli2E#Wk<$QIOG_o$%s`KAEA2fp}U zbQZ^3xjBDy$~ryWLb*t&)cLfK64N(_<~&|^lV)aAVixiscu;IY_q%QF4wGKs*GtRW`z9d`YyWV@Pd9y1a6dylca3p>5Glj{VKnhz3EyRkw4TpHDz!Obb@8?3f{aSzahmxTfc7ddk9DUUZ#)ex=J!w z0=CZw5$j0VgE!D#tNHa62TD5v1TxON9&8=9s`6Y|bc(>oYwQPfe#?EuA1(dshmqbQ z2}I&cs`ASM zfAhPX$VzH$Z4C!e39HZ^4+TDRY7mGgT;bSaH#0k1UtV7R>==fipo542ciMK2_>(7H zs^d;ujisKBp|xm!&LM_fy%qR8?8~I;m0Jt^FW8%|>^ISa-vDF92bu!pJT}Cz9R$PV z(+d`WH3dX__Ri-h0e=1o?Fy$<2cWY!0tsVds+tnIK0RI@9y*N-6E<;qz;W=KlD(o->mkfUIJ6}>qDKAj7?CdN~37$f7suK zRT~!}2CNyRIP~VWDM%UVZEe?00TXUJ1L$Q~clkB|z{nvkD=43-ye};vAaDgYBnHHQ z+Z;IZP<$9{iDdYOc-&@G$TrSTON#))N&|dpc6nJdAFiEs0CELDB~V&eT3Y%jUhmHy z8E(RMZ>j=WJw#q(Ban7in1F=Cj9?yCIuKuhi^2*RY|QuWHKK{7Vuasn4|3h^8$Hbv7!?ml>)>%rH7KPBH z?w2(D`Klxl2*0Z3qa62w=(6m)@)IHb%2f3^A2bL_z-IRgs&nw3f>p$V z2oeboJXnON9|f9g=L5*f6bN0Q+_?w5nV%XqMORLVpqi2bM4D^3;qQ$?>WP@d0wsKi zPg`krSNdV_{&1a7?EaTqh`%s$n}ubbud=+{1)wf#hj}G%5@w?kbhB%Lb&y?QOrJ$L zgLrx8@b&F3YTgm)NC0*#rkuLizHtX z5+Z*5pt1m%x#``zcRLBFg(LyNjM#w`<3MF-LMYvSr^b{X_cM&L zLyw7Ra4_8Y^Y7d520q)1-R0xI`MToy#Isxr&6L!84N5p+PkarT@Sw9+h)kM+cxt49 zOb+e{(Qart!D-O&wz!6xanU#pjC8ivAvzo?CmV>UIcN9tM-b)dRj8OkZKDsO!YVUJ zkNOP0C@;uD^Sa^p=>17z4B*7Y*mTSAfK9UToJH8+s9FkZwGys5XCz(;rW?(ggFv!= z1`z@^>m!8>@PzN+Mg&%a3lW_eNh)_X#Znloga2_Wm$tUHw8~%6)toL-+QAii3gEnB zBJtOE`rC&=jRWUc6QD#Lz{I~onw+zJyXO33jHX8EP6Ae}8XGAeV7!o_L;)~8FaliN z&hGA06%``zl->6_JFuof=)PzB){&c=3nPD&w_<*9mYsud0IJ1;;$jH{gQ@H>bddyy zmuA*vMyBQ;--np({E{)Ur_}TKfuH*^FuwFgA7@`Lf87m==lDu(6g;;>LYmRT?x`#g zThN`hHrnMr73SP-9F#;9WDS}uOlDhd9bKjb>MIvMz%r+N>z|CHCeX7oZqTvFAZ`w7 z6bXWedyg_ugMU^9XvH&NnkK$?gB_*+I0)bCmX?uY}?sdU_!V z%w`+ZWMpLf72(le%I(fr{Q5v=@!Q0f<3Sf=p$J(ve&Vd|M$ipi(W9?3k6Et0YE@EV}4QW-9pWSC8S z3I{!4A|<(+E9mIxR7UnX!~*l{14shNKtg|G_3*XOo3n#c8sCe0aKjqG{iapxBMiht zv>@X%wR^d+mwu9EM1J4|1i?DF|1)q!iD>o@47>qr35p+uyRR57u>cl2-U(iKMu4}K zD;uLYHM%#d5-F(@3L`x=xwsYsPo!Z^plpj6E%7aB2M-c@vl9%M#?bRxn8*f9#7t1p z@V~o(!1!nAwOYfDlhSK7^?>dgztcUSQ#6ZGOG&8?aJoU6;OcjGApBfh7;!V2{&A|g2}GlU z!54YH35UtpiyNs~qolfAHjvrubGFJfRb<{?14TnDOcKXy7jeHE zlXfJC)*>6E02}p#9rtPeutP2Ux(E#bHrRG$7>QbyZr{EQipc9BkW?0d(lPMXFxMmK zPrS6W#Dt|6VETW%^32+XfiZ@Tjtc?EF&CSi@mq7BR6Np!| zFq7Q4=l3n(Qz`WGFS6i32>y@~Rc2y0PHhkt-xVx?feVBpNfZ15Ez}Ft9mW7Hkh?QX zwzbK}=%`&}S^oOeow&;9{^`3Wf|8Ol1{#@aY1#r^gSYbCRM%N(?90nt+ew`fGaTq; zOX3h8O$YcyZEbBMatt`Db%(f!+}Qa_I5z-W-Ho)gG$ZG*NZph-xj01`vM3+`f#<6! z75LlM)&{$z!(_Q*a(-qei$g=mEmBA_usV9kb^lAN$9ITonuNuV9X8=js5|zrH9a$3 zTKts(`-c5lmhoiqo1p<>MEh*N2BaQc)cmg!yJ0)J0CN*hW=YmgyeT7g;9oIOQBh<% z3gV`k)5#^^B@IWR5|w5AJR@Ir_{!C_5y}h1%#~nS1r4y0V6O9)aL%})!X4hU%PU}5 z?*m>M`1^)du%Zses=SUR?6ZLkqi=3o6D&yRx98_+CVpa6Ia z)b(B{r!H0HS6BO%*NN%OLZD9yoJh;hP2TG~fVsB;eimqWXyD9P!C6KE!7fi!xQ(c#ROW3oEPqv>2W|;* z;JojMVtr%73enCK?}1Kp#QtlQSNbb_Ld(nN3+)bB9~O?2r%NYR##)0 zxmRwjEC(&&+tAYKhpNh4cd)am*>Op$rfb+e@!FGZUy8?wZGUqy3&~UUlk1k&okGc445vo2 zY>yB*IOUr{=_qIe17Box0la(2t7ZksqCt%@=u9EY99$cwr(N_SB_$zwn*1y{4@a2D zr2C3oAK;wvwd1})w;}#l%0gr4fj>aNuo3Fm#-tZK@z7HI*>9@r zzzdR*0EfGM3fePge2jlTRh-pDe5r(hm5fXwngb+{F1$hy=zdi_s7PmlQR+JEB{xBX z_dYq90b+U4LCv}2Aq1$_87SiI;1OMj_R*qIkAF_-_kO9@?}xvS9Y)k<>`Vidd@Z$N zu%03q&6pjpF7D{-P3%)P9niA%yJQ`=y5d$*Y_4-#wdF6WQf}%F{4V*5Tdxup{AkZ{ z=|E0jUS;k^9wuFL@JFN0$pT}EerT$?#sU#+6&MPzS}W`6;c04Wf&_$0)Q1ZBA(&|& zG5gs%2*sc*Hs{6_$}1A z*IbmDqel`EtGl&51M7!|gyI*_5~+kK<)}6EFdnTBWG1sQGbd7f2J%zeMG-L zR`8oJY2N)_J(eoR+oEzp

%`*qV7s!p#G7t<%-jRbJQ@?=7)%?MGF#wYENm!!Wz= z_JL7=hD){1^9!pHo%C|DaC;#r2YHy zt27RJ;ifR_#Q*o$@C_(B$e%c+zjOK69IKbFU!PecaHpx9 z0#wfY2D!h9kw3_DjFJx{w(zebO@LULeWG30-Qle)UhBTBb&~VzmqgfjQ7Xqs%PsYJwoE2 zfZOi@D}CCoCAvp~_)HO3v6N)T7eV5Yd!z<-)>kCX&=G6{4E(P3ZhL z4$OWCxiK?6+-f9=QoJ0UR`0t0&MhinrENQoLyDkBB*6Zg7YA~WAP6h8hsJt4Mx<;B zP8}0Ma(m>_jBn;>;jL$)+f8-`kK^)%%O_;`e2Ft6+ForcYkkBrytBD=9{-M;KFd(6QK_^ z?Mu`ZjaDD?@xv4HgkyqVtI!l48yq|=0v}07+Y#J%x1n3dhIBz~t*nfsv96-en3