Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorMiika Hamalainen <blender@miikah.org>2011-11-05 12:04:49 +0400
committerMiika Hamalainen <blender@miikah.org>2011-11-05 12:04:49 +0400
commit2ed6f077b3952123d56916980d18a379ecb3e5ac (patch)
tree1aa273e5566c95214739fb224d4c6cf115417882 /source
parentb9c83456b27da57a14bcf8d274b460e670d49990 (diff)
parent62f22185546e80b661424b45c88006f8b592d8b1 (diff)
Merge with trunk r41545
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenfont/intern/blf_font.c35
-rw-r--r--source/blender/blenfont/intern/blf_lang.c2
-rw-r--r--source/blender/blenkernel/BKE_blender.h2
-rw-r--r--source/blender/blenkernel/BKE_context.h18
-rw-r--r--source/blender/blenkernel/BKE_curve.h1
-rw-r--r--source/blender/blenkernel/BKE_deform.h3
-rw-r--r--source/blender/blenkernel/BKE_depsgraph.h9
-rw-r--r--source/blender/blenkernel/BKE_global.h2
-rw-r--r--source/blender/blenkernel/BKE_library.h1
-rw-r--r--source/blender/blenkernel/BKE_node.h8
-rw-r--r--source/blender/blenkernel/BKE_object.h5
-rw-r--r--source/blender/blenkernel/BKE_scene.h4
-rw-r--r--source/blender/blenkernel/BKE_screen.h20
-rw-r--r--source/blender/blenkernel/BKE_sequencer.h22
-rw-r--r--source/blender/blenkernel/intern/action.c5
-rw-r--r--source/blender/blenkernel/intern/anim.c3
-rw-r--r--source/blender/blenkernel/intern/anim_sys.c18
-rw-r--r--source/blender/blenkernel/intern/armature.c3
-rw-r--r--source/blender/blenkernel/intern/blender.c2
-rw-r--r--source/blender/blenkernel/intern/brush.c3
-rw-r--r--source/blender/blenkernel/intern/constraint.c10
-rw-r--r--source/blender/blenkernel/intern/curve.c34
-rw-r--r--source/blender/blenkernel/intern/deform.c42
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c154
-rw-r--r--source/blender/blenkernel/intern/image.c3
-rw-r--r--source/blender/blenkernel/intern/ipo.c9
-rw-r--r--source/blender/blenkernel/intern/key.c2
-rw-r--r--source/blender/blenkernel/intern/lattice.c3
-rw-r--r--source/blender/blenkernel/intern/library.c19
-rw-r--r--source/blender/blenkernel/intern/material.c3
-rw-r--r--source/blender/blenkernel/intern/mball.c3
-rw-r--r--source/blender/blenkernel/intern/mesh.c3
-rw-r--r--source/blender/blenkernel/intern/node.c9
-rw-r--r--source/blender/blenkernel/intern/object.c134
-rw-r--r--source/blender/blenkernel/intern/particle.c3
-rw-r--r--source/blender/blenkernel/intern/scene.c44
-rw-r--r--source/blender/blenkernel/intern/screen.c23
-rw-r--r--source/blender/blenkernel/intern/smoke.c7
-rw-r--r--source/blender/blenkernel/intern/speaker.c3
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c3
-rw-r--r--source/blender/blenkernel/intern/texture.c3
-rw-r--r--source/blender/blenkernel/intern/world.c23
-rw-r--r--source/blender/blenlib/BLI_bpath.h10
-rw-r--r--source/blender/blenlib/BLI_callbacks.h2
-rw-r--r--source/blender/blenlib/BLI_math_rotation.h4
-rw-r--r--source/blender/blenlib/BLI_threads.h1
-rw-r--r--source/blender/blenlib/CMakeLists.txt4
-rw-r--r--source/blender/blenlib/intern/bpath.c5
-rw-r--r--source/blender/blenlib/intern/math_rotation.c8
-rw-r--r--source/blender/blenlib/intern/path_util.c61
-rw-r--r--source/blender/blenlib/intern/pbvh.c2
-rw-r--r--source/blender/blenlib/intern/threads.c5
-rw-r--r--source/blender/blenlib/intern/uvproject.c2
-rw-r--r--source/blender/blenloader/BLO_readfile.h1
-rw-r--r--source/blender/blenloader/intern/readfile.c175
-rw-r--r--source/blender/blenloader/intern/writefile.c19
-rw-r--r--source/blender/collada/CameraExporter.cpp2
-rw-r--r--source/blender/collada/DocumentImporter.cpp6
-rw-r--r--source/blender/editors/CMakeLists.txt1
-rw-r--r--source/blender/editors/SConscript1
-rw-r--r--source/blender/editors/animation/anim_markers.c6
-rw-r--r--source/blender/editors/curve/curve_ops.c1
-rw-r--r--source/blender/editors/curve/editcurve.c7
-rw-r--r--source/blender/editors/include/ED_mesh.h2
-rw-r--r--source/blender/editors/include/ED_node.h2
-rw-r--r--source/blender/editors/include/ED_render.h4
-rw-r--r--source/blender/editors/include/ED_screen.h1
-rw-r--r--source/blender/editors/include/ED_space_api.h1
-rw-r--r--source/blender/editors/include/ED_view3d.h4
-rw-r--r--source/blender/editors/interface/interface.c11
-rw-r--r--source/blender/editors/interface/interface_handlers.c138
-rw-r--r--source/blender/editors/interface/interface_ops.c26
-rw-r--r--source/blender/editors/interface/resources.c41
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c57
-rw-r--r--source/blender/editors/object/object_add.c1
-rw-r--r--source/blender/editors/object/object_bake.c21
-rw-r--r--source/blender/editors/object/object_edit.c4
-rw-r--r--source/blender/editors/object/object_transform.c2
-rw-r--r--source/blender/editors/object/object_vgroup.c136
-rw-r--r--source/blender/editors/render/render_internal.c19
-rw-r--r--source/blender/editors/render/render_preview.c24
-rw-r--r--source/blender/editors/render/render_shading.c26
-rw-r--r--source/blender/editors/render/render_update.c105
-rw-r--r--source/blender/editors/render/render_view.c19
-rw-r--r--source/blender/editors/screen/area.c22
-rw-r--r--source/blender/editors/screen/screen_ops.c13
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c6
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c102
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c89
-rw-r--r--source/blender/editors/space_api/spacetypes.c1
-rw-r--r--source/blender/editors/space_graph/graph_draw.c10
-rw-r--r--source/blender/editors/space_graph/graph_intern.h4
-rw-r--r--source/blender/editors/space_image/image_intern.h3
-rw-r--r--source/blender/editors/space_image/image_ops.c14
-rw-r--r--source/blender/editors/space_nla/nla_intern.h5
-rw-r--r--source/blender/editors/space_node/drawnode.c7
-rw-r--r--source/blender/editors/space_node/node_draw.c10
-rw-r--r--source/blender/editors/space_node/node_edit.c93
-rw-r--r--source/blender/editors/space_node/node_header.c27
-rw-r--r--source/blender/editors/space_node/space_node.c26
-rw-r--r--source/blender/editors/space_outliner/outliner_intern.h3
-rw-r--r--source/blender/editors/space_outliner/outliner_tree.c6
-rw-r--r--source/blender/editors/space_script/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_script/script_header.c120
-rw-r--r--source/blender/editors/space_script/script_intern.h4
-rw-r--r--source/blender/editors/space_sound/CMakeLists.txt43
-rw-r--r--source/blender/editors/space_sound/SConscript9
-rw-r--r--source/blender/editors/space_sound/sound_header.c127
-rw-r--r--source/blender/editors/space_sound/sound_intern.h42
-rw-r--r--source/blender/editors/space_sound/space_sound.c266
-rw-r--r--source/blender/editors/space_time/time_intern.h3
-rw-r--r--source/blender/editors/space_view3d/drawobject.c44
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c8
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c22
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c145
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c9
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c3
-rw-r--r--source/blender/editors/space_view3d/view3d_intern.h2
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c65
-rw-r--r--source/blender/editors/transform/transform.c63
-rw-r--r--source/blender/editors/transform/transform_ops.c2
-rw-r--r--source/blender/gpu/GPU_buffers.h13
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c16
-rw-r--r--source/blender/imbuf/intern/moviecache.c4
-rw-r--r--source/blender/makesdna/DNA_ID.h1
-rw-r--r--source/blender/makesdna/DNA_camera_types.h12
-rw-r--r--source/blender/makesdna/DNA_lamp_types.h12
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h8
-rw-r--r--source/blender/makesdna/DNA_object_types.h92
-rw-r--r--source/blender/makesdna/DNA_space_types.h90
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h12
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h6
-rw-r--r--source/blender/makesdna/DNA_world_types.h10
-rw-r--r--source/blender/makesrna/RNA_access.h55
-rw-r--r--source/blender/makesrna/intern/makesrna.c41
-rw-r--r--source/blender/makesrna/intern/rna_ID.c10
-rw-r--r--source/blender/makesrna/intern/rna_access.c44
-rw-r--r--source/blender/makesrna/intern/rna_actuator.c13
-rw-r--r--source/blender/makesrna/intern/rna_camera.c122
-rw-r--r--source/blender/makesrna/intern/rna_color.c25
-rw-r--r--source/blender/makesrna/intern/rna_controller.c13
-rw-r--r--source/blender/makesrna/intern/rna_curve.c22
-rw-r--r--source/blender/makesrna/intern/rna_lamp.c21
-rw-r--r--source/blender/makesrna/intern/rna_main.c2
-rw-r--r--source/blender/makesrna/intern/rna_main_api.c158
-rw-r--r--source/blender/makesrna/intern/rna_material.c11
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c7
-rw-r--r--source/blender/makesrna/intern/rna_object.c18
-rw-r--r--source/blender/makesrna/intern/rna_render.c122
-rw-r--r--source/blender/makesrna/intern/rna_scene.c21
-rw-r--r--source/blender/makesrna/intern/rna_scene_api.c1
-rw-r--r--source/blender/makesrna/intern/rna_sensor.c13
-rw-r--r--source/blender/makesrna/intern/rna_space.c70
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c34
-rw-r--r--source/blender/makesrna/intern/rna_world.c36
-rw-r--r--source/blender/modifiers/intern/MOD_solidify.c1
-rw-r--r--source/blender/modifiers/intern/MOD_uvproject.c21
-rw-r--r--source/blender/nodes/composite/node_composite_util.c36
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_alphaOver.c4
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_bilateralblur.c60
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_blur.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_brightness.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_channelMatte.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_chromaMatte.c4
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_colorMatte.c4
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_colorSpill.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_colorbalance.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_crop.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_curves.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_defocus.c4
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_diffMatte.c4
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_directionalblur.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_displace.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_distanceMatte.c4
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_filter.c4
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_flip.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_gamma.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_glare.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_hueSatVal.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_huecorrect.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_idMask.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_invert.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_lensdist.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_lummaMatte.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_mapUV.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_mapValue.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_normalize.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_premulkey.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_rgb.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_rotate.c3
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_scale.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_tonemap.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_translate.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_vecBlur.c2
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_zcombine.c8
-rw-r--r--source/blender/nodes/intern/node_common.c1
-rw-r--r--source/blender/nodes/shader/node_shader_tree.c30
-rw-r--r--source/blender/nodes/shader/node_shader_util.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_camera.c1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_curves.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_dynamic.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_geom.c1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_hueSatVal.c1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_invert.c1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_mapping.c1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_material.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_math.c1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_mixRgb.c1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_normal.c1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_output.c1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_rgb.c1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_squeeze.c1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_texture.c1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_valToRgb.c2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_value.c1
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_vectMath.c1
-rw-r--r--source/blender/nodes/texture/node_texture_tree.c11
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_scale.c2
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_texture.c10
-rw-r--r--source/blender/python/BPY_extern.h2
-rw-r--r--source/blender/python/generic/IDProp.c39
-rw-r--r--source/blender/python/generic/IDProp.h2
-rw-r--r--source/blender/python/generic/bgl.c47
-rw-r--r--source/blender/python/generic/bgl.h15
-rw-r--r--source/blender/python/generic/bpy_internal_import.c80
-rw-r--r--source/blender/python/generic/py_capi_utils.c2
-rw-r--r--source/blender/python/intern/bpy_app_handlers.c165
-rw-r--r--source/blender/python/intern/bpy_operator.c4
-rw-r--r--source/blender/python/intern/bpy_props.c96
-rw-r--r--source/blender/python/intern/bpy_rna.c32
-rw-r--r--source/blender/python/mathutils/mathutils.c4
-rw-r--r--source/blender/python/mathutils/mathutils.h4
-rw-r--r--source/blender/python/mathutils/mathutils_Color.c4
-rw-r--r--source/blender/python/mathutils/mathutils_Color.h4
-rw-r--r--source/blender/python/mathutils/mathutils_Euler.c4
-rw-r--r--source/blender/python/mathutils/mathutils_Euler.h4
-rw-r--r--source/blender/python/mathutils/mathutils_Matrix.c4
-rw-r--r--source/blender/python/mathutils/mathutils_Matrix.h4
-rw-r--r--source/blender/python/mathutils/mathutils_Quaternion.c98
-rw-r--r--source/blender/python/mathutils/mathutils_Quaternion.h4
-rw-r--r--source/blender/python/mathutils/mathutils_Vector.c4
-rw-r--r--source/blender/python/mathutils/mathutils_Vector.h4
-rw-r--r--source/blender/python/mathutils/mathutils_geometry.c4
-rw-r--r--source/blender/python/mathutils/mathutils_geometry.h4
-rw-r--r--source/blender/python/simple_enum_gen.py6
-rw-r--r--source/blender/quicktime/apple/qtkit_import.m2
-rw-r--r--source/blender/render/extern/include/RE_engine.h16
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h2
-rw-r--r--source/blender/render/intern/include/render_types.h3
-rw-r--r--source/blender/render/intern/include/texture.h33
-rw-r--r--source/blender/render/intern/source/convertblender.c2
-rw-r--r--source/blender/render/intern/source/envmap.c1
-rw-r--r--source/blender/render/intern/source/external_engine.c39
-rw-r--r--source/blender/render/intern/source/initrender.c4
-rw-r--r--source/blender/render/intern/source/pipeline.c18
-rw-r--r--source/blender/render/intern/source/shadbuf.c8
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c41
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c8
-rw-r--r--source/blender/windowmanager/intern/wm_files.c12
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c27
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c23
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c3
-rw-r--r--source/creator/creator.c39
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.cpp5
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp6
-rw-r--r--source/gameengine/Expressions/ListValue.cpp7
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.cpp12
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.h41
-rw-r--r--source/gameengine/Expressions/StringValue.h5
-rw-r--r--source/gameengine/GameLogic/SCA_PythonController.cpp13
-rw-r--r--source/gameengine/Ketsji/KX_Camera.cpp23
-rw-r--r--source/gameengine/Ketsji/KX_Camera.h6
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.h3
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PythonSeq.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PythonSeq.h4
-rw-r--r--source/gameengine/Rasterizer/RAS_CameraData.h9
-rw-r--r--source/gameengine/Rasterizer/RAS_FramingManager.cpp59
-rw-r--r--source/gameengine/Rasterizer/RAS_FramingManager.h13
-rw-r--r--source/gameengine/VideoTexture/BlendType.h6
-rw-r--r--source/gameengine/VideoTexture/FilterBase.cpp2
-rw-r--r--source/gameengine/VideoTexture/ImageBase.cpp4
-rw-r--r--source/gameengine/VideoTexture/ImageRender.cpp6
-rw-r--r--source/gameengine/VideoTexture/Texture.cpp4
-rw-r--r--source/gameengine/VideoTexture/blendVideoTex.cpp2
291 files changed, 3417 insertions, 2269 deletions
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index bebc87cc5d4..7ec7e2357dd 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -122,36 +122,37 @@ static void blf_font_ensure_ascii_table(FontBLF *font)
/* Note,
* blf_font_ensure_ascii_table(font); must be called before this macro */
-#define BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table) \
- if(((c)= (str)[i]) < 0x80) { \
- g= (glyph_ascii_table)[c]; \
- i++; \
+#define BLF_UTF8_NEXT_FAST(_font, _g, _str, _i, _c, _glyph_ascii_table) \
+ if(((_c)= (_str)[_i]) < 0x80) { \
+ _g= (_glyph_ascii_table)[_c]; \
+ _i++; \
} \
- else if ((c= BLI_str_utf8_as_unicode_step((str), &(i))) != BLI_UTF8_ERR) { \
- if ((g= blf_glyph_search((font)->glyph_cache, c)) == NULL) { \
- g= blf_glyph_add(font, FT_Get_Char_Index((font)->face, c), c); \
+ else if ((_c= BLI_str_utf8_as_unicode_step(_str, &(_i)))!=BLI_UTF8_ERR) { \
+ if ((_g= blf_glyph_search((_font)->glyph_cache, _c)) == NULL) { \
+ _g= blf_glyph_add(_font, \
+ FT_Get_Char_Index((_font)->face, _c), _c); \
} \
} \
#define BLF_KERNING_VARS(_font, _has_kerning, _kern_mode) \
- const short has_kerning= FT_HAS_KERNING((_font)->face); \
- const FT_UInt kern_mode= (has_kerning == 0) ? 0 : \
+ const short _has_kerning= FT_HAS_KERNING((_font)->face); \
+ const FT_UInt _kern_mode= (_has_kerning == 0) ? 0 : \
(((_font)->flags & BLF_KERNING_DEFAULT) ? \
ft_kerning_default : FT_KERNING_UNFITTED) \
-#define BLF_KERNING_STEP(_font, kern_mode, g_prev, g, delta, pen_x) \
+#define BLF_KERNING_STEP(_font, _kern_mode, _g_prev, _g, _delta, _pen_x) \
{ \
- if (g_prev) { \
- delta.x= delta.y= 0; \
+ if (_g_prev) { \
+ _delta.x= _delta.y= 0; \
if (FT_Get_Kerning((_font)->face, \
- (g_prev)->idx, \
- (g)->idx, \
- kern_mode, \
- &(delta)) == 0) \
+ (_g_prev)->idx, \
+ (_g)->idx, \
+ _kern_mode, \
+ &(_delta)) == 0) \
{ \
- pen_x += delta.x >> 6; \
+ _pen_x += delta.x >> 6; \
} \
} \
} \
diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c
index 9548febab27..3bce3878d72 100644
--- a/source/blender/blenfont/intern/blf_lang.c
+++ b/source/blender/blenfont/intern/blf_lang.c
@@ -120,7 +120,7 @@ void BLF_lang_set(const char *str)
const char *short_locale;
int ok= 1;
#if defined (_WIN32) && !defined(FREE_WINDOWS)
- char *long_locale = locales[ 2 * U.language];
+ const char *long_locale = locales[ 2 * U.language];
#endif
if((U.transopts&USER_DOTRANSLATE)==0)
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 71771b6077d..9b28f083a24 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -42,7 +42,7 @@ extern "C" {
* and keep comment above the defines.
* Use STRINGIFY() rather than defining with quotes */
#define BLENDER_VERSION 260
-#define BLENDER_SUBVERSION 0
+#define BLENDER_SUBVERSION 1
#define BLENDER_MINVERSION 250
#define BLENDER_MINSUBVERSION 0
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index 3f9edf41e3c..c065a210a98 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -203,17 +203,17 @@ int CTX_data_dir(const char *member);
/*void CTX_data_pointer_set(bContextDataResult *result, void *data);
void CTX_data_list_add(bContextDataResult *result, void *data);*/
-#define CTX_DATA_BEGIN(C, Type, instance, member) \
- { \
- ListBase ctx_data_list; \
- CollectionPointerLink *ctx_link; \
- CTX_data_##member(C, &ctx_data_list); \
- for(ctx_link=ctx_data_list.first; ctx_link; ctx_link=ctx_link->next) { \
+#define CTX_DATA_BEGIN(C, Type, instance, member) \
+ { \
+ ListBase ctx_data_list; \
+ CollectionPointerLink *ctx_link; \
+ CTX_data_##member(C, &ctx_data_list); \
+ for(ctx_link=ctx_data_list.first; ctx_link; ctx_link=ctx_link->next) {\
Type instance= ctx_link->ptr.data;
-#define CTX_DATA_END \
- } \
- BLI_freelistN(&ctx_data_list); \
+#define CTX_DATA_END \
+ } \
+ BLI_freelistN(&ctx_data_list); \
}
int ctx_data_list_count(const bContext *C, int (*func)(const bContext*, ListBase*));
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index 9282f0ef29a..f0704741ebb 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -65,6 +65,7 @@ void make_local_curve( struct Curve *cu);
struct ListBase *curve_editnurbs(struct Curve *cu);
short curve_type( struct Curve *cu);
void test_curve_type( struct Object *ob);
+void update_curve_dimension( struct Curve *cu );
void tex_space_curve( struct Curve *cu);
int count_curveverts( struct ListBase *nurb);
int count_curveverts_without_handles( struct ListBase *nurb);
diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h
index 84a6517fd52..3e643fe961c 100644
--- a/source/blender/blenkernel/BKE_deform.h
+++ b/source/blender/blenkernel/BKE_deform.h
@@ -45,6 +45,7 @@ struct bDeformGroup *defgroup_duplicate(struct bDeformGroup *ingroup);
struct bDeformGroup *defgroup_find_name(struct Object *ob, const char *name);
int defgroup_find_index(struct Object *ob, struct bDeformGroup *dg);
int *defgroup_flip_map(struct Object *ob, int *flip_map_len, int use_default);
+int *defgroup_flip_map_single(struct Object *ob, int *flip_map_len, int use_default, int defgroup);
int defgroup_flip_index(struct Object *ob, int index, int use_default);
int defgroup_name_index(struct Object *ob, const char *name);
void defgroup_unique_name(struct bDeformGroup *dg, struct Object *ob);
@@ -57,7 +58,7 @@ float defvert_array_find_weight_safe(const struct MDeformVert *dvert, int index
void defvert_copy(struct MDeformVert *dvert_r, const struct MDeformVert *dvert);
void defvert_sync(struct MDeformVert *dvert_r, const struct MDeformVert *dvert, int use_verify);
-void defvert_sync_mapped(struct MDeformVert *dvert_r, const struct MDeformVert *dvert, const int *flip_map, const int flip_map_len, int use_verify);
+void defvert_sync_mapped(struct MDeformVert *dvert_r, const struct MDeformVert *dvert, const int *flip_map, const int flip_map_len, const int use_verify);
void defvert_remap (struct MDeformVert *dvert, int *map);
void defvert_flip(struct MDeformVert *dvert, const int *flip_map, const int flip_map_len);
void defvert_normalize(struct MDeformVert *dvert);
diff --git a/source/blender/blenkernel/BKE_depsgraph.h b/source/blender/blenkernel/BKE_depsgraph.h
index 59b7712a5a4..e0b8e40d731 100644
--- a/source/blender/blenkernel/BKE_depsgraph.h
+++ b/source/blender/blenkernel/BKE_depsgraph.h
@@ -120,6 +120,12 @@ void DAG_ids_flush_update(struct Main *bmain, int time);
void DAG_id_tag_update(struct ID *id, short flag);
/* flush all tagged updates */
void DAG_ids_flush_tagged(struct Main *bmain);
+ /* check and clear ID recalc flags */
+void DAG_ids_check_recalc(struct Main *bmain);
+void DAG_ids_clear_recalc(struct Main *bmain);
+ /* test if any of this id type is tagged for update */
+void DAG_id_type_tag(struct Main *bmain, short idtype);
+int DAG_id_type_tagged(struct Main *bmain, short idtype);
/* (re)-create dependency graph for armature pose */
void DAG_pose_sort(struct Object *ob);
@@ -127,6 +133,9 @@ void DAG_pose_sort(struct Object *ob);
/* callback for editors module to do updates */
void DAG_editors_update_cb(void (*func)(struct Main *bmain, struct ID *id));
+ /* debugging */
+void DAG_print_dependencies(struct Main *bmain, struct Scene *scene, struct Object *ob);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index bc9134b40b8..5ccdd7c04af 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -58,7 +58,7 @@ typedef struct Global {
/* flag: if != 0 G.main->name contains valid relative base path */
int relbase_valid;
- /* strings of recent opend files */
+ /* strings of recent opened files */
struct ListBase recent_files;
short afbreek, moving, file_loaded;
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index e2033915caa..9130cac6cd6 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -49,6 +49,7 @@ void *alloc_libblock(struct ListBase *lb, short type, const char *name);
void *copy_libblock(void *rt);
void copy_libblock_data(struct ID *id, const struct ID *id_from, const short do_action);
+void BKE_id_lib_local_paths(struct Main *bmain, struct ID *id);
void id_lib_extern(struct ID *id);
void BKE_library_filepath_set(struct Library *lib, const char *filepath);
void id_us_plus(struct ID *id);
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index a819a464d3f..7509205e968 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -130,7 +130,7 @@ typedef struct bNodeType {
char name[32];
float width, minwidth, maxwidth;
float height, minheight, maxheight;
- short nclass, flag;
+ short nclass, flag, compatibility;
/* templates for static sockets */
bNodeSocketTemplate *inputs, *outputs;
@@ -230,8 +230,13 @@ typedef struct bNodeType {
#define NODE_CLASS_PARTICLES 25
#define NODE_CLASS_TRANSFORM 30
#define NODE_CLASS_COMBINE 31
+#define NODE_CLASS_SHADER 40
#define NODE_CLASS_LAYOUT 100
+/* nodetype->compatibility */
+#define NODE_OLD_SHADING 1
+#define NODE_NEW_SHADING 2
+
/* enum values for input/output */
#define SOCK_IN 1
#define SOCK_OUT 2
@@ -388,6 +393,7 @@ void node_type_exec_new(struct bNodeType *ntype,
void (*newexecfunc)(void *data, int thread, struct bNode *, void *nodedata, struct bNodeStack **, struct bNodeStack **));
void node_type_gpu(struct bNodeType *ntype, int (*gpufunc)(struct GPUMaterial *mat, struct bNode *node, struct GPUNodeStack *in, struct GPUNodeStack *out));
void node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMaterial *mat, struct bNode *node, void *nodedata, struct GPUNodeStack *in, struct GPUNodeStack *out));
+void node_type_compatibility(struct bNodeType *ntype, short compatibility);
/* ************** COMMON NODES *************** */
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 393568c6b60..c5a24c1e5e9 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -139,9 +139,12 @@ struct KeyBlock *object_insert_shape_key(struct Scene *scene, struct Object *ob,
int object_is_modified(struct Scene *scene, struct Object *ob);
void object_camera_mode(struct RenderData *rd, struct Object *camera);
+void object_camera_intrinsics(struct Object *camera, struct Camera **cam_r, short *is_ortho, float *shiftx, float *shifty,
+ float *clipsta, float *clipend, float *lens, float *sensor_x, float *sensor_y, short *sensor_fit);
void object_camera_matrix(
struct RenderData *rd, struct Object *camera, int winx, int winy, short field_second,
- float winmat[][4], struct rctf *viewplane, float *clipsta, float *clipend, float *lens, float *ycor,
+ float winmat[][4], struct rctf *viewplane, float *clipsta, float *clipend, float *lens,
+ float *sensor_x, float *sensor_y, short *sensor_fit, float *ycor,
float *viewdx, float *viewdy);
void camera_view_frame_ex(struct Scene *scene, struct Camera *camera, float drawsize, const short do_clip, const float scale[3],
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 5c214b2892a..4806a288cee 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -88,6 +88,8 @@ int scene_check_setscene(struct Main *bmain, struct Scene *sce);
float BKE_curframe(struct Scene *scene);
void scene_update_tagged(struct Main *bmain, struct Scene *sce);
+void scene_clear_tagged(struct Main *bmain, struct Scene *sce);
+
void scene_update_for_newframe(struct Main *bmain, struct Scene *sce, unsigned int lay);
void scene_add_render_layer(struct Scene *sce);
@@ -98,6 +100,8 @@ int get_render_child_particle_number(struct RenderData *r, int num);
int get_render_shadow_samples(struct RenderData *r, int samples);
float get_render_aosss_error(struct RenderData *r, float error);
+int scene_use_new_shading_nodes(struct Scene *scene);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 5b6d7e3cd96..77a351d534e 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -34,22 +34,23 @@
*/
struct ARegion;
-struct bContext;
-struct bContextDataResult;
-struct bScreen;
-struct ListBase;
-struct Panel;
struct Header;
+struct ListBase;
struct Menu;
+struct Panel;
+struct Scene;
struct ScrArea;
struct SpaceType;
-struct Scene;
+struct View3D;
+struct bContext;
+struct bContextDataResult;
+struct bScreen;
+struct uiLayout;
+struct uiMenuItem;
+struct wmKeyConfig;
struct wmNotifier;
struct wmWindow;
struct wmWindowManager;
-struct wmKeyConfig;
-struct uiLayout;
-struct uiMenuItem;
#include "RNA_types.h"
@@ -239,6 +240,7 @@ void BKE_area_region_free(struct SpaceType *st, struct ARegion *ar);
void BKE_screen_area_free(struct ScrArea *sa);
struct ARegion *BKE_area_find_region_type(struct ScrArea *sa, int type);
+struct ScrArea *BKE_screen_find_big_area(struct bScreen *sc, const int spacetype, const short min);
void BKE_screen_view3d_sync(struct View3D *v3d, struct Scene *scene);
void BKE_screen_view3d_scene_sync(struct bScreen *sc);
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index e64de965db5..917b62c27cf 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -67,21 +67,21 @@ void seq_next(SeqIterator *iter);
void seq_end(SeqIterator *iter);
void seq_array(struct Editing *ed, struct Sequence ***seqarray, int *tot, int use_pointer);
-#define SEQP_BEGIN(ed, _seq) \
-{ \
- SeqIterator iter;\
- for(seq_begin(ed, &iter, 1); iter.valid; seq_next(&iter)) { \
+#define SEQP_BEGIN(ed, _seq) \
+{ \
+ SeqIterator iter; \
+ for(seq_begin(ed, &iter, 1); iter.valid; seq_next(&iter)) { \
_seq= iter.seq;
-#define SEQ_BEGIN(ed, _seq) \
- { \
- SeqIterator iter;\
- for(seq_begin(ed, &iter, 0); iter.valid; seq_next(&iter)) { \
+#define SEQ_BEGIN(ed, _seq) \
+ { \
+ SeqIterator iter; \
+ for(seq_begin(ed, &iter, 0); iter.valid; seq_next(&iter)) { \
_seq= iter.seq;
-#define SEQ_END \
- } \
- seq_end(&iter); \
+#define SEQ_END \
+ } \
+ seq_end(&iter); \
}
typedef struct SeqRenderData {
diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c
index 2a1794fe2fc..944f7c6a0b6 100644
--- a/source/blender/blenkernel/intern/action.c
+++ b/source/blender/blenkernel/intern/action.c
@@ -146,13 +146,10 @@ void make_local_action(bAction *act)
id_clear_lib_data(bmain, &act->id);
}
else if (mlac.is_local && mlac.is_lib) {
- char *bpath_user_data[2]= {bmain->name, act->id.lib->filepath};
-
mlac.actn= copy_action(act);
mlac.actn->id.us= 0;
- /* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &mlac.actn->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &mlac.actn->id);
BKE_animdata_main_cb(bmain, make_localact_apply_cb, &mlac);
}
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index 2ef13318af4..f939c168f51 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -753,6 +753,7 @@ static void frames_duplilist(ListBase *lb, Scene *scene, Object *ob, int level,
extern int enable_cu_speed; /* object.c */
Object copyob = {{NULL}};
int cfrao = scene->r.cfra;
+ int dupend = ob->dupend;
/* simple prevention of too deep nested groups */
if (level > MAX_DUPLI_RECUR) return;
@@ -773,7 +774,7 @@ static void frames_duplilist(ListBase *lb, Scene *scene, Object *ob, int level,
/* duplicate over the required range */
if (ob->transflag & OB_DUPLINOSPEED) enable_cu_speed= 0;
- for (scene->r.cfra= ob->dupsta; scene->r.cfra<=ob->dupend; scene->r.cfra++) {
+ for (scene->r.cfra= ob->dupsta; scene->r.cfra<=dupend; scene->r.cfra++) {
short ok= 1;
/* - dupoff = how often a frames within the range shouldn't be made into duplis
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c
index 13abf18e20c..6d94b42a7ac 100644
--- a/source/blender/blenkernel/intern/anim_sys.c
+++ b/source/blender/blenkernel/intern/anim_sys.c
@@ -43,12 +43,15 @@
#include "BLI_utildefines.h"
#include "DNA_anim_types.h"
+#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
+#include "DNA_world_types.h"
#include "BKE_animsys.h"
#include "BKE_action.h"
+#include "BKE_depsgraph.h"
#include "BKE_fcurve.h"
#include "BKE_nla.h"
#include "BKE_global.h"
@@ -1179,6 +1182,15 @@ static short animsys_write_rna_setting (PointerRNA *ptr, char *path, int array_i
RNA_property_update_cache_add(&new_ptr, prop);
}
#endif
+
+ /* as long as we don't do property update, we still tag datablock
+ as having been updated. this flag does not cause any updates to
+ be run, it's for e.g. render engines to synchronize data */
+ if(new_ptr.id.data) {
+ ID *id= new_ptr.id.data;
+ id->flag |= LIB_ID_RECALC;
+ DAG_id_type_tag(G.main, GS(id->name));
+ }
}
/* successful */
@@ -2291,7 +2303,7 @@ void BKE_animsys_evaluate_all_animation (Main *main, Scene *scene, float ctime)
EVAL_ANIM_NODETREE_IDS(main->tex.first, Tex, ADT_RECALC_ANIM);
/* lamps */
- EVAL_ANIM_IDS(main->lamp.first, ADT_RECALC_ANIM);
+ EVAL_ANIM_NODETREE_IDS(main->lamp.first, Lamp, ADT_RECALC_ANIM);
/* materials */
EVAL_ANIM_NODETREE_IDS(main->mat.first, Material, ADT_RECALC_ANIM);
@@ -2320,7 +2332,7 @@ void BKE_animsys_evaluate_all_animation (Main *main, Scene *scene, float ctime)
/* particles */
EVAL_ANIM_IDS(main->particle.first, ADT_RECALC_ANIM);
- /* lamps */
+ /* speakers */
EVAL_ANIM_IDS(main->speaker.first, ADT_RECALC_ANIM);
/* objects */
@@ -2331,7 +2343,7 @@ void BKE_animsys_evaluate_all_animation (Main *main, Scene *scene, float ctime)
EVAL_ANIM_IDS(main->object.first, 0);
/* worlds */
- EVAL_ANIM_IDS(main->world.first, ADT_RECALC_ANIM);
+ EVAL_ANIM_NODETREE_IDS(main->world.first, World, ADT_RECALC_ANIM);
/* scenes */
EVAL_ANIM_NODETREE_IDS(main->scene.first, Scene, ADT_RECALC_ANIM);
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 9fba18dd7cf..e9a19b50a81 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -157,12 +157,11 @@ void make_local_armature(bArmature *arm)
id_clear_lib_data(bmain, &arm->id);
}
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, arm->id.lib->filepath};
bArmature *armn= copy_armature(arm);
armn->id.us= 0;
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &armn->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &armn->id);
for(ob= bmain->object.first; ob; ob= ob->id.next) {
if(ob->data == arm) {
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index 6e343e874f1..d68b0b361d1 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -172,7 +172,7 @@ static void clean_paths(Main *main)
{
Scene *scene;
- bpath_traverse_main(main, clean_paths_visit_cb, 0, NULL);
+ bpath_traverse_main(main, clean_paths_visit_cb, BPATH_TRAVERSE_SKIP_MULTIFILE, NULL);
for(scene= main->scene.first; scene; scene= scene->id.next) {
BLI_clean(scene->r.pic);
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index 10f056e9b78..e78b89441c9 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -224,13 +224,12 @@ void make_local_brush(Brush *brush)
}
}
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, brush->id.lib->filepath};
Brush *brushn= copy_brush(brush);
brushn->id.us= 1; /* only keep fake user */
brushn->id.flag |= LIB_FAKEUSER;
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &brushn->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &brush->id);
for(scene= bmain->scene.first; scene; scene=scene->id.next) {
if(paint_brush(&scene->toolsettings->imapaint.paint)==brush) {
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index c244c26ad7f..8b5cf3bd196 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -447,7 +447,8 @@ static void contarget_get_mesh_mat (Object *ob, const char *substring, float mat
}
else {
/* when not in EditMode, use the 'final' derived mesh, depsgraph
- * ensures we build with CD_MDEFORMVERT layer */
+ * ensures we build with CD_MDEFORMVERT layer
+ */
dm = (DerivedMesh *)ob->derivedFinal;
}
@@ -703,7 +704,7 @@ static void default_get_tarmat (bConstraint *con, bConstraintOb *UNUSED(cob), bC
ct->type = CONSTRAINT_OBTYPE_BONE; \
ct->rotOrder= (pchan) ? (pchan->rotmode) : EULER_ORDER_DEFAULT; \
}\
- else if (ELEM(ct->tar->type, OB_MESH, OB_LATTICE) && (ct->subtarget[0])) { \
+ else if (OB_TYPE_SUPPORT_VGROUP(ct->tar->type) && (ct->subtarget[0])) { \
ct->type = CONSTRAINT_OBTYPE_VERT; \
ct->rotOrder = EULER_ORDER_DEFAULT; \
} \
@@ -1256,10 +1257,7 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
float quat[4];
if ((data->followflag & FOLLOWPATH_STATIC) == 0) {
/* animated position along curve depending on time */
- if (cob->scene)
- curvetime= bsystem_time(cob->scene, ct->tar, cu->ctime, 0.0) - data->offset;
- else
- curvetime= cu->ctime - data->offset;
+ curvetime= cu->ctime - data->offset;
/* ctime is now a proper var setting of Curve which gets set by Animato like any other var that's animated,
* but this will only work if it actually is animated...
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 13b1da22449..adc08f5cd9f 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -273,13 +273,10 @@ void make_local_curve(Curve *cu)
extern_local_curve(cu);
}
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, cu->id.lib->filepath};
Curve *cun= copy_curve(cu);
cun->id.us= 0;
-
- /* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &cun->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &cun->id);
for(ob= bmain->object.first; ob; ob= ob->id.next) {
if(ob->data==cu) {
@@ -318,9 +315,34 @@ short curve_type(Curve *cu)
return OB_CURVE;
}
+void update_curve_dimension(Curve *cu)
+{
+ ListBase *nurbs= BKE_curve_nurbs(cu);
+ Nurb *nu= nurbs->first;
+
+ if(cu->flag&CU_3D) {
+ for( ; nu; nu= nu->next) {
+ nu->flag &= ~CU_2D;
+ }
+ }
+ else {
+ for( ; nu; nu= nu->next) {
+ nu->flag |= CU_2D;
+ test2DNurb(nu);
+
+ /* since the handles are moved they need to be auto-located again */
+ if(nu->type == CU_BEZIER)
+ calchandlesNurb(nu);
+ }
+ }
+}
+
void test_curve_type(Object *ob)
-{
- ob->type = curve_type(ob->data);
+{
+ ob->type= curve_type(ob->data);
+
+ if(ob->type==OB_CURVE)
+ update_curve_dimension((Curve *)ob->data);
}
void tex_space_curve(Curve *cu)
diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c
index 83eda860510..0c3c78f6eef 100644
--- a/source/blender/blenkernel/intern/deform.c
+++ b/source/blender/blenkernel/intern/deform.c
@@ -257,17 +257,19 @@ int defgroup_find_index (Object *ob, bDeformGroup *dg)
/* note, must be freed */
int *defgroup_flip_map(Object *ob, int *flip_map_len, int use_default)
{
- bDeformGroup *dg;
int totdg= *flip_map_len= BLI_countlist(&ob->defbase);
if(totdg==0) {
return NULL;
}
else {
+ bDeformGroup *dg;
char name[sizeof(dg->name)];
int i, flip_num, *map= MEM_mallocN(totdg * sizeof(int), __func__);
- memset(map, -1, totdg * sizeof(int));
+ for (i=0; i < totdg; i++) {
+ map[i]= -1;
+ }
for (dg=ob->defbase.first, i=0; dg; dg=dg->next, i++) {
if(map[i] == -1) { /* may be calculated previously */
@@ -276,7 +278,7 @@ int *defgroup_flip_map(Object *ob, int *flip_map_len, int use_default)
if(use_default)
map[i]= i;
- flip_side_name(name, dg->name, 0);
+ flip_side_name(name, dg->name, FALSE);
if(strcmp(name, dg->name)) {
flip_num= defgroup_name_index(ob, name);
if(flip_num >= 0) {
@@ -290,6 +292,40 @@ int *defgroup_flip_map(Object *ob, int *flip_map_len, int use_default)
}
}
+/* note, must be freed */
+int *defgroup_flip_map_single(Object *ob, int *flip_map_len, int use_default, int defgroup)
+{
+ int totdg= *flip_map_len= BLI_countlist(&ob->defbase);
+
+ if(totdg==0) {
+ return NULL;
+ }
+ else {
+ bDeformGroup *dg;
+ char name[sizeof(dg->name)];
+ int i, flip_num, *map= MEM_mallocN(totdg * sizeof(int), __func__);
+
+ for (i=0; i < totdg; i++) {
+ if (use_default) map[i]= i;
+ else map[i]= -1;
+ }
+
+ dg= BLI_findlink(&ob->defbase, defgroup);
+
+ flip_side_name(name, dg->name, FALSE);
+ if(strcmp(name, dg->name)) {
+ flip_num= defgroup_name_index(ob, name);
+
+ if(flip_num >= 0) {
+ map[defgroup]= flip_num;
+ map[flip_num]= defgroup;
+ }
+ }
+
+ return map;
+ }
+}
+
int defgroup_flip_index(Object *ob, int index, int use_default)
{
bDeformGroup *dg= BLI_findlink(&ob->defbase, index);
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index c9df8a135fe..51edee9ea71 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -591,9 +591,9 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Scene *scene, O
if(part->ren_as == PART_DRAW_OB && part->dup_ob) {
node2 = dag_get_node(dag, part->dup_ob);
- dag_add_relation(dag, node, node2, DAG_RL_OB_OB, "Particle Object Visualisation");
+ dag_add_relation(dag, node2, node, DAG_RL_OB_OB, "Particle Object Visualisation");
if(part->dup_ob->type == OB_MBALL)
- dag_add_relation(dag, node, node2, DAG_RL_DATA_DATA, "Particle Object Visualisation");
+ dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA, "Particle Object Visualisation");
}
if(part->ren_as == PART_DRAW_GR && part->dup_group) {
@@ -799,6 +799,7 @@ DagNode * dag_find_node (DagForest *forest,void * fob)
}
static int ugly_hack_sorry= 1; // prevent type check
+static int dag_print_dependencies= 0; // debugging
/* no checking of existence, use dag_find_node first or dag_get_node */
DagNode * dag_add_node (DagForest *forest, void * fob)
@@ -926,7 +927,6 @@ static const char *dag_node_name(DagNode *node)
return ((bPoseChannel*)(node->ob))->name;
}
-#if 0
static void dag_node_print_dependencies(DagNode *node)
{
DagAdjList *itA;
@@ -937,7 +937,6 @@ static void dag_node_print_dependencies(DagNode *node)
printf(" %s through %s\n", dag_node_name(itA->node), itA->name);
printf("\n");
}
-#endif
static int dag_node_print_dependency_recurs(DagNode *node, DagNode *endnode)
{
@@ -998,6 +997,11 @@ static void dag_check_cycle(DagForest *dag)
DagNode *node;
DagAdjList *itA;
+ /* debugging print */
+ if(dag_print_dependencies)
+ for(node = dag->DagNode.first; node; node= node->next)
+ dag_node_print_dependencies(node);
+
/* tag nodes unchecked */
for(node = dag->DagNode.first; node; node= node->next)
node->color= DAG_WHITE;
@@ -1761,9 +1765,22 @@ void DAG_scene_sort(Main *bmain, Scene *sce)
sce->recalc |= SCE_PRV_CHANGED; /* test for 3d preview */
}
+static void lib_id_recalc_tag(Main *bmain, ID *id)
+{
+ id->flag |= LIB_ID_RECALC;
+ bmain->id_tag_update[id->name[0]] = 1;
+}
+
+static void lib_id_recalc_data_tag(Main *bmain, ID *id)
+{
+ id->flag |= LIB_ID_RECALC_DATA;
+ bmain->id_tag_update[id->name[0]] = 1;
+}
+
/* node was checked to have lasttime != curtime and is if type ID_OB */
static void flush_update_node(DagNode *node, unsigned int layer, int curtime)
{
+ Main *bmain= G.main;
DagAdjList *itA;
Object *ob, *obc;
int oldflag, changed=0;
@@ -1789,20 +1806,24 @@ static void flush_update_node(DagNode *node, unsigned int layer, int curtime)
if(itA->type & DAG_RL_OB_OB) {
//printf("ob %s changes ob %s\n", ob->id.name, obc->id.name);
obc->recalc |= OB_RECALC_OB;
+ lib_id_recalc_tag(bmain, &obc->id);
}
if(itA->type & DAG_RL_OB_DATA) {
//printf("ob %s changes obdata %s\n", ob->id.name, obc->id.name);
obc->recalc |= OB_RECALC_DATA;
+ lib_id_recalc_data_tag(bmain, &obc->id);
}
}
if(ob->recalc & OB_RECALC_DATA) {
if(itA->type & DAG_RL_DATA_OB) {
//printf("obdata %s changes ob %s\n", ob->id.name, obc->id.name);
obc->recalc |= OB_RECALC_OB;
+ lib_id_recalc_tag(bmain, &obc->id);
}
if(itA->type & DAG_RL_DATA_DATA) {
//printf("obdata %s changes obdata %s\n", ob->id.name, obc->id.name);
obc->recalc |= OB_RECALC_DATA;
+ lib_id_recalc_data_tag(bmain, &obc->id);
}
}
if(oldflag!=obc->recalc) changed= 1;
@@ -1833,6 +1854,7 @@ static void flush_update_node(DagNode *node, unsigned int layer, int curtime)
if(itA->type & (DAG_RL_OB_DATA|DAG_RL_DATA_DATA)) {
// printf("parent %s changes ob %s\n", ob->id.name, obc->id.name);
obc->recalc |= OB_RECALC_DATA;
+ lib_id_recalc_data_tag(bmain, &obc->id);
}
}
}
@@ -1872,6 +1894,7 @@ static unsigned int flush_layer_node(Scene *sce, DagNode *node, int curtime)
/* node was checked to have lasttime != curtime , and is of type ID_OB */
static void flush_pointcache_reset(Scene *scene, DagNode *node, int curtime, int reset)
{
+ Main *bmain= G.main;
DagAdjList *itA;
Object *ob;
@@ -1883,8 +1906,10 @@ static void flush_pointcache_reset(Scene *scene, DagNode *node, int curtime, int
ob= (Object*)(itA->node->ob);
if(reset || (ob->recalc & OB_RECALC_ALL)) {
- if(BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_DEPSGRAPH))
+ if(BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_DEPSGRAPH)) {
ob->recalc |= OB_RECALC_DATA;
+ lib_id_recalc_data_tag(bmain, &ob->id);
+ }
flush_pointcache_reset(scene, itA->node, curtime, 1);
}
@@ -2001,8 +2026,10 @@ void DAG_scene_flush_update(Main *bmain, Scene *sce, unsigned int lay, const sho
ob= (Object*)(itA->node->ob);
if(ob->recalc & OB_RECALC_ALL) {
- if(BKE_ptcache_object_reset(sce, ob, PTCACHE_RESET_DEPSGRAPH))
+ if(BKE_ptcache_object_reset(sce, ob, PTCACHE_RESET_DEPSGRAPH)) {
ob->recalc |= OB_RECALC_DATA;
+ lib_id_recalc_data_tag(bmain, &ob->id);
+ }
flush_pointcache_reset(sce, itA->node, lasttime, 1);
}
@@ -2204,6 +2231,12 @@ static void dag_object_time_update_flags(Object *ob)
}
}
}
+
+ if(ob->recalc & OB_RECALC_OB)
+ lib_id_recalc_tag(G.main, &ob->id);
+ if(ob->recalc & OB_RECALC_DATA)
+ lib_id_recalc_data_tag(G.main, &ob->id);
+
}
/* flag all objects that need recalc, for changes in time for example */
/* do_time: make this optional because undo resets objects to their animated locations without this */
@@ -2362,6 +2395,9 @@ void DAG_on_visible_update(Main *bmain, const short do_time)
DAG_scene_update_flags(bmain, scene, lay, do_time);
scene->lay_updated |= lay;
}
+
+ /* hack to get objects updating on layer changes */
+ DAG_id_type_tag(bmain, ID_OB);
}
static void dag_id_flush_update__isDependentTexture(void *userData, Object *UNUSED(ob), ID **idpoin)
@@ -2408,6 +2444,7 @@ static void dag_id_flush_update(Scene *sce, ID *id)
for(obt=bmain->object.first; obt; obt= obt->id.next) {
if(!(ob && obt == ob) && obt->data == id) {
obt->recalc |= OB_RECALC_DATA;
+ lib_id_recalc_data_tag(bmain, &obt->id);
BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH);
}
}
@@ -2421,8 +2458,10 @@ static void dag_id_flush_update(Scene *sce, ID *id)
data.is_dependent= 0;
modifiers_foreachIDLink(obt, dag_id_flush_update__isDependentTexture, &data);
- if (data.is_dependent)
+ if (data.is_dependent) {
obt->recalc |= OB_RECALC_DATA;
+ lib_id_recalc_data_tag(bmain, &obt->id);
+ }
/* particle settings can use the texture as well */
if(obt->particlesystem.first) {
@@ -2435,7 +2474,8 @@ static void dag_id_flush_update(Scene *sce, ID *id)
mtex = *mtexp;
if(mtex && mtex->tex == (Tex*)id) {
obt->recalc |= OB_RECALC_DATA;
-
+ lib_id_recalc_data_tag(bmain, &obt->id);
+
if(mtex->mapto & PAMAP_INIT)
psys->recalc |= PSYS_RECALC_RESET;
if(mtex->mapto & PAMAP_CHILD)
@@ -2455,6 +2495,8 @@ static void dag_id_flush_update(Scene *sce, ID *id)
Key *key= ob_get_key(obt);
if(!(ob && obt == ob) && ((ID *)key == id)) {
obt->flag |= (OB_RECALC_OB|OB_RECALC_DATA);
+ lib_id_recalc_tag(bmain, &obt->id);
+ lib_id_recalc_data_tag(bmain, &obt->id);
BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH);
}
}
@@ -2479,7 +2521,7 @@ void DAG_ids_flush_tagged(Main *bmain)
ListBase *lbarray[MAX_LIBARRAY];
Scene *sce;
unsigned int lay;
- int a, have_tag = 0;
+ int a, do_flush = 0;
dag_current_scene_layers(bmain, &sce, &lay);
@@ -2497,23 +2539,64 @@ void DAG_ids_flush_tagged(Main *bmain)
looping over all ID's in case there are no tags */
if(id && bmain->id_tag_update[id->name[0]]) {
for(; id; id=id->next) {
- if(id->flag & LIB_ID_RECALC) {
+ if(id->flag & (LIB_ID_RECALC|LIB_ID_RECALC_DATA)) {
dag_id_flush_update(sce, id);
- id->flag &= ~LIB_ID_RECALC;
+ do_flush = 1;
}
}
+ }
+ }
+
+ /* flush changes to other objects */
+ if(do_flush)
+ DAG_scene_flush_update(bmain, sce, lay, 0);
+}
+
+void DAG_ids_check_recalc(Main *bmain)
+{
+ ListBase *lbarray[MAX_LIBARRAY];
+ int a;
- have_tag = 1;
+ /* loop over all ID types */
+ a = set_listbasepointers(bmain, lbarray);
+
+ while(a--) {
+ ListBase *lb = lbarray[a];
+ ID *id = lb->first;
+
+ /* we tag based on first ID type character to avoid
+ looping over all ID's in case there are no tags */
+ if(id && bmain->id_tag_update[id->name[0]]) {
+ /* do editors update */
+ dag_editors_update(bmain, NULL);
+ return;
}
}
+}
- if(have_tag) {
- /* clear tags */
- memset(bmain->id_tag_update, 0, sizeof(bmain->id_tag_update));
- /* flush changes to other objects */
- DAG_scene_flush_update(bmain, sce, lay, 0);
+void DAG_ids_clear_recalc(Main *bmain)
+{
+ ListBase *lbarray[MAX_LIBARRAY];
+ int a;
+
+ /* loop over all ID types */
+ a = set_listbasepointers(bmain, lbarray);
+
+ while(a--) {
+ ListBase *lb = lbarray[a];
+ ID *id = lb->first;
+
+ /* we tag based on first ID type character to avoid
+ looping over all ID's in case there are no tags */
+ if(id && bmain->id_tag_update[id->name[0]]) {
+ for(; id; id=id->next)
+ if(id->flag & (LIB_ID_RECALC|LIB_ID_RECALC_DATA))
+ id->flag &= ~(LIB_ID_RECALC|LIB_ID_RECALC_DATA);
+ }
}
+
+ memset(bmain->id_tag_update, 0, sizeof(bmain->id_tag_update));
}
void DAG_id_tag_update(ID *id, short flag)
@@ -2523,8 +2606,14 @@ void DAG_id_tag_update(ID *id, short flag)
if(id==NULL) return;
/* tag ID for update */
- id->flag |= LIB_ID_RECALC;
- bmain->id_tag_update[id->name[0]] = 1;
+ if(flag) {
+ if(flag & OB_RECALC_OB)
+ lib_id_recalc_tag(bmain, id);
+ if(flag & (OB_RECALC_DATA|PSYS_RECALC))
+ lib_id_recalc_data_tag(bmain, id);
+ }
+ else
+ lib_id_recalc_tag(bmain, id);
/* flag is for objects and particle systems */
if(flag) {
@@ -2556,6 +2645,16 @@ void DAG_id_tag_update(ID *id, short flag)
}
}
+void DAG_id_type_tag(struct Main *bmain, short idtype)
+{
+ bmain->id_tag_update[((char*)&idtype)[0]] = 1;
+}
+
+int DAG_id_type_tagged(Main *bmain, short idtype)
+{
+ return bmain->id_tag_update[((char*)&idtype)[0]];
+}
+
#if 0 // UNUSED
/* recursively descends tree, each node only checked once */
/* node is checked to be of type object */
@@ -2739,5 +2838,22 @@ void DAG_pose_sort(Object *ob)
ugly_hack_sorry= 1;
}
+/* ************************ DAG DEBUGGING ********************* */
+void DAG_print_dependencies(Main *bmain, Scene *scene, Object *ob)
+{
+ /* utility for debugging dependencies */
+ dag_print_dependencies= 1;
+
+ if(ob && (ob->mode & OB_MODE_POSE)) {
+ printf("\nDEPENDENCY RELATIONS for %s\n\n", ob->id.name+2);
+ DAG_pose_sort(ob);
+ }
+ else {
+ printf("\nDEPENDENCY RELATIONS for %s\n\n", scene->id.name+2);
+ DAG_scene_sort(bmain, scene);
+ }
+
+ dag_print_dependencies= 0;
+}
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 9aeacb9d7fa..08440849a4e 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -385,13 +385,12 @@ void make_local_image(struct Image *ima)
extern_local_image(ima);
}
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, ima->id.lib->filepath};
Image *iman= copy_image(ima);
iman->id.us= 0;
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &iman->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &iman->id);
tex= bmain->tex.first;
while(tex) {
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index 85e00bcea06..034f4a96879 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -703,14 +703,7 @@ static const char *world_adrcodes_to_paths (int adrcode, int *array_index)
return "mist.start";
case WO_MISTHI:
return "mist.height";
-
- /* Star Color is unused -- recommend removal */
- /* case WO_STAR_R:
- *array_index= 0; return "stars.color";
- case WO_STAR_G:
- *array_index= 1; return "stars.color";
- case WO_STAR_B:
- *array_index= 2; return "stars.color"; */
+
case WO_STAR_R:
case WO_STAR_G:
case WO_STAR_B:
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 0a467142f74..6d095117136 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -1381,7 +1381,7 @@ float *do_ob_key(Scene *scene, Object *ob)
ob->shapenr= 1;
}
- if(ELEM(ob->type, OB_MESH, OB_LATTICE)) {
+ if (OB_TYPE_SUPPORT_VGROUP(ob->type)) {
float *weights= get_weights_array(ob, kb->vgroup);
cp_key(0, tot, tot, out, key, actkb, kb, weights, 0);
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 9a528b54143..47878242604 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -271,12 +271,11 @@ void make_local_lattice(Lattice *lt)
id_clear_lib_data(bmain, &lt->id);
}
else if(is_local && is_lib) {
- char *bath_user_data[2]= {bmain->name, lt->id.lib->filepath};
Lattice *ltn= copy_lattice(lt);
ltn->id.us= 0;
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &ltn->id, bpath_relocate_visitor, 0, bath_user_data);
+ BKE_id_lib_local_paths(bmain, &ltn->id);
for(ob= bmain->object.first; ob; ob= ob->id.next) {
if(ob->data==lt) {
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 9d8acc44e88..35b50730a31 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -127,6 +127,21 @@
/* ************* general ************************ */
+
+/* this has to be called from each make_local_* func, we could call
+ * from id_make_local() but then the make local functions would not be self
+ * contained.
+ * also note that the id _must_ have a library - campbell */
+void BKE_id_lib_local_paths(Main *bmain, ID *id)
+{
+ char *bpath_user_data[2]= {bmain->name, (id)->lib->filepath};
+
+ bpath_traverse_id(bmain, id,
+ bpath_relocate_visitor,
+ BPATH_TRAVERSE_SKIP_MULTIFILE,
+ bpath_user_data);
+}
+
void id_lib_extern(ID *id)
{
if(id) {
@@ -1252,8 +1267,8 @@ int new_id(ListBase *lb, ID *id, const char *tname)
don't have other library users. */
void id_clear_lib_data(Main *bmain, ID *id)
{
- char *bpath_user_data[2]= {bmain->name, id->lib->filepath};
- bpath_traverse_id(bmain, id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, id);
+
id->lib= NULL;
id->flag= LIB_LOCAL;
new_id(which_libbase(bmain, GS(id->name)), id, NULL);
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 2ad3da9f3a0..7be3514e0f2 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -364,13 +364,12 @@ void make_local_material(Material *ma)
}
/* Both user and local, so copy. */
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, ma->id.lib->filepath};
Material *man= copy_material(ma);
man->id.us= 0;
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &man->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &man->id);
/* do objects */
ob= bmain->object.first;
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index 98646bd2faa..327306b32ee 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -174,12 +174,11 @@ void make_local_mball(MetaBall *mb)
extern_local_mball(mb);
}
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, mb->id.lib->filepath};
MetaBall *mbn= copy_mball(mb);
mbn->id.us= 0;
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &mbn->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &mbn->id);
for(ob= G.main->object.first; ob; ob= ob->id.next) {
if(ob->data == mb) {
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 6f66e189dcf..4a8bc34cdf7 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -298,13 +298,12 @@ void make_local_mesh(Mesh *me)
expand_local_mesh(me);
}
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, me->id.lib->filepath};
Mesh *men= copy_mesh(me);
men->id.us= 0;
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &men->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &men->id);
for(ob= bmain->object.first; ob; ob= ob->id.next) {
if(me == ob->data) {
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 824e59a82c5..8f609291351 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -43,10 +43,11 @@
#include <string.h>
#include <limits.h>
+#include "DNA_action_types.h"
#include "DNA_anim_types.h"
#include "DNA_node_types.h"
+#include "DNA_node_types.h"
#include "DNA_scene_types.h"
-#include "DNA_action_types.h"
#include "BLI_string.h"
#include "BLI_math.h"
@@ -1320,7 +1321,7 @@ void nodeSetActive(bNodeTree *ntree, bNode *node)
node->flag |= NODE_ACTIVE_ID;
}
-/* use flags are not persistant yet, groups might need different tagging, so we do it each time
+/* use flags are not persistent yet, groups might need different tagging, so we do it each time
when we need to get this info */
void ntreeSocketUseFlags(bNodeTree *ntree)
{
@@ -1751,6 +1752,10 @@ void node_type_gpu_ext(struct bNodeType *ntype, int (*gpuextfunc)(struct GPUMate
ntype->gpuextfunc = gpuextfunc;
}
+void node_type_compatibility(struct bNodeType *ntype, short compatibility)
+{
+ ntype->compatibility = compatibility;
+}
static bNodeType *is_nodetype_registered(ListBase *typelist, int type)
{
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 0d0552cf3b3..b09d1ea98aa 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -86,6 +86,7 @@
#include "BKE_mesh.h"
#include "BKE_mball.h"
#include "BKE_modifier.h"
+#include "BKE_node.h"
#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_particle.h"
@@ -302,8 +303,6 @@ void free_object(Object *ob)
ob->matbits= NULL;
if(ob->bb) MEM_freeN(ob->bb);
ob->bb= NULL;
- if(ob->path) free_path(ob->path);
- ob->path= NULL;
if(ob->adt) BKE_free_animdata((ID *)ob);
if(ob->poselib) ob->poselib->id.us--;
if(ob->gpd) ((ID *)ob->gpd)->us--;
@@ -723,6 +722,8 @@ void *add_camera(const char *name)
cam= alloc_libblock(&G.main->camera, ID_CA, name);
cam->lens= 35.0f;
+ cam->sensor_x= 32.0f;
+ cam->sensor_y= 18.0f;
cam->clipsta= 0.1f;
cam->clipend= 100.0f;
cam->drawsize= 0.5f;
@@ -772,13 +773,12 @@ void make_local_camera(Camera *cam)
id_clear_lib_data(bmain, &cam->id);
}
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, cam->id.lib->filepath};
Camera *camn= copy_camera(cam);
camn->id.us= 0;
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &camn->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &camn->id);
for(ob= bmain->object.first; ob; ob= ob->id.next) {
if(ob->data == cam) {
@@ -878,6 +878,9 @@ Lamp *copy_lamp(Lamp *la)
}
lan->curfalloff = curvemapping_copy(la->curfalloff);
+
+ if(la->nodetree)
+ lan->nodetree= ntreeCopyTree(la->nodetree);
if(la->preview)
lan->preview = BKE_previewimg_copy(la->preview);
@@ -904,6 +907,9 @@ Lamp *localize_lamp(Lamp *la)
lan->curfalloff = curvemapping_copy(la->curfalloff);
+ if(la->nodetree)
+ lan->nodetree= ntreeLocalize(la->nodetree);
+
lan->preview= NULL;
return lan;
@@ -939,13 +945,11 @@ void make_local_lamp(Lamp *la)
id_clear_lib_data(bmain, &la->id);
}
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, la->id.lib->filepath};
Lamp *lan= copy_lamp(la);
lan->id.us= 0;
-
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &lan->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &lan->id);
ob= bmain->object.first;
while(ob) {
@@ -981,6 +985,12 @@ void free_lamp(Lamp *la)
BKE_free_animdata((ID *)la);
curvemapping_free(la->curfalloff);
+
+ /* is no lib link block, but lamp extension */
+ if(la->nodetree) {
+ ntreeFreeTree(la->nodetree);
+ MEM_freeN(la->nodetree);
+ }
BKE_previewimg_free(&la->preview);
BKE_icon_delete(&la->id);
@@ -1095,7 +1105,6 @@ Object *add_only_object(int type, const char *name)
ob->obstacleRad = 1.;
/* NT fluid sim defaults */
- ob->fluidsimFlag = 0;
ob->fluidsimSettings = NULL;
ob->pc_ids.first = ob->pc_ids.last = NULL;
@@ -1365,7 +1374,6 @@ Object *copy_object(Object *ob)
}
if(ob->bb) obn->bb= MEM_dupallocN(ob->bb);
- obn->path= NULL;
obn->flag &= ~OB_FROMGROUP;
obn->modifiers.first = obn->modifiers.last= NULL;
@@ -1486,13 +1494,12 @@ void make_local_object(Object *ob)
extern_local_object(ob);
}
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, ob->id.lib->filepath};
Object *obn= copy_object(ob);
obn->id.us= 0;
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &obn->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &obn->id);
sce= bmain->scene.first;
while(sce) {
@@ -2945,27 +2952,23 @@ void object_camera_mode(RenderData *rd, Object *camera)
}
}
-/* 'lens' may be set for envmap only */
-void object_camera_matrix(
- RenderData *rd, Object *camera, int winx, int winy, short field_second,
- float winmat[][4], rctf *viewplane, float *clipsta, float *clipend, float *lens, float *ycor,
- float *viewdx, float *viewdy
-) {
- Camera *cam=NULL;
- float pixsize;
- float shiftx=0.0, shifty=0.0, winside, viewfac;
- short is_ortho= FALSE;
+void object_camera_intrinsics(Object *camera, Camera **cam_r, short *is_ortho, float *shiftx, float *shifty,
+ float *clipsta, float *clipend, float *lens, float *sensor_x, float *sensor_y, short *sensor_fit)
+{
+ Camera *cam= NULL;
- /* question mark */
- (*ycor)= rd->yasp / rd->xasp;
- if(rd->mode & R_FIELDS)
- (*ycor) *= 2.0f;
+ (*shiftx)= 0.0f;
+ (*shifty)= 0.0f;
+
+ (*sensor_x)= DEFAULT_SENSOR_WIDTH;
+ (*sensor_y)= DEFAULT_SENSOR_HEIGHT;
+ (*sensor_fit)= CAMERA_SENSOR_FIT_AUTO;
if(camera->type==OB_CAMERA) {
cam= camera->data;
if(cam->type == CAM_ORTHO) {
- is_ortho= TRUE;
+ *is_ortho= TRUE;
}
/* solve this too... all time depending stuff is in convertblender.c?
@@ -2978,11 +2981,14 @@ void object_camera_matrix(
execute_ipo(&cam->id, cam->ipo);
}
#endif // XXX old animation system
- shiftx=cam->shiftx;
- shifty=cam->shifty;
+ (*shiftx)=cam->shiftx;
+ (*shifty)=cam->shifty;
(*lens)= cam->lens;
+ (*sensor_x)= cam->sensor_x;
+ (*sensor_y)= cam->sensor_y;
(*clipsta)= cam->clipsta;
(*clipend)= cam->clipend;
+ (*sensor_fit)= cam->sensor_fit;
}
else if(camera->type==OB_LAMP) {
Lamp *la= camera->data;
@@ -2996,7 +3002,7 @@ void object_camera_matrix(
(*clipend)= la->clipend;
}
else { /* envmap exception... */;
- if((*lens)==0.0f)
+ if((*lens)==0.0f) /* is this needed anymore? */
(*lens)= 16.0f;
if((*clipsta)==0.0f || (*clipend)==0.0f) {
@@ -3005,25 +3011,69 @@ void object_camera_matrix(
}
}
+ (*cam_r)= cam;
+}
+
+/* 'lens' may be set for envmap only */
+void object_camera_matrix(
+ RenderData *rd, Object *camera, int winx, int winy, short field_second,
+ float winmat[][4], rctf *viewplane, float *clipsta, float *clipend, float *lens,
+ float *sensor_x, float *sensor_y, short *sensor_fit, float *ycor,
+ float *viewdx, float *viewdy)
+{
+ Camera *cam=NULL;
+ float pixsize;
+ float shiftx=0.0, shifty=0.0, winside, viewfac;
+ short is_ortho= FALSE;
+
+ /* question mark */
+ (*ycor)= rd->yasp / rd->xasp;
+ if(rd->mode & R_FIELDS)
+ (*ycor) *= 2.0f;
+
+ object_camera_intrinsics(camera, &cam, &is_ortho, &shiftx, &shifty, clipsta, clipend, lens, sensor_x, sensor_y, sensor_fit);
+
/* ortho only with camera available */
if(cam && is_ortho) {
- if(rd->xasp*winx >= rd->yasp*winy) {
+ if((*sensor_fit)==CAMERA_SENSOR_FIT_AUTO) {
+ if(rd->xasp*winx >= rd->yasp*winy) viewfac= winx;
+ else viewfac= (*ycor) * winy;
+ }
+ else if((*sensor_fit)==CAMERA_SENSOR_FIT_HOR) {
viewfac= winx;
}
- else {
+ else { /* if((*sensor_fit)==CAMERA_SENSOR_FIT_VERT) { */
viewfac= (*ycor) * winy;
}
+
/* ortho_scale == 1.0 means exact 1 to 1 mapping */
pixsize= cam->ortho_scale/viewfac;
}
else {
- if(rd->xasp*winx >= rd->yasp*winy) viewfac= ((*lens) * winx)/32.0f;
- else viewfac= (*ycor) * ((*lens) * winy)/32.0f;
+ if((*sensor_fit)==CAMERA_SENSOR_FIT_AUTO) {
+ if(rd->xasp*winx >= rd->yasp*winy) viewfac= ((*lens) * winx) / (*sensor_x);
+ else viewfac= (*ycor) * ((*lens) * winy) / (*sensor_x);
+ }
+ else if((*sensor_fit)==CAMERA_SENSOR_FIT_HOR) {
+ viewfac= ((*lens) * winx) / (*sensor_x);
+ }
+ else { /* if((*sensor_fit)==CAMERA_SENSOR_FIT_VERT) { */
+ viewfac= ((*lens) * winy) / (*sensor_y);
+ }
+
pixsize= (*clipsta) / viewfac;
}
/* viewplane fully centered, zbuffer fills in jittered between -.5 and +.5 */
winside= MAX2(winx, winy);
+
+ if(cam) {
+ if(cam->sensor_fit==CAMERA_SENSOR_FIT_HOR)
+ winside= winx;
+ else if(cam->sensor_fit==CAMERA_SENSOR_FIT_VERT)
+ winside= winy;
+ }
+
viewplane->xmin= -0.5f*(float)winx + shiftx*winside;
viewplane->ymin= -0.5f*(*ycor)*(float)winy + shifty*winside;
viewplane->xmax= 0.5f*(float)winx + shiftx*winside;
@@ -3067,7 +3117,17 @@ void camera_view_frame_ex(Scene *scene, Camera *camera, float drawsize, const sh
float aspx= (float) scene->r.xsch*scene->r.xasp;
float aspy= (float) scene->r.ysch*scene->r.yasp;
- if(aspx < aspy) {
+ if(camera->sensor_fit==CAMERA_SENSOR_FIT_AUTO) {
+ if(aspx < aspy) {
+ r_asp[0]= aspx / aspy;
+ r_asp[1]= 1.0;
+ }
+ else {
+ r_asp[0]= 1.0;
+ r_asp[1]= aspy / aspx;
+ }
+ }
+ else if(camera->sensor_fit==CAMERA_SENSOR_FIT_AUTO) {
r_asp[0]= aspx / aspy;
r_asp[1]= 1.0;
}
@@ -3093,16 +3153,18 @@ void camera_view_frame_ex(Scene *scene, Camera *camera, float drawsize, const sh
else {
/* that way it's always visible - clipsta+0.1 */
float fac;
+ float half_sensor= 0.5f*((camera->sensor_fit==CAMERA_SENSOR_FIT_VERT) ? (camera->sensor_y) : (camera->sensor_x));
+
*r_drawsize= drawsize / ((scale[0] + scale[1] + scale[2]) / 3.0f);
if(do_clip) {
/* fixed depth, variable size (avoids exceeding clipping range) */
depth = -(camera->clipsta + 0.1f);
- fac = depth / (camera->lens/-16.0f * scale[2]);
+ fac = depth / (camera->lens/(-half_sensor) * scale[2]);
}
else {
/* fixed size, variable depth (stays a reasonable size in the 3D view) */
- depth= *r_drawsize * camera->lens/-16.0f * scale[2];
+ depth= *r_drawsize * camera->lens/(-half_sensor) * scale[2];
fac= *r_drawsize;
}
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 2d372b33dfb..3901fde2bf1 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -3641,13 +3641,12 @@ void make_local_particlesettings(ParticleSettings *part)
expand_local_particlesettings(part);
}
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, part->id.lib->filepath};
ParticleSettings *partn= psys_copy_settings(part);
partn->id.us= 0;
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &partn->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &partn->id);
/* do objects */
for(ob= bmain->object.first; ob; ob= ob->id.next) {
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 6b3786663df..a9de75dc7d0 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -72,6 +72,8 @@
#include "BKE_sound.h"
+#include "RE_engine.h"
+
//XXX #include "BIF_previewrender.h"
//XXX #include "BIF_editseq.h"
@@ -988,16 +990,22 @@ static void scene_update_tagged_recursive(Main *bmain, Scene *scene, Scene *scen
/* this is called in main loop, doing tagged updates before redraw */
void scene_update_tagged(Main *bmain, Scene *scene)
{
+ /* keep this first */
+ BLI_exec_cb(bmain, &scene->id, BLI_CB_EVT_SCENE_UPDATE_PRE);
+
+ /* flush recalc flags to dependencies */
DAG_ids_flush_tagged(bmain);
scene->physics_settings.quick_cache_step= 0;
/* update all objects: drivers, matrices, displists, etc. flags set
- by depgraph or manual, no layer check here, gets correct flushed */
+ by depgraph or manual, no layer check here, gets correct flushed
+ in the future this should handle updates for all datablocks, not
+ only objects and scenes. - brecht */
scene_update_tagged_recursive(bmain, scene, scene);
- /* recalc scene animation data here (for sequencer) */
+ /* extra call here to recalc scene animation (for sequencer) */
{
AnimData *adt= BKE_animdata_from_id(&scene->id);
float ctime = BKE_curframe(scene);
@@ -1006,11 +1014,20 @@ void scene_update_tagged(Main *bmain, Scene *scene)
BKE_animsys_evaluate_animdata(scene, &scene->id, adt, ctime, 0);
}
+ /* quick point cache updates */
if (scene->physics_settings.quick_cache_step)
BKE_ptcache_quick_cache_all(bmain, scene);
- /* in the future this should handle updates for all datablocks, not
- only objects and scenes. - brecht */
+ /* notify editors about recalc */
+ DAG_ids_check_recalc(bmain);
+
+ /* keep this last */
+ BLI_exec_cb(bmain, &scene->id, BLI_CB_EVT_SCENE_UPDATE_POST);
+}
+
+void scene_clear_tagged(Main *bmain, Scene *UNUSED(scene))
+{
+ DAG_ids_clear_recalc(bmain);
}
/* applies changes right away, does all sets too */
@@ -1020,7 +1037,8 @@ void scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay)
Scene *sce_iter;
/* keep this first */
- BLI_exec_cb(bmain, (ID *)sce, BLI_CB_EVT_FRAME_CHANGE_PRE);
+ BLI_exec_cb(bmain, &sce->id, BLI_CB_EVT_FRAME_CHANGE_PRE);
+ BLI_exec_cb(bmain, &sce->id, BLI_CB_EVT_SCENE_UPDATE_PRE);
sound_set_cfra(sce->r.cfra);
@@ -1032,6 +1050,10 @@ void scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay)
DAG_scene_sort(bmain, sce_iter);
}
+ /* flush recalc flags to dependencies, if we were only changing a frame
+ this would not be necessary, but if a user or a script has modified
+ some datablock before scene_update_tagged was called, we need the flush */
+ DAG_ids_flush_tagged(bmain);
/* Following 2 functions are recursive
* so dont call within 'scene_update_tagged_recursive' */
@@ -1050,7 +1072,10 @@ void scene_update_for_newframe(Main *bmain, Scene *sce, unsigned int lay)
scene_update_tagged_recursive(bmain, sce, sce);
/* keep this last */
- BLI_exec_cb(bmain, (ID *)sce, BLI_CB_EVT_FRAME_CHANGE_POST);
+ BLI_exec_cb(bmain, &sce->id, BLI_CB_EVT_SCENE_UPDATE_POST);
+ BLI_exec_cb(bmain, &sce->id, BLI_CB_EVT_FRAME_CHANGE_POST);
+
+ DAG_ids_clear_recalc(bmain);
}
/* return default layer, also used to patch old files */
@@ -1127,3 +1152,10 @@ Base *_setlooper_base_step(Scene **sce_iter, Base *base)
return NULL;
}
+
+int scene_use_new_shading_nodes(Scene *scene)
+{
+ RenderEngineType *type= RE_engines_find(scene->r.engine);
+ return (type->flag & RE_USE_SHADING_NODES);
+}
+
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 02e6fe945f3..3d28e45f6b7 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -351,6 +351,29 @@ ARegion *BKE_area_find_region_type(ScrArea *sa, int type)
return NULL;
}
+/* note, using this function is generally a last resort, you really want to be
+ * using the context when you can - campbell
+ * -1 for any type */
+struct ScrArea *BKE_screen_find_big_area(struct bScreen *sc, const int spacetype, const short min)
+{
+ ScrArea *sa, *big= NULL;
+ int size, maxsize= 0;
+
+ for(sa= sc->areabase.first; sa; sa= sa->next) {
+ if ((spacetype == -1) || sa->spacetype == spacetype) {
+ if (min <= sa->winx && min <= sa->winy) {
+ size= sa->winx*sa->winy;
+ if (size > maxsize) {
+ maxsize= size;
+ big= sa;
+ }
+ }
+ }
+ }
+
+ return big;
+}
+
void BKE_screen_view3d_sync(struct View3D *v3d, struct Scene *scene)
{
int bit;
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index ac2a840c95a..7174126a00c 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -77,6 +77,8 @@
#include "BKE_smoke.h"
+#ifdef WITH_SMOKE
+
#ifdef _WIN32
#include <time.h>
#include <stdio.h>
@@ -131,12 +133,13 @@ struct SmokeModifierData;
#define TRI_UVOFFSET (1./4.)
-#ifdef WITH_SMOKE
/* forward declerations */
static void calcTriangleDivs(Object *ob, MVert *verts, int numverts, MFace *tris, int numfaces, int numtris, int **tridivs, float cell_len);
static void get_cell(float *p0, int res[3], float dx, float *pos, int *cell, int correct);
static void fill_scs_points(Object *ob, DerivedMesh *dm, SmokeCollSettings *scs);
+
#else /* WITH_SMOKE */
+
/* Stubs to use when smoke is disabled */
struct WTURBULENCE *smoke_turbulence_init(int *UNUSED(res), int UNUSED(amplify), int UNUSED(noisetype)) { return NULL; }
struct FLUID_3D *smoke_init(int *UNUSED(res), float *UNUSED(p0)) { return NULL; }
@@ -146,9 +149,11 @@ void smoke_initWaveletBlenderRNA(struct WTURBULENCE *UNUSED(wt), float *UNUSED(s
void smoke_initBlenderRNA(struct FLUID_3D *UNUSED(fluid), float *UNUSED(alpha), float *UNUSED(beta), float *UNUSED(dt_factor), float *UNUSED(vorticity), int *UNUSED(border_colli)) {}
long long smoke_get_mem_req(int UNUSED(xres), int UNUSED(yres), int UNUSED(zres), int UNUSED(amplify)) { return 0; }
void smokeModifier_do(SmokeModifierData *UNUSED(smd), Scene *UNUSED(scene), Object *UNUSED(ob), DerivedMesh *UNUSED(dm)) {}
+
#endif /* WITH_SMOKE */
#ifdef WITH_SMOKE
+
static int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, DerivedMesh *dm)
{
if((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain && !smd->domain->fluid)
diff --git a/source/blender/blenkernel/intern/speaker.c b/source/blender/blenkernel/intern/speaker.c
index d5788d7a748..018c7a197ff 100644
--- a/source/blender/blenkernel/intern/speaker.c
+++ b/source/blender/blenkernel/intern/speaker.c
@@ -106,12 +106,11 @@ void make_local_speaker(Speaker *spk)
id_clear_lib_data(bmain, &spk->id);
}
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, spk->id.lib->filepath};
Speaker *spkn= copy_speaker(spk);
spkn->id.us= 0;
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &spkn->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &spkn->id);
ob= bmain->object.first;
while(ob) {
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 15ee98624f5..f02a8031bce 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -1598,6 +1598,9 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
if(!mcol)
mcol = dm->getFaceDataArray(dm, CD_MCOL);
+ if(!mcol)
+ mcol = dm->getFaceDataArray(dm, CD_TEXTURE_MCOL);
+
totface = ccgSubSurf_getNumFaces(ss);
for(i = 0; i < totface; i++) {
CCGFace *f = ccgdm->faceMap[i].face;
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index e3713b1e177..d3bd7d7b766 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -897,13 +897,12 @@ void make_local_texture(Tex *tex)
extern_local_texture(tex);
}
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, tex->id.lib->filepath};
Tex *texn= copy_texture(tex);
texn->id.us= 0;
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &texn->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &texn->id);
ma= bmain->mat.first;
while(ma) {
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index 4d7a7c9a262..c7d2763774d 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -42,12 +42,14 @@
#include "BLI_utildefines.h"
#include "BLI_bpath.h"
-#include "BKE_world.h"
-#include "BKE_library.h"
#include "BKE_animsys.h"
#include "BKE_global.h"
-#include "BKE_main.h"
#include "BKE_icons.h"
+#include "BKE_library.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_node.h"
+#include "BKE_world.h"
void free_world(World *wrld)
{
@@ -63,6 +65,12 @@ void free_world(World *wrld)
BKE_free_animdata((ID *)wrld);
+ /* is no lib link block, but world extension */
+ if(wrld->nodetree) {
+ ntreeFreeTree(wrld->nodetree);
+ MEM_freeN(wrld->nodetree);
+ }
+
BKE_icon_delete((struct ID*)wrld);
wrld->id.icon_id = 0;
}
@@ -119,6 +127,9 @@ World *copy_world(World *wrld)
id_us_plus((ID *)wrldn->mtex[a]->tex);
}
}
+
+ if(wrld->nodetree)
+ wrldn->nodetree= ntreeCopyTree(wrld->nodetree);
if(wrld->preview)
wrldn->preview = BKE_previewimg_copy(wrld->preview);
@@ -143,6 +154,9 @@ World *localize_world(World *wrld)
}
}
+ if(wrld->nodetree)
+ wrldn->nodetree= ntreeLocalize(wrld->nodetree);
+
wrldn->preview= NULL;
return wrldn;
@@ -176,12 +190,11 @@ void make_local_world(World *wrld)
id_clear_lib_data(bmain, &wrld->id);
}
else if(is_local && is_lib) {
- char *bpath_user_data[2]= {bmain->name, wrld->id.lib->filepath};
World *wrldn= copy_world(wrld);
wrldn->id.us= 0;
/* Remap paths of new ID using old library as base. */
- bpath_traverse_id(bmain, &wrldn->id, bpath_relocate_visitor, 0, bpath_user_data);
+ BKE_id_lib_local_paths(bmain, &wrldn->id);
for(sce= bmain->scene.first; sce; sce= sce->id.next) {
if(sce->world == wrld) {
diff --git a/source/blender/blenlib/BLI_bpath.h b/source/blender/blenlib/BLI_bpath.h
index 89ba4b2675e..e850db5a171 100644
--- a/source/blender/blenlib/BLI_bpath.h
+++ b/source/blender/blenlib/BLI_bpath.h
@@ -48,9 +48,13 @@ void bpath_traverse_id_list(struct Main *bmain, struct ListBase *lb, BPathVisito
void bpath_traverse_main(struct Main *bmain, BPathVisitor visit_cb, const int flag, void *userdata);
int bpath_relocate_visitor(void *oldbasepath, char *path_dst, const char *path_src);
-#define BPATH_TRAVERSE_ABS (1<<0) /* convert paths to absolute */
-#define BPATH_TRAVERSE_SKIP_LIBRARY (1<<2) /* skip library paths */
-#define BPATH_TRAVERSE_SKIP_PACKED (1<<3) /* skip packed data */
+#define BPATH_TRAVERSE_ABS (1<<0) /* convert paths to absolute */
+#define BPATH_TRAVERSE_SKIP_LIBRARY (1<<2) /* skip library paths */
+#define BPATH_TRAVERSE_SKIP_PACKED (1<<3) /* skip packed data */
+#define BPATH_TRAVERSE_SKIP_MULTIFILE (1<<4) /* skip paths where a single dir is used with an array of files, eg.
+ * sequence strip images and pointcache. in this case only use the first
+ * file, this is needed for directory manipulation functions which might
+ * otherwise modify the same directory multiple times */
/* high level funcs */
diff --git a/source/blender/blenlib/BLI_callbacks.h b/source/blender/blenlib/BLI_callbacks.h
index 5322ce04a2e..7e4fad54cda 100644
--- a/source/blender/blenlib/BLI_callbacks.h
+++ b/source/blender/blenlib/BLI_callbacks.h
@@ -47,6 +47,8 @@ typedef enum {
BLI_CB_EVT_LOAD_POST,
BLI_CB_EVT_SAVE_PRE,
BLI_CB_EVT_SAVE_POST,
+ BLI_CB_EVT_SCENE_UPDATE_PRE,
+ BLI_CB_EVT_SCENE_UPDATE_POST,
BLI_CB_EVT_TOT
} eCbEvent;
diff --git a/source/blender/blenlib/BLI_math_rotation.h b/source/blender/blenlib/BLI_math_rotation.h
index aef1c4bb46c..fca7c3469a1 100644
--- a/source/blender/blenlib/BLI_math_rotation.h
+++ b/source/blender/blenlib/BLI_math_rotation.h
@@ -179,8 +179,8 @@ void dquat_to_mat4(float R[4][4], DualQuat *dq);
void quat_apply_track(float quat[4], short axis, short upflag);
void vec_apply_track(float vec[3], short axis);
-float lens_to_angle(float lens);
-float angle_to_lens(float angle);
+float focallength_to_fov(float focal_length, float sensor);
+float fov_to_focallength(float fov, float sensor);
float angle_wrap_rad(float angle);
float angle_wrap_deg(float angle);
diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h
index 97252247e4b..10a0787adf2 100644
--- a/source/blender/blenlib/BLI_threads.h
+++ b/source/blender/blenlib/BLI_threads.h
@@ -74,6 +74,7 @@ int BLI_system_thread_count(void); /* gets the number of threads the system can
#define LOCK_CUSTOM1 3
#define LOCK_RCACHE 4
#define LOCK_OPENGL 5
+#define LOCK_NODES 6
void BLI_lock_thread(int type);
void BLI_unlock_thread(int type);
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index 4711acbb600..5d54ffbeb36 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -148,4 +148,8 @@ if(WITH_OPENMP)
add_definitions(-DPARALLEL=1)
endif()
+if(WITH_XDG_USER_DIRS)
+ add_definitions(-DWITH_XDG_USER_DIRS)
+endif()
+
blender_add_lib(bf_blenlib "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c
index b7fe7ef5efd..259b25e67dd 100644
--- a/source/blender/blenlib/intern/bpath.c
+++ b/source/blender/blenlib/intern/bpath.c
@@ -499,6 +499,11 @@ void bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int fla
int len= MEM_allocN_len(se) / sizeof(*se);
int i;
+ if (flag & BPATH_TRAVERSE_SKIP_MULTIFILE) {
+ /* only operate on one path */
+ len= MIN2(1, len);
+ }
+
for(i= 0; i < len; i++, se++) {
rewrite_path_fixed_dirfile(seq->strip->dir, se->name, visit_cb, absbase, bpath_user_data);
}
diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c
index 0ca8b72c1e3..7fecbae8229 100644
--- a/source/blender/blenlib/intern/math_rotation.c
+++ b/source/blender/blenlib/intern/math_rotation.c
@@ -1688,14 +1688,14 @@ void vec_apply_track(float vec[3], short axis)
}
/* lens/angle conversion (radians) */
-float lens_to_angle(float lens)
+float focallength_to_fov(float focal_length, float sensor)
{
- return 2.0f * atanf(16.0f/lens);
+ return 2.0f * atanf((sensor/2.0f) / focal_length);
}
-float angle_to_lens(float angle)
+float fov_to_focallength(float hfov, float sensor)
{
- return 16.0f / tanf(angle * 0.5f);
+ return (sensor/2.0f) / tanf(hfov * 0.5f);
}
/* 'mod_inline(-3,4)= 1', 'fmod(-3,4)= -3' */
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index bbb62db58f2..7aa84523e9d 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -52,7 +52,7 @@
#include "GHOST_Path-api.h"
#if defined WIN32 && !defined _LIBC
-# include "BLI_fnmatch.h" /* use fnmatch included in blenlib */
+# include "BLI_fnmatch.h" /* use fnmatch included in blenlib */
#else
# ifndef _GNU_SOURCE
# define _GNU_SOURCE
@@ -61,35 +61,34 @@
#endif
#ifdef WIN32
-#include <io.h>
-
-#ifdef _WIN32_IE
-#undef _WIN32_IE
-#endif
-#define _WIN32_IE 0x0501
-#include <windows.h>
-#include <shlobj.h>
-
-#include "BLI_winstuff.h"
-
+# include <io.h>
+# ifdef _WIN32_IE
+# undef _WIN32_IE
+# endif
+# define _WIN32_IE 0x0501
+# include <windows.h>
+# include <shlobj.h>
+# include "BLI_winstuff.h"
#else /* non windows */
-
-#ifdef WITH_BINRELOC
-#include "binreloc.h"
-#endif
-
+# ifdef WITH_BINRELOC
+# include "binreloc.h"
+# endif
#endif /* WIN32 */
/* standard paths */
#ifdef WIN32
-#define BLENDER_USER_FORMAT "%s\\Blender Foundation\\Blender\\%s"
-#define BLENDER_SYSTEM_FORMAT "%s\\Blender Foundation\\Blender\\%s"
+# define BLENDER_USER_FORMAT "%s\\Blender Foundation\\Blender\\%s"
+# define BLENDER_SYSTEM_FORMAT "%s\\Blender Foundation\\Blender\\%s"
#elif defined(__APPLE__)
-#define BLENDER_USER_FORMAT "%s/Blender/%s"
-#define BLENDER_SYSTEM_FORMAT "%s/Blender/%s"
-#else
-#define BLENDER_USER_FORMAT "%s/.blender/%s"
-#define BLENDER_SYSTEM_FORMAT "%s/blender/%s"
+# define BLENDER_USER_FORMAT "%s/Blender/%s"
+# define BLENDER_SYSTEM_FORMAT "%s/Blender/%s"
+#else /* UNIX */
+# ifndef WITH_XDG_USER_DIRS /* oldschool unix ~/.blender/ */
+# define BLENDER_USER_FORMAT "%s/.blender/%s"
+# else /* new XDG ~/blender/.config/ */
+# define BLENDER_USER_FORMAT "%s/blender/%s"
+# endif // WITH_XDG_USER_DIRS
+# define BLENDER_SYSTEM_FORMAT "%s/blender/%s"
#endif
/* local */
@@ -797,10 +796,18 @@ void BLI_getlastdir(const char* dir, char *last, const size_t maxlen)
as default location to save documents */
const char *BLI_getDefaultDocumentFolder(void)
{
- #if !defined(WIN32)
+#ifndef WIN32
+
+#ifdef WITH_XDG_USER_DIRS
+ const char *xdg_documents_dir= getenv("XDG_DOCUMENTS_DIR");
+ if (xdg_documents_dir) {
+ return xdg_documents_dir;
+ }
+#endif
+
return getenv("HOME");
- #else /* Windows */
+#else /* Windows */
const char * ret;
static char documentfolder[MAXPATHLEN];
HRESULT hResult;
@@ -825,7 +832,7 @@ const char *BLI_getDefaultDocumentFolder(void)
}
return NULL;
- #endif
+#endif /* WIN32 */
}
/* NEW stuff, to be cleaned up when fully migrated */
diff --git a/source/blender/blenlib/intern/pbvh.c b/source/blender/blenlib/intern/pbvh.c
index 9471f096682..5a8e378e8c4 100644
--- a/source/blender/blenlib/intern/pbvh.c
+++ b/source/blender/blenlib/intern/pbvh.c
@@ -80,7 +80,7 @@ typedef struct {
struct PBVHNode {
/* Opaque handle for drawing code */
- void *draw_buffers;
+ GPU_Buffers *draw_buffers;
/* Voxel bounds */
BB vb;
diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c
index a125bf87534..d472f43accd 100644
--- a/source/blender/blenlib/intern/threads.c
+++ b/source/blender/blenlib/intern/threads.c
@@ -113,6 +113,7 @@ static pthread_mutex_t _viewer_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t _custom1_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t _rcache_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t _opengl_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t _nodes_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_t mainid;
static int thread_levels= 0; /* threads can be invoked inside threads */
@@ -347,6 +348,8 @@ void BLI_lock_thread(int type)
pthread_mutex_lock(&_rcache_lock);
else if (type==LOCK_OPENGL)
pthread_mutex_lock(&_opengl_lock);
+ else if (type==LOCK_NODES)
+ pthread_mutex_lock(&_nodes_lock);
}
void BLI_unlock_thread(int type)
@@ -363,6 +366,8 @@ void BLI_unlock_thread(int type)
pthread_mutex_unlock(&_rcache_lock);
else if(type==LOCK_OPENGL)
pthread_mutex_unlock(&_opengl_lock);
+ else if(type==LOCK_NODES)
+ pthread_mutex_unlock(&_nodes_lock);
}
/* Mutex Locks */
diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c
index 30625e7b34e..8b00d8e48a6 100644
--- a/source/blender/blenlib/intern/uvproject.c
+++ b/source/blender/blenlib/intern/uvproject.c
@@ -141,7 +141,7 @@ UvCameraInfo *project_camera_info(Object *ob, float (*rotmat)[4], float winx, fl
uci.do_pano = (camera->flag & CAM_PANORAMA);
uci.do_persp = (camera->type==CAM_PERSP);
- uci.camangle= lens_to_angle(camera->lens) / 2.0f;
+ uci.camangle= focallength_to_fov(camera->lens, camera->sensor_x) / 2.0f;
uci.camsize= uci.do_persp ? tanf(uci.camangle) : camera->ortho_scale;
/* account for scaled cameras */
diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h
index 1777979c3ab..38925ea5238 100644
--- a/source/blender/blenloader/BLO_readfile.h
+++ b/source/blender/blenloader/BLO_readfile.h
@@ -44,7 +44,6 @@ struct MemFile;
struct ReportList;
struct Scene;
struct SpaceFile;
-struct SpaceImaSel;
struct UserDef;
struct bContext;
struct BHead;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 629c6e8d3ca..2711c072a8f 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -141,6 +141,8 @@
#include "BLO_readfile.h"
#include "BLO_undofile.h"
+#include "RE_engine.h"
+
#include "readfile.h"
#include "PIL_time.h"
@@ -2181,6 +2183,7 @@ static void lib_verify_nodetree(Main *main, int UNUSED(open))
for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next)
if (ntree->update)
ntreeUpdateTree(ntree);
+
for (i=0; i < NUM_NTREE_TYPES; ++i) {
ntreetype= ntreeGetType(i);
if (ntreetype && ntreetype->foreach_nodetree)
@@ -2506,6 +2509,9 @@ static void lib_link_lamp(FileData *fd, Main *main)
}
la->ipo= newlibadr_us(fd, la->id.lib, la->ipo); // XXX depreceated - old animation system
+
+ if(la->nodetree)
+ lib_link_ntree(fd, &la->id, la->nodetree);
la->id.flag -= LIB_NEEDLINK;
}
@@ -2527,6 +2533,10 @@ static void direct_link_lamp(FileData *fd, Lamp *la)
la->curfalloff= newdataadr(fd, la->curfalloff);
if(la->curfalloff)
direct_link_curvemapping(fd, la->curfalloff);
+
+ la->nodetree= newdataadr(fd, la->nodetree);
+ if(la->nodetree)
+ direct_link_nodetree(fd, la->nodetree);
la->preview = direct_link_preview_image(fd, la->preview);
}
@@ -2669,6 +2679,9 @@ static void lib_link_world(FileData *fd, Main *main)
mtex->object= newlibadr(fd, wrld->id.lib, mtex->object);
}
}
+
+ if(wrld->nodetree)
+ lib_link_ntree(fd, &wrld->id, wrld->nodetree);
wrld->id.flag -= LIB_NEEDLINK;
}
@@ -2686,6 +2699,11 @@ static void direct_link_world(FileData *fd, World *wrld)
for(a=0; a<MAX_MTEX; a++) {
wrld->mtex[a]= newdataadr(fd, wrld->mtex[a]);
}
+
+ wrld->nodetree= newdataadr(fd, wrld->nodetree);
+ if(wrld->nodetree)
+ direct_link_nodetree(fd, wrld->nodetree);
+
wrld->preview = direct_link_preview_image(fd, wrld->preview);
}
@@ -4962,15 +4980,6 @@ static void lib_link_screen(FileData *fd, Main *main)
sfile->folders_prev= NULL;
sfile->folders_next= NULL;
}
- else if(sl->spacetype==SPACE_IMASEL) {
- SpaceImaSel *simasel= (SpaceImaSel *)sl;
-
- simasel->files = NULL;
- simasel->returnfunc= NULL;
- simasel->menup= NULL;
- simasel->pupmenu= NULL;
- simasel->img= NULL;
- }
else if(sl->spacetype==SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)sl;
bDopeSheet *ads= &saction->ads;
@@ -5034,11 +5043,6 @@ static void lib_link_screen(FileData *fd, Main *main)
}
}
}
- else if(sl->spacetype==SPACE_SOUND) {
- SpaceSound *ssound= (SpaceSound *)sl;
-
- ssound->sound= newlibadr_us(fd, sc->id.lib, ssound->sound);
- }
else if(sl->spacetype==SPACE_NODE) {
SpaceNode *snode= (SpaceNode *)sl;
@@ -5051,6 +5055,10 @@ static void lib_link_screen(FileData *fd, Main *main)
if(snode->id) {
if(GS(snode->id->name)==ID_MA)
snode->nodetree= ((Material *)snode->id)->nodetree;
+ else if(GS(snode->id->name)==ID_WO)
+ snode->nodetree= ((World *)snode->id)->nodetree;
+ else if(GS(snode->id->name)==ID_LA)
+ snode->nodetree= ((Lamp *)snode->id)->nodetree;
else if(GS(snode->id->name)==ID_SCE)
snode->nodetree= ((Scene *)snode->id)->nodetree;
else if(GS(snode->id->name)==ID_TE)
@@ -5138,6 +5146,7 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
if(sl->spacetype==SPACE_VIEW3D) {
View3D *v3d= (View3D*) sl;
BGpic *bgpic;
+ ARegion *ar;
if(v3d->scenelock)
v3d->camera= NULL; /* always get from scene */
@@ -5173,6 +5182,15 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
/* not very nice, but could help */
if((v3d->layact & v3d->lay)==0) v3d->layact= v3d->lay;
+ /* free render engines for now */
+ for(ar= sa->regionbase.first; ar; ar= ar->next) {
+ RegionView3D *rv3d= ar->regiondata;
+
+ if(rv3d && rv3d->render_engine) {
+ RE_engine_free(rv3d->render_engine);
+ rv3d->render_engine= NULL;
+ }
+ }
}
else if(sl->spacetype==SPACE_IPO) {
SpaceIpo *sipo= (SpaceIpo *)sl;
@@ -5195,12 +5213,6 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
SpaceFile *sfile= (SpaceFile *)sl;
sfile->op= NULL;
}
- else if(sl->spacetype==SPACE_IMASEL) {
- SpaceImaSel *simasel= (SpaceImaSel *)sl;
- if (simasel->files) {
- //XXX BIF_filelist_freelib(simasel->files);
- }
- }
else if(sl->spacetype==SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)sl;
@@ -5267,11 +5279,6 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
}
}
}
- else if(sl->spacetype==SPACE_SOUND) {
- SpaceSound *ssound= (SpaceSound *)sl;
-
- ssound->sound= restore_pointer_by_name(newmain, (ID *)ssound->sound, 1);
- }
else if(sl->spacetype==SPACE_NODE) {
SpaceNode *snode= (SpaceNode *)sl;
@@ -5322,6 +5329,7 @@ static void direct_link_region(FileData *fd, ARegion *ar, int spacetype)
rv3d->depths= NULL;
rv3d->ri= NULL;
+ rv3d->render_engine= NULL;
rv3d->sms= NULL;
rv3d->smooth_timer= NULL;
}
@@ -5463,6 +5471,10 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
v3d->afterdraw_xray.first= v3d->afterdraw_xray.last= NULL;
v3d->afterdraw_xraytransp.first= v3d->afterdraw_xraytransp.last= NULL;
v3d->properties_storage= NULL;
+
+ /* render can be quite heavy, set to wire on load */
+ if(v3d->drawtype == OB_RENDER)
+ v3d->drawtype = OB_WIRE;
view3d_split_250(v3d, &sl->regionbase);
}
@@ -6659,16 +6671,6 @@ static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
//ar->v2d.flag |= V2D_IS_INITIALISED;
break;
}
- case SPACE_SOUND:
- {
- SpaceSound *ssound= (SpaceSound *)sl;
- memcpy(&ar->v2d, &ssound->v2d, sizeof(View2D));
-
- ar->v2d.scroll |= (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL);
- ar->v2d.scroll |= (V2D_SCROLL_LEFT);
- //ar->v2d.flag |= V2D_IS_INITIALISED;
- break;
- }
case SPACE_NLA:
{
SpaceNla *snla= (SpaceNla *)sl;
@@ -6784,11 +6786,17 @@ static void do_versions_windowmanager_2_50(bScreen *screen)
area_add_window_regions(sa, sa->spacedata.first, &sa->regionbase);
- /* space imageselect is depricated */
+ /* space imageselect is deprecated */
for(sl= sa->spacedata.first; sl; sl= sl->next) {
if(sl->spacetype==SPACE_IMASEL)
- sl->spacetype= SPACE_INFO; /* spacedata then matches */
- }
+ sl->spacetype= SPACE_EMPTY; /* spacedata then matches */
+ }
+
+ /* space sound is deprecated */
+ for(sl= sa->spacedata.first; sl; sl= sl->next) {
+ if(sl->spacetype==SPACE_SOUND)
+ sl->spacetype= SPACE_EMPTY; /* spacedata then matches */
+ }
/* it seems to be possible in 2.5 to have this saved, filewindow probably */
sa->butspacetype= sa->spacetype;
@@ -7456,9 +7464,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(main->versionfile <= 200) {
Object *ob= main->object.first;
while(ob) {
- ob->scaflag = ob->gameflag & (64+128+256+512+1024+2048);
+ ob->scaflag = ob->gameflag & (OB_DO_FH|OB_ROT_FH|OB_ANISOTROPIC_FRICTION|OB_GHOST|OB_RIGID_BODY|OB_BOUNDS);
/* 64 is do_fh */
- ob->gameflag &= ~(128+256+512+1024+2048);
+ ob->gameflag &= ~(OB_ROT_FH|OB_ANISOTROPIC_FRICTION|OB_GHOST|OB_RIGID_BODY|OB_BOUNDS);
ob = ob->id.next;
}
}
@@ -8272,7 +8280,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(main->versionfile <= 233) {
bScreen *sc;
Material *ma= main->mat.first;
- Object *ob= main->object.first;
+ /* Object *ob= main->object.first; */
while(ma) {
if(ma->rampfac_col==0.0f) ma->rampfac_col= 1.0;
@@ -8282,11 +8290,12 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
/* this should have been done loooong before! */
+#if 0 /* deprecated in 2.5+ */
while(ob) {
if(ob->ipowin==0) ob->ipowin= ID_OB;
ob= ob->id.next;
}
-
+#endif
for (sc= main->screen.first; sc; sc= sc->id.next) {
ScrArea *sa;
for (sa= sc->areabase.first; sa; sa= sa->next) {
@@ -9188,7 +9197,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
if(main->versionfile <= 245) {
Scene *sce;
- bScreen *sc;
Object *ob;
Image *ima;
Lamp *la;
@@ -9278,49 +9286,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for(ima= main->image.first; ima; ima= ima->id.next) {
ima->preview = NULL;
}
-
- /* repair imasel space - completely reworked */
- for(sc= main->screen.first; sc; sc= sc->id.next) {
- ScrArea *sa;
- sa= sc->areabase.first;
- while(sa) {
- SpaceLink *sl;
-
- for (sl= sa->spacedata.first; sl; sl= sl->next) {
- if(sl->spacetype==SPACE_IMASEL) {
- SpaceImaSel *simasel= (SpaceImaSel*) sl;
- simasel->blockscale= 0.7f;
- /* view 2D */
- simasel->v2d.tot.xmin= -10.0f;
- simasel->v2d.tot.ymin= -10.0f;
- simasel->v2d.tot.xmax= (float)sa->winx + 10.0f;
- simasel->v2d.tot.ymax= (float)sa->winy + 10.0f;
- simasel->v2d.cur.xmin= 0.0f;
- simasel->v2d.cur.ymin= 0.0f;
- simasel->v2d.cur.xmax= (float)sa->winx;
- simasel->v2d.cur.ymax= (float)sa->winy;
- simasel->v2d.min[0]= 1.0;
- simasel->v2d.min[1]= 1.0;
- simasel->v2d.max[0]= 32000.0f;
- simasel->v2d.max[1]= 32000.0f;
- simasel->v2d.minzoom= 0.5f;
- simasel->v2d.maxzoom= 1.21f;
- simasel->v2d.scroll= 0;
- simasel->v2d.keepzoom= V2D_LIMITZOOM|V2D_KEEPASPECT;
- simasel->v2d.keeptot= 0;
- simasel->prv_h = 96;
- simasel->prv_w = 96;
- simasel->flag = 7; /* ??? elubie */
- BLI_strncpy (simasel->dir, U.textudir, sizeof(simasel->dir)); /* TON */
- simasel->file[0]= '\0';
-
- simasel->returnfunc = NULL;
- simasel->title[0] = 0;
- }
- }
- sa = sa->next;
- }
- }
}
/* add point caches */
@@ -10804,7 +10769,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
Object *ob=main->object.first;
while (ob) {
/* shaded mode disabled for now */
- if (ob->dt == OB_SHADED) ob->dt = OB_TEXTURE;
+ if (ob->dt == OB_MATERIAL) ob->dt = OB_TEXTURE;
ob=ob->id.next;
}
}
@@ -10819,7 +10784,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for(sl= sa->spacedata.first; sl; sl= sl->next) {
if(sl->spacetype==SPACE_VIEW3D) {
View3D *v3d = (View3D *)sl;
- if (v3d->drawtype == OB_SHADED) v3d->drawtype = OB_SOLID;
+ if (v3d->drawtype == OB_MATERIAL) v3d->drawtype = OB_SOLID;
}
}
}
@@ -12192,8 +12157,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
- /* put compatibility code here until next subversion bump */
- {
+ if (main->versionfile < 260){
{
/* set default alpha value of Image outputs in image and render layer nodes to 0 */
Scene *sce;
@@ -12226,6 +12190,31 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
}
+
+ }
+
+ if (main->versionfile < 260 || (main->versionfile == 260 && main->subversionfile < 1)){
+ Object *ob;
+
+ for (ob= main->object.first; ob; ob= ob->id.next) {
+ ob->collision_boundtype= ob->boundtype;
+ }
+
+ {
+ Camera *cam;
+ for(cam= main->camera.first; cam; cam= cam->id.next) {
+ if (cam->sensor_x < 0.01)
+ cam->sensor_x = DEFAULT_SENSOR_WIDTH;
+
+ if (cam->sensor_y < 0.01)
+ cam->sensor_y = DEFAULT_SENSOR_HEIGHT;
+ }
+ }
+ }
+
+ /* put compatibility code here until next subversion bump */
+ {
+
}
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
@@ -12814,6 +12803,9 @@ static void expand_lamp(FileData *fd, Main *mainvar, Lamp *la)
if (la->adt)
expand_animdata(fd, mainvar, la->adt);
+
+ if(la->nodetree)
+ expand_nodetree(fd, mainvar, la->nodetree);
}
static void expand_lattice(FileData *fd, Main *mainvar, Lattice *lt)
@@ -12841,6 +12833,9 @@ static void expand_world(FileData *fd, Main *mainvar, World *wrld)
if (wrld->adt)
expand_animdata(fd, mainvar, wrld->adt);
+
+ if(wrld->nodetree)
+ expand_nodetree(fd, mainvar, wrld->nodetree);
}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 6d7bac9ed44..cb94ebcf8f1 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1883,6 +1883,12 @@ static void write_worlds(WriteData *wd, ListBase *idbase)
for(a=0; a<MAX_MTEX; a++) {
if(wrld->mtex[a]) writestruct(wd, DATA, "MTex", 1, wrld->mtex[a]);
}
+
+ /* nodetree is integral part of lamps, no libdata */
+ if(wrld->nodetree) {
+ writestruct(wd, DATA, "bNodeTree", 1, wrld->nodetree);
+ write_nodetree(wd, wrld->nodetree);
+ }
write_previews(wd, wrld->preview);
}
@@ -1912,6 +1918,12 @@ static void write_lamps(WriteData *wd, ListBase *idbase)
if(la->curfalloff)
write_curvemapping(wd, la->curfalloff);
+ /* nodetree is integral part of lamps, no libdata */
+ if(la->nodetree) {
+ writestruct(wd, DATA, "bNodeTree", 1, la->nodetree);
+ write_nodetree(wd, la->nodetree);
+ }
+
write_previews(wd, la->preview);
}
@@ -2231,10 +2243,6 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
if(sima->cumap)
write_curvemapping(wd, sima->cumap);
}
- else if(sl->spacetype==SPACE_IMASEL) {
- // XXX: depreceated... do we still want to keep this?
- writestruct(wd, DATA, "SpaceImaSel", 1, sl);
- }
else if(sl->spacetype==SPACE_TEXT) {
writestruct(wd, DATA, "SpaceText", 1, sl);
}
@@ -2246,9 +2254,6 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
else if(sl->spacetype==SPACE_ACTION) {
writestruct(wd, DATA, "SpaceAction", 1, sl);
}
- else if(sl->spacetype==SPACE_SOUND) {
- writestruct(wd, DATA, "SpaceSound", 1, sl);
- }
else if(sl->spacetype==SPACE_NLA){
SpaceNla *snla= (SpaceNla *)sl;
diff --git a/source/blender/collada/CameraExporter.cpp b/source/blender/collada/CameraExporter.cpp
index 6fa2c8763e0..fcb98cc7c32 100644
--- a/source/blender/collada/CameraExporter.cpp
+++ b/source/blender/collada/CameraExporter.cpp
@@ -71,7 +71,7 @@ void CamerasExporter::operator()(Object *ob, Scene *sce)
if (cam->type == CAM_PERSP) {
COLLADASW::PerspectiveOptic persp(mSW);
- persp.setXFov(RAD2DEGF(lens_to_angle(cam->lens)), "xfov");
+ persp.setXFov(RAD2DEGF(focallength_to_fov(cam->lens, cam->sensor_x)), "xfov");
persp.setAspectRatio((float)(sce->r.xsch)/(float)(sce->r.ysch),false,"aspect_ratio");
persp.setZFar(cam->clipend, false , "zfar");
persp.setZNear(cam->clipsta,false , "znear");
diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp
index 8d133979fa4..8cdb1065699 100644
--- a/source/blender/collada/DocumentImporter.cpp
+++ b/source/blender/collada/DocumentImporter.cpp
@@ -814,7 +814,7 @@ bool DocumentImporter::writeCamera( const COLLADAFW::Camera* camera )
double aspect = camera->getAspectRatio().getValue();
double xfov = aspect*yfov;
// xfov is in degrees, cam->lens is in millimiters
- cam->lens = angle_to_lens(DEG2RADF(xfov));
+ cam->lens = fov_to_focallength(DEG2RADF(xfov), cam->sensor_x);
}
break;
}
@@ -835,7 +835,7 @@ bool DocumentImporter::writeCamera( const COLLADAFW::Camera* camera )
{
double x = camera->getXFov().getValue();
// x is in degrees, cam->lens is in millimiters
- cam->lens = angle_to_lens(DEG2RADF(x));
+ cam->lens = fov_to_focallength(DEG2RADF(x), cam->sensor_x);
}
break;
}
@@ -852,7 +852,7 @@ bool DocumentImporter::writeCamera( const COLLADAFW::Camera* camera )
{
double yfov = camera->getYFov().getValue();
// yfov is in degrees, cam->lens is in millimiters
- cam->lens = angle_to_lens(DEG2RADF(yfov));
+ cam->lens = fov_to_focallength(DEG2RADF(yfov), cam->sensor_x);
}
break;
}
diff --git a/source/blender/editors/CMakeLists.txt b/source/blender/editors/CMakeLists.txt
index 16c0d4a2c79..7b7d11bd487 100644
--- a/source/blender/editors/CMakeLists.txt
+++ b/source/blender/editors/CMakeLists.txt
@@ -46,7 +46,6 @@ if(WITH_BLENDER)
add_subdirectory(space_outliner)
add_subdirectory(space_script)
add_subdirectory(space_sequencer)
- add_subdirectory(space_sound)
add_subdirectory(space_text)
add_subdirectory(space_time)
add_subdirectory(space_userpref)
diff --git a/source/blender/editors/SConscript b/source/blender/editors/SConscript
index e8159bdf03f..a1b766ec2be 100644
--- a/source/blender/editors/SConscript
+++ b/source/blender/editors/SConscript
@@ -25,7 +25,6 @@ SConscript(['datafiles/SConscript',
'space_outliner/SConscript',
'space_time/SConscript',
'space_view3d/SConscript',
- 'space_sound/SConscript',
'space_action/SConscript',
'space_nla/SConscript',
'space_script/SConscript',
diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c
index 5345fcd756d..4a359acabd9 100644
--- a/source/blender/editors/animation/anim_markers.c
+++ b/source/blender/editors/animation/anim_markers.c
@@ -777,7 +777,7 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
fac= ((float)(evt->x - mm->firstx)*dx);
- if (ELEM(mm->slink->spacetype, SPACE_TIME, SPACE_SOUND))
+ if (mm->slink->spacetype == SPACE_TIME)
apply_keyb_grid(evt->shift, evt->ctrl, &fac, 0.0, FPS, 0.1*FPS, 0);
else
apply_keyb_grid(evt->shift, evt->ctrl, &fac, 0.0, 1.0, 0.1, 0 /*was: U.flag & USER_AUTOGRABGRID*/);
@@ -796,7 +796,7 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
if (totmark==1) {
/* we print current marker value */
- if (ELEM(mm->slink->spacetype, SPACE_TIME, SPACE_SOUND)) {
+ if (mm->slink->spacetype == SPACE_TIME) {
SpaceTime *stime= (SpaceTime *)mm->slink;
if (stime->flag & TIME_DRAWFRAMES)
BLI_snprintf(str, sizeof(str), "Marker %d offset %d", selmarker->frame, offs);
@@ -816,7 +816,7 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
}
else {
/* we only print the offset */
- if (ELEM(mm->slink->spacetype, SPACE_TIME, SPACE_SOUND)) {
+ if (mm->slink->spacetype == SPACE_TIME) {
SpaceTime *stime= (SpaceTime *)mm->slink;
if (stime->flag & TIME_DRAWFRAMES)
BLI_snprintf(str, sizeof(str), "Marker offset %d ", offs);
diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c
index be6b322e6b4..95f3bb55ba5 100644
--- a/source/blender/editors/curve/curve_ops.c
+++ b/source/blender/editors/curve/curve_ops.c
@@ -223,7 +223,6 @@ void ED_keymap_curve(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "CURVE_OT_tilt_clear", TKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "TRANSFORM_OT_tilt", TKEY, KM_PRESS, KM_CTRL, 0);
- RNA_enum_set(WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", TKEY, KM_PRESS, KM_CTRL, 0)->ptr, "mode", TFM_TILT);
RNA_enum_set(WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", TFM_CURVE_SHRINKFATTEN);
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 4087002598e..4a12206d404 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -2812,12 +2812,7 @@ void CURVE_OT_select_inverse(wmOperatorType *ot)
/** Divide the line segments associated with the currently selected
* curve nodes (Bezier or NURB). If there are no valid segment
* selections within the current selection, nothing happens.
- *
- * @deffunc subdividenurb subdivideNurb(void)
- * @return Nothing
- * @param None
-*/
-
+ */
static void subdividenurb(Object *obedit, int number_cuts)
{
Curve *cu= obedit->data;
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index 28650452b3f..d2ac24cd9da 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -209,7 +209,7 @@ void ED_vgroup_select_by_name(struct Object *ob, const char *name);
int ED_vgroup_data_create(struct ID *id);
int ED_vgroup_give_array(struct ID *id, struct MDeformVert **dvert_arr, int *dvert_tot);
int ED_vgroup_copy_array(struct Object *ob, struct Object *ob_from);
-void ED_vgroup_mirror(struct Object *ob, const short mirror_weights, const short flip_vgroups);
+void ED_vgroup_mirror(struct Object *ob, const short mirror_weights, const short flip_vgroups, const short all_vgroups);
int ED_vgroup_object_is_edit_mode(struct Object *ob);
diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h
index b6cb59e2f4a..18bb4975da9 100644
--- a/source/blender/editors/include/ED_node.h
+++ b/source/blender/editors/include/ED_node.h
@@ -51,7 +51,7 @@ void ED_node_changed_update(struct ID *id, struct bNode *node);
void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node);
/* node_edit.c */
-void ED_node_shader_default(struct Material *ma);
+void ED_node_shader_default(struct Scene *scene, struct ID *id);
void ED_node_composit_default(struct Scene *sce);
void ED_node_texture_default(struct Tex *tex);
void ED_node_link_intersect_test(struct ScrArea *sa, int test);
diff --git a/source/blender/editors/include/ED_render.h b/source/blender/editors/include/ED_render.h
index 651c298ad5e..7461f5e9e9f 100644
--- a/source/blender/editors/include/ED_render.h
+++ b/source/blender/editors/include/ED_render.h
@@ -44,6 +44,8 @@ void ED_operatortypes_render(void);
/* render_shading.c */
void ED_render_id_flush_update(struct Main *bmain, struct ID *id);
+void ED_render_engine_changed(struct Main *bmain);
+void ED_render_engine_update_tagged(struct bContext *C, struct Main *bmain);
/* render_preview.c */
@@ -54,7 +56,7 @@ typedef struct RenderInfo {
short curtile, tottile, status;
rcti disprect; /* storage for view3d preview rect */
unsigned int* rect;
- struct Render *re; /* persistant render */
+ struct Render *re; /* persistent render */
} RenderInfo;
/* ri->status */
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index f92ee724f6f..05537004927 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -159,6 +159,7 @@ int ED_operator_editmesh_view3d(struct bContext *C);
int ED_operator_editmesh_region_view3d(struct bContext *C);
int ED_operator_editarmature(struct bContext *C);
int ED_operator_editcurve(struct bContext *C);
+int ED_operator_editcurve_3d(struct bContext *C);
int ED_operator_editsurf(struct bContext *C);
int ED_operator_editsurfcurve(struct bContext *C);
int ED_operator_editsurfcurve_region_view3d(struct bContext *C);
diff --git a/source/blender/editors/include/ED_space_api.h b/source/blender/editors/include/ED_space_api.h
index 5c42dfc5d05..8e445ab1cee 100644
--- a/source/blender/editors/include/ED_space_api.h
+++ b/source/blender/editors/include/ED_space_api.h
@@ -46,7 +46,6 @@ void ED_spacetype_node(void);
void ED_spacetype_buttons(void);
void ED_spacetype_info(void);
void ED_spacetype_file(void);
-void ED_spacetype_sound(void);
void ED_spacetype_action(void);
void ED_spacetype_nla(void);
void ED_spacetype_script(void);
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index f69abb0996a..e43ad964c9c 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -130,7 +130,6 @@ void ED_view3d_win_to_segment_clip(struct ARegion *ar, struct View3D *v3d, const
* In orthographic view the resulting ray_normal will match the view vector.
* @param ar The region (used for the window width and height).
* @param v3d The 3d viewport (used for near clipping value).
- * @param out The resulting normalized world-space direction vector.
* @param mval The area relative 2d location (such as event->mval, converted into float[2]).
* @param ray_start The world-space starting point of the segment.
* @param ray_normal The normalized world-space direction of towards mval.
@@ -140,7 +139,7 @@ void ED_view3d_win_to_ray(struct ARegion *ar, struct View3D *v3d, const float mv
/**
* Calculate a normalized 3d direction vector from the viewpoint towards a global location.
* In orthographic view the resulting vector will match the view vector.
- * @param ar The region (used for the window width and height).
+ * @param rv3d The region (used for the window width and height).
* @param coord The world-space location.
* @param vec The resulting normalized vector.
*/
@@ -171,6 +170,7 @@ void ED_view3d_from_m4(float mat[][4], float ofs[3], float quat[4], float *dist)
* @param ofs The view offset to be set, normally from RegionView3D.ofs.
* @param quat The view rotation to be set, quaternion normally from RegionView3D.viewquat.
* @param dist The view distance from ofs to be set, normally from RegionView3D.dist.
+ * @param lens The view lens angle set for cameras and lamps, normally from View3D.lens.
*/
void ED_view3d_from_object(struct Object *ob, float ofs[3], float quat[4], float *dist, float *lens);
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 5b27fe88b4b..eff4d1f6397 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -962,6 +962,7 @@ void uiDrawBlock(const bContext *C, uiBlock *block)
ARegion *ar;
uiBut *but;
rcti rect;
+ int multisample_enabled;
/* get menu region or area region */
ar= CTX_wm_menu(C);
@@ -971,6 +972,11 @@ void uiDrawBlock(const bContext *C, uiBlock *block)
if(!block->endblock)
uiEndBlock(C, block);
+ /* disable AA, makes widgets too blurry */
+ multisample_enabled= glIsEnabled(GL_MULTISAMPLE_ARB);
+ if(multisample_enabled)
+ glDisable(GL_MULTISAMPLE_ARB);
+
/* we set this only once */
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -1015,6 +1021,9 @@ void uiDrawBlock(const bContext *C, uiBlock *block)
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
+
+ if(multisample_enabled)
+ glEnable(GL_MULTISAMPLE_ARB);
ui_draw_links(block);
}
@@ -2560,10 +2569,12 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, const char *str,
if(block->curlayout)
ui_layout_add_but(block->curlayout, but);
+#ifdef WITH_PYTHON
/* if the 'UI_OT_editsource' is running, extract the source info from the button */
if (UI_editsource_enable_check()) {
UI_editsource_active_but_test(but);
}
+#endif
return but;
}
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index e49cb4898d9..0ba141163b3 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -3216,6 +3216,63 @@ static int ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, int mx,
return changed;
}
+static void ui_ndofedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, wmNDOFMotionData *ndof, int shift)
+{
+ float *hsv= ui_block_hsv_get(but->block);
+ float rgb[3];
+ float sensitivity = (shift?0.15:0.3) * ndof->dt;
+
+ int color_profile = but->block->color_profile;
+
+ if (but->rnaprop) {
+ if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
+ color_profile = BLI_PR_NONE;
+ }
+
+ ui_get_but_vectorf(but, rgb);
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+
+ switch((int)but->a1) {
+ case UI_GRAD_SV:
+ hsv[2] += ndof->ry * sensitivity;
+ hsv[1] += ndof->rx * sensitivity;
+ break;
+ case UI_GRAD_HV:
+ hsv[0] += ndof->ry * sensitivity;
+ hsv[2] += ndof->rx * sensitivity;
+ break;
+ case UI_GRAD_HS:
+ hsv[0] += ndof->ry * sensitivity;
+ hsv[1] += ndof->rx * sensitivity;
+ break;
+ case UI_GRAD_H:
+ hsv[0] += ndof->ry * sensitivity;
+ break;
+ case UI_GRAD_S:
+ hsv[1] += ndof->ry * sensitivity;
+ break;
+ case UI_GRAD_V:
+ hsv[2] += ndof->ry * sensitivity;
+ break;
+ case UI_GRAD_V_ALT:
+ /* vertical 'value' strip */
+
+ /* exception only for value strip - use the range set in but->min/max */
+ hsv[2] += ndof->rx * sensitivity;
+
+ if (color_profile)
+ hsv[2] = srgb_to_linearrgb(hsv[2]);
+
+ CLAMP(hsv[2], but->softmin, but->softmax);
+ default:
+ assert(!"invalid hsv type");
+ }
+
+ hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2);
+ copy_v3_v3(data->vec, rgb);
+ ui_set_but_vectorf(but, data->vec);
+}
+
static int ui_do_but_HSVCUBE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event)
{
int mx, my;
@@ -3238,8 +3295,18 @@ static int ui_do_but_HSVCUBE(bContext *C, uiBlock *block, uiBut *but, uiHandleBu
return WM_UI_HANDLER_BREAK;
}
+ else if (event->type == NDOF_MOTION) {
+ wmNDOFMotionData *ndof = (wmNDOFMotionData*) event->customdata;
+
+ ui_ndofedit_but_HSVCUBE(but, data, ndof, event->shift);
+
+ button_activate_state(C, but, BUTTON_STATE_EXIT);
+ ui_apply_button(C, but->block, but, data, 1);
+
+ return WM_UI_HANDLER_BREAK;
+ }
/* XXX hardcoded keymap check.... */
- else if (ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
+ else if (event->type == DELKEY && event->val == KM_PRESS) {
if (but->a1==UI_GRAD_V_ALT){
int len;
@@ -3337,11 +3404,62 @@ static int ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, int mx
return changed;
}
+static void ui_ndofedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, wmNDOFMotionData *ndof, int shift)
+{
+ float *hsv= ui_block_hsv_get(but->block);
+ float rgb[3];
+ float phi, r /*, sqr */ /* UNUSED */, v[2];
+ float sensitivity = (shift ? 0.15f : 0.3f) * ndof->dt;
+
+ ui_get_but_vectorf(but, rgb);
+ rgb_to_hsv_compat(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+
+ /* Convert current colour on hue/sat disc to circular coordinates phi, r */
+ phi = fmodf(hsv[0]+0.25f, 1.0f) * -2.0f*M_PI;
+ r = hsv[1];
+ /* sqr= r>0.f?sqrtf(r):1; */ /* UNUSED */
+
+ /* Convert to 2d vectors */
+ v[0] = r * cosf(phi);
+ v[1] = r * sinf(phi);
+
+ /* Use ndof device y and x rotation to move the vector in 2d space */
+ v[0] += ndof->ry * sensitivity;
+ v[1] += ndof->rx * sensitivity;
+
+ /* convert back to polar coords on circle */
+ phi = atan2(v[0], v[1])/(2.0f*(float)M_PI) + 0.5f;
+
+ /* use ndof z rotation to additionally rotate hue */
+ phi -= ndof->rz * sensitivity * 0.5f;
+
+ r = len_v2(v);
+ CLAMP(r, 0.0f, 1.0f);
+
+ /* convert back to hsv values, in range [0,1] */
+ hsv[0] = fmodf(phi, 1.0f);
+ hsv[1] = r;
+
+ /* exception, when using color wheel in 'locked' value state:
+ * allow choosing a hue for black values, by giving a tiny increment */
+ if (but->flag & UI_BUT_COLOR_LOCK) { // lock
+ if (hsv[2] == 0.0f) hsv[2] = 0.0001f;
+ }
+
+ hsv_to_rgb(hsv[0], hsv[1], hsv[2], data->vec, data->vec+1, data->vec+2);
+
+ if((but->flag & UI_BUT_VEC_SIZE_LOCK) && (data->vec[0] || data->vec[1] || data->vec[2])) {
+ normalize_v3(data->vec);
+ mul_v3_fl(data->vec, but->a2);
+ }
+
+ ui_set_but_vectorf(but, data->vec);
+}
+
static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandleButtonData *data, wmEvent *event)
{
int mx, my;
-
mx= event->x;
my= event->y;
ui_window_to_block(data->region, block, &mx, &my);
@@ -3360,8 +3478,18 @@ static int ui_do_but_HSVCIRCLE(bContext *C, uiBlock *block, uiBut *but, uiHandle
return WM_UI_HANDLER_BREAK;
}
+ else if (event->type == NDOF_MOTION) {
+ wmNDOFMotionData *ndof = (wmNDOFMotionData*) event->customdata;
+
+ ui_ndofedit_but_HSVCIRCLE(but, data, ndof, event->shift);
+
+ button_activate_state(C, but, BUTTON_STATE_EXIT);
+ ui_apply_button(C, but->block, but, data, 1);
+
+ return WM_UI_HANDLER_BREAK;
+ }
/* XXX hardcoded keymap check.... */
- else if (ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
+ else if (event->type == DELKEY && event->val == KM_PRESS) {
int len;
/* reset only saturation */
@@ -3810,7 +3938,7 @@ static int ui_do_but_HISTOGRAM(bContext *C, uiBlock *block, uiBut *but, uiHandle
return WM_UI_HANDLER_BREAK;
}
/* XXX hardcoded keymap check.... */
- else if (ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
+ else if (event->type == DELKEY && event->val == KM_PRESS) {
Histogram *hist = (Histogram *)but->poin;
hist->ymax = 1.f;
@@ -3893,7 +4021,7 @@ static int ui_do_but_WAVEFORM(bContext *C, uiBlock *block, uiBut *but, uiHandleB
return WM_UI_HANDLER_BREAK;
}
/* XXX hardcoded keymap check.... */
- else if (ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) {
+ else if (event->type == DELKEY && event->val == KM_PRESS) {
Scopes *scopes = (Scopes *)but->poin;
scopes->wavefrm_yfac = 1.f;
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index 27f94ae8e49..5803054caa7 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -43,6 +43,7 @@
#include "BLI_utildefines.h"
#include "BKE_context.h"
+#include "BKE_screen.h"
#include "BKE_global.h"
#include "BKE_text.h" /* for UI_OT_reports_to_text */
#include "BKE_report.h"
@@ -476,6 +477,7 @@ static void UI_OT_reports_to_textblock(wmOperatorType *ot)
ot->exec= reports_to_text_exec;
}
+#ifdef WITH_PYTHON
/* ------------------------------------------------------------------------- */
/* EditSource Utility funcs and operator,
@@ -576,24 +578,6 @@ void UI_editsource_active_but_test(uiBut *but)
/* editsource operator component */
-static ScrArea *biggest_text_view(bContext *C)
-{
- bScreen *sc= CTX_wm_screen(C);
- ScrArea *sa, *big= NULL;
- int size, maxsize= 0;
-
- for(sa= sc->areabase.first; sa; sa= sa->next) {
- if(sa->spacetype==SPACE_TEXT) {
- size= sa->winx * sa->winy;
- if(size > maxsize) {
- maxsize= size;
- big= sa;
- }
- }
- }
- return big;
-}
-
static int editsource_text_edit(bContext *C, wmOperator *op,
char filepath[240], int line)
{
@@ -618,7 +602,7 @@ static int editsource_text_edit(bContext *C, wmOperator *op,
else {
/* naughty!, find text area to set, not good behavior
* but since this is a dev tool lets allow it - campbell */
- ScrArea *sa= biggest_text_view(C);
+ ScrArea *sa= BKE_screen_find_big_area(CTX_wm_screen(C), SPACE_TEXT, 0);
if(sa) {
SpaceText *st= sa->spacedata.first;
st->text= text;
@@ -711,6 +695,7 @@ static void UI_OT_editsource(wmOperatorType *ot)
ot->exec= editsource_exec;
}
+#endif /* WITH_PYTHON */
/* ********************************************************* */
/* Registration */
@@ -723,6 +708,9 @@ void UI_buttons_operatortypes(void)
WM_operatortype_append(UI_OT_reset_default_button);
WM_operatortype_append(UI_OT_copy_to_selected_button);
WM_operatortype_append(UI_OT_reports_to_textblock); // XXX: temp?
+
+#ifdef WITH_PYTHON
WM_operatortype_append(UI_OT_editsource);
+#endif
}
diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c
index d3a5c6691ef..921a1879bb7 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -129,18 +129,12 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo
case SPACE_IMAGE:
ts= &btheme->tima;
break;
- case SPACE_IMASEL:
- ts= &btheme->timasel;
- break;
case SPACE_TEXT:
ts= &btheme->text;
break;
case SPACE_OUTLINER:
ts= &btheme->toops;
break;
- case SPACE_SOUND:
- ts= &btheme->tsnd;
- break;
case SPACE_INFO:
ts= &btheme->tinfo;
break;
@@ -528,12 +522,10 @@ static void ui_theme_init_new(bTheme *btheme)
ui_theme_init_new_do(&btheme->tfile);
ui_theme_init_new_do(&btheme->tipo);
ui_theme_init_new_do(&btheme->tinfo);
- ui_theme_init_new_do(&btheme->tsnd);
ui_theme_init_new_do(&btheme->tact);
ui_theme_init_new_do(&btheme->tnla);
ui_theme_init_new_do(&btheme->tseq);
ui_theme_init_new_do(&btheme->tima);
- ui_theme_init_new_do(&btheme->timasel);
ui_theme_init_new_do(&btheme->text);
ui_theme_init_new_do(&btheme->toops);
ui_theme_init_new_do(&btheme->ttime);
@@ -731,18 +723,6 @@ void ui_theme_init_default(void)
SETCOL(btheme->tima.editmesh_active, 255, 255, 255, 128);
SETCOLF(btheme->tima.preview_back, 0.45, 0.45, 0.45, 1.0);
- /* space imageselect */
- btheme->timasel= btheme->tv3d;
- SETCOL(btheme->timasel.active, 195, 195, 195, 255); /* active tile */
- SETCOL(btheme->timasel.grid, 94, 94, 94, 255); /* active file text */
- SETCOL(btheme->timasel.back, 110, 110, 110, 255);
- SETCOL(btheme->timasel.shade1, 94, 94, 94, 255); /* bar */
- SETCOL(btheme->timasel.shade2, 172, 172, 172, 255); /* sliders */
- SETCOL(btheme->timasel.hilite, 17, 27, 60, 100); /* selected tile */
- SETCOL(btheme->timasel.text, 0, 0, 0, 255);
- SETCOL(btheme->timasel.text_hi, 255, 255, 255, 255);
- SETCOL(btheme->timasel.panel, 132, 132, 132, 255);
-
/* space text */
btheme->text= btheme->tv3d;
SETCOL(btheme->text.back, 153, 153, 153, 255);
@@ -778,15 +758,11 @@ void ui_theme_init_default(void)
SETCOL(btheme->tconsole.console_error, 220, 96, 96, 255);
SETCOL(btheme->tconsole.console_cursor, 220, 96, 96, 255);
-
- /* space sound */
- btheme->tsnd= btheme->tv3d;
- SETCOLF(btheme->tsnd.back, 0.45, 0.45, 0.45, 1.0);
- SETCOLF(btheme->tsnd.grid, 0.36, 0.36, 0.36, 1.0);
- SETCOL(btheme->tsnd.shade1, 173, 173, 173, 255); // sliders
-
/* space time */
- btheme->ttime= btheme->tsnd; // same as sound space
+ btheme->ttime= btheme->tv3d;
+ SETCOLF(btheme->ttime.back, 0.45, 0.45, 0.45, 1.0);
+ SETCOLF(btheme->ttime.grid, 0.36, 0.36, 0.36, 1.0);
+ SETCOL(btheme->ttime.shade1, 173, 173, 173, 255); // sliders
/* space node, re-uses syntax color storage */
btheme->tnode= btheme->tv3d;
@@ -801,7 +777,6 @@ void ui_theme_init_default(void)
/* space logic */
btheme->tlogic= btheme->tv3d;
SETCOL(btheme->tlogic.back, 100, 100, 100, 255);
-
}
@@ -1193,7 +1168,11 @@ void init_userdef_do_versions(void)
for(btheme= U.themes.first; btheme; btheme= btheme->next) {
/* check for alpha==0 is safe, then color was never set */
if(btheme->ttime.back[3]==0) {
- btheme->ttime = btheme->tsnd; // copy from sound
+ // copied from ui_theme_init_default
+ btheme->ttime= btheme->tv3d;
+ SETCOLF(btheme->ttime.back, 0.45, 0.45, 0.45, 1.0);
+ SETCOLF(btheme->ttime.grid, 0.36, 0.36, 0.36, 1.0);
+ SETCOL(btheme->ttime.shade1, 173, 173, 173, 255); // sliders
}
if(btheme->text.syntaxn[3]==0) {
SETCOL(btheme->text.syntaxn, 0, 0, 200, 255); /* Numbers Blue*/
@@ -1320,7 +1299,7 @@ void init_userdef_do_versions(void)
SETCOL(btheme->tact.cframe, 0x60, 0xc0, 0x40, 255);
SETCOL(btheme->tnla.cframe, 0x60, 0xc0, 0x40, 255);
SETCOL(btheme->tseq.cframe, 0x60, 0xc0, 0x40, 255);
- SETCOL(btheme->tsnd.cframe, 0x60, 0xc0, 0x40, 255);
+ //SETCOL(btheme->tsnd.cframe, 0x60, 0xc0, 0x40, 255); Not needed anymore
SETCOL(btheme->ttime.cframe, 0x60, 0xc0, 0x40, 255);
}
}
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 5455bf966ef..99af17c161e 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -1456,11 +1456,11 @@ void MESH_OT_delete(wmOperatorType *ot)
/* calculates offset for co, based on fractal, sphere or smooth settings */
static void alter_co(float *co, EditEdge *edge, float smooth, float fractal, int beauty, float perc)
{
- float vec1[3], fac;
+ float tvec[3], fac;
if(beauty & B_SMOOTH) {
- /* we calculate an offset vector vec1[], to be added to *co */
- float len, fac, nor[3], nor1[3], nor2[3];
+ /* we calculate an offset vector tvec[], to be added to *co */
+ float len, nor[3], nor1[3], nor2[3];
sub_v3_v3v3(nor, edge->v1->co, edge->v2->co);
len= 0.5f*normalize_v3(nor);
@@ -1469,43 +1469,31 @@ static void alter_co(float *co, EditEdge *edge, float smooth, float fractal, int
copy_v3_v3(nor2, edge->v2->no);
/* cosine angle */
- fac= nor[0]*nor1[0] + nor[1]*nor1[1] + nor[2]*nor1[2] ;
-
- vec1[0]= fac*nor1[0];
- vec1[1]= fac*nor1[1];
- vec1[2]= fac*nor1[2];
+ fac= dot_v3v3(nor, nor1);
+ mul_v3_v3fl(tvec, nor1, fac);
/* cosine angle */
- fac= -nor[0]*nor2[0] - nor[1]*nor2[1] - nor[2]*nor2[2] ;
-
- vec1[0]+= fac*nor2[0];
- vec1[1]+= fac*nor2[1];
- vec1[2]+= fac*nor2[2];
+ fac= -dot_v3v3(nor, nor2);
+ madd_v3_v3fl(tvec, nor2, fac);
/* falloff for multi subdivide */
smooth *= sqrtf(fabs(1.0f - 2.0f*fabsf(0.5f-perc)));
- vec1[0]*= smooth*len;
- vec1[1]*= smooth*len;
- vec1[2]*= smooth*len;
+ mul_v3_fl(tvec, smooth * len);
- co[0] += vec1[0];
- co[1] += vec1[1];
- co[2] += vec1[2];
+ add_v3_v3(co, tvec);
}
else if(beauty & B_SPHERE) { /* subdivide sphere */
normalize_v3(co);
- co[0]*= smooth;
- co[1]*= smooth;
- co[2]*= smooth;
+ mul_v3_fl(co, smooth);
}
if(beauty & B_FRACTAL) {
fac= fractal*len_v3v3(edge->v1->co, edge->v2->co);
- vec1[0]= fac*(float)(0.5-BLI_drand());
- vec1[1]= fac*(float)(0.5-BLI_drand());
- vec1[2]= fac*(float)(0.5-BLI_drand());
- add_v3_v3(co, vec1);
+ tvec[0]= fac*(float)(0.5-BLI_drand());
+ tvec[1]= fac*(float)(0.5-BLI_drand());
+ tvec[2]= fac*(float)(0.5-BLI_drand());
+ add_v3_v3(co, tvec);
}
}
@@ -1517,9 +1505,7 @@ static EditVert *subdivide_edge_addvert(EditMesh *em, EditEdge *edge, float smoo
EditVert *ev;
float co[3];
- co[0] = (edge->v2->co[0]-edge->v1->co[0])*percent + edge->v1->co[0];
- co[1] = (edge->v2->co[1]-edge->v1->co[1])*percent + edge->v1->co[1];
- co[2] = (edge->v2->co[2]-edge->v1->co[2])*percent + edge->v1->co[2];
+ interp_v3_v3v3(co, edge->v1->co, edge->v2->co, percent);
/* offset for smooth or sphere or fractal */
alter_co(co, edge, smooth, fractal, beauty, percent);
@@ -1543,9 +1529,7 @@ static EditVert *subdivide_edge_addvert(EditMesh *em, EditEdge *edge, float smoo
EM_data_interp_from_verts(em, edge->v1, edge->v2, ev, percent);
/* normal */
- ev->no[0] = (edge->v2->no[0]-edge->v1->no[0])*percent + edge->v1->no[0];
- ev->no[1] = (edge->v2->no[1]-edge->v1->no[1])*percent + edge->v1->no[1];
- ev->no[2] = (edge->v2->no[2]-edge->v1->no[2])*percent + edge->v1->no[2];
+ interp_v3_v3v3(ev->no, edge->v1->no, edge->v2->no, percent);
normalize_v3(ev->no);
return ev;
@@ -6986,12 +6970,12 @@ static void beautify_fill(EditMesh *em)
w= EM_face_from_faces(em, efaa[0], efaa[1],
vindex[0], vindex[1], 4+vindex[2], -1);
- w->f |= SELECT;
+ EM_select_face(w, 1);
w= EM_face_from_faces(em, efaa[0], efaa[1],
vindex[0], 4+vindex[2], 4+vindex[3], -1);
- w->f |= SELECT;
+ EM_select_face(w, 1);
onedone= 1;
}
@@ -7007,12 +6991,11 @@ static void beautify_fill(EditMesh *em)
w= EM_face_from_faces(em, efaa[0], efaa[1],
vindex[1], 4+vindex[2], 4+vindex[3], -1);
- w->f |= SELECT;
-
+ EM_select_face(w, 1);
w= EM_face_from_faces(em, efaa[0], efaa[1],
vindex[0], 4+vindex[1], 4+vindex[3], -1);
- w->f |= SELECT;
+ EM_select_face(w, 1);
onedone= 1;
}
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 452e7e4857c..7ff233fa609 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -863,6 +863,7 @@ void OBJECT_OT_group_instance_add(wmOperatorType *ot)
/* note: now unlinks constraints as well */
void ED_base_object_free_and_unlink(Main *bmain, Scene *scene, Base *base)
{
+ DAG_id_type_tag(bmain, ID_OB);
BLI_remlink(&scene->base, base);
free_libblock_us(&bmain->object, base->object);
if(scene->basact==base) scene->basact= NULL;
diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c
index e29dfaa0a23..5487cbdadb2 100644
--- a/source/blender/editors/object/object_bake.c
+++ b/source/blender/editors/object/object_bake.c
@@ -54,6 +54,7 @@
#include "BLI_math_geom.h"
#include "BKE_blender.h"
+#include "BKE_screen.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_image.h"
@@ -1202,24 +1203,6 @@ static int thread_break(void *UNUSED(arg))
return G.afbreek;
}
-static ScrArea *biggest_image_area(bScreen *screen)
-{
- ScrArea *sa, *big= NULL;
- int size, maxsize= 0;
-
- for(sa= screen->areabase.first; sa; sa= sa->next) {
- if(sa->spacetype==SPACE_IMAGE) {
- size= sa->winx*sa->winy;
- if(sa->winx > 10 && sa->winy > 10 && size > maxsize) {
- maxsize= size;
- big= sa;
- }
- }
- }
- return big;
-}
-
-
typedef struct BakeRender {
Render *re;
Main *main;
@@ -1270,7 +1253,7 @@ static void init_bake_internal(BakeRender *bkr, bContext *C)
/* get editmode results */
ED_object_exit_editmode(C, 0); /* 0 = does not exit editmode */
- bkr->sa= biggest_image_area(CTX_wm_screen(C)); /* can be NULL */
+ bkr->sa= BKE_screen_find_big_area(CTX_wm_screen(C), SPACE_IMAGE, 10); /* can be NULL */
bkr->main= CTX_data_main(C);
bkr->scene= scene;
bkr->actob= (scene->r.bake_flag & R_BAKE_TO_ACTIVE) ? OBACT : NULL;
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 04272b48d51..f2997dc743d 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -145,6 +145,7 @@ static int object_hide_view_clear_exec(bContext *C, wmOperator *UNUSED(op))
}
}
if (changed) {
+ DAG_id_type_tag(bmain, ID_OB);
DAG_scene_sort(bmain, scene);
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
}
@@ -197,6 +198,7 @@ static int object_hide_view_set_exec(bContext *C, wmOperator *op)
CTX_DATA_END;
if (changed) {
+ DAG_id_type_tag(bmain, ID_OB);
DAG_scene_sort(bmain, scene);
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, CTX_data_scene(C));
@@ -1180,7 +1182,7 @@ static void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event)
base->object->min_vel= ob->min_vel;
base->object->max_vel= ob->max_vel;
if (ob->gameflag & OB_BOUNDS) {
- base->object->boundtype = ob->boundtype;
+ base->object->collision_boundtype = ob->collision_boundtype;
}
base->object->margin= ob->margin;
base->object->bsoft= copy_bulletsoftbody(ob->bsoft);
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index 1efe79fff9e..a82ed95079f 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -645,7 +645,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
/* get the view settings if 'around' isnt set and the view is available */
View3D *v3d= CTX_wm_view3d(C);
copy_v3_v3(cursor, give_cursor(scene, v3d));
- if(v3d && !RNA_property_is_set(op->ptr, "around"))
+ if(v3d && !RNA_property_is_set(op->ptr, "center"))
around= v3d->around;
}
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index d4ee68f8b72..a59ca5ad954 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -99,8 +99,7 @@ int ED_vgroup_object_is_edit_mode(Object *ob)
bDeformGroup *ED_vgroup_add_name(Object *ob, const char *name)
{
bDeformGroup *defgroup;
-
- if(!ob || !ELEM(ob->type, OB_MESH, OB_LATTICE))
+ if(!ob || !OB_TYPE_SUPPORT_VGROUP(ob->type))
return NULL;
defgroup = MEM_callocN(sizeof(bDeformGroup), "add deformGroup");
@@ -1528,14 +1527,32 @@ static void vgroup_clean_all(Object *ob, float eul, int keep_single)
static void dvert_mirror_op(MDeformVert *dvert, MDeformVert *dvert_mirr,
const char sel, const char sel_mirr,
const int *flip_map, const int flip_map_len,
- const short mirror_weights, const short flip_vgroups)
+ const short mirror_weights, const short flip_vgroups,
+ const short all_vgroups, const int act_vgroup)
{
BLI_assert(sel || sel_mirr);
if(sel_mirr && sel) {
/* swap */
- if(mirror_weights)
- SWAP(MDeformVert, *dvert, *dvert_mirr);
+ if(mirror_weights) {
+ if (all_vgroups) {
+ SWAP(MDeformVert, *dvert, *dvert_mirr);
+ }
+ else {
+ MDeformWeight *dw= defvert_find_index(dvert, act_vgroup);
+ MDeformWeight *dw_mirr= defvert_find_index(dvert_mirr, act_vgroup);
+
+ if (dw || dw_mirr) {
+ if (dw_mirr == NULL)
+ dw_mirr= defvert_verify_index(dvert_mirr, act_vgroup);
+ if (dw == NULL)
+ dw= defvert_verify_index(dvert, act_vgroup);
+
+ SWAP(float, dw->weight, dw_mirr->weight);
+ }
+ }
+ }
+
if(flip_vgroups) {
defvert_flip(dvert, flip_map, flip_map_len);
defvert_flip(dvert_mirr, flip_map, flip_map_len);
@@ -1555,52 +1572,109 @@ static void dvert_mirror_op(MDeformVert *dvert, MDeformVert *dvert_mirr,
}
}
-void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_vgroups)
+/* TODO, vgroup locking */
+/* TODO, face masking */
+void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_vgroups, const short all_vgroups)
{
-#define VGROUP_MIRR_OP dvert_mirror_op(dvert, dvert_mirr, sel, sel_mirr, flip_map, flip_map_len, mirror_weights, flip_vgroups)
+
+#define VGROUP_MIRR_OP \
+ dvert_mirror_op(dvert, dvert_mirr, \
+ sel, sel_mirr, \
+ flip_map, flip_map_len, \
+ mirror_weights, flip_vgroups, \
+ all_vgroups, act_vgroup \
+ )
EditVert *eve, *eve_mirr;
MDeformVert *dvert, *dvert_mirr;
short sel, sel_mirr;
int *flip_map, flip_map_len;
+ const int act_vgroup= ob->actdef > 0 ? ob->actdef-1 : 0;
if(mirror_weights==0 && flip_vgroups==0)
return;
- flip_map= defgroup_flip_map(ob, &flip_map_len, FALSE);
+ flip_map= all_vgroups ?
+ defgroup_flip_map(ob, &flip_map_len, FALSE) :
+ defgroup_flip_map_single(ob, &flip_map_len, FALSE, act_vgroup);
/* only the active group */
if(ob->type == OB_MESH) {
Mesh *me= ob->data;
EditMesh *em = BKE_mesh_get_editmesh(me);
+ if (em) {
+ if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) {
+ MEM_freeN(flip_map);
+ return;
+ }
- if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) {
- MEM_freeN(flip_map);
- return;
+ EM_cache_x_mirror_vert(ob, em);
+
+ /* Go through the list of editverts and assign them */
+ for(eve=em->verts.first; eve; eve=eve->next){
+ if((eve_mirr=eve->tmp.v)) {
+ sel= eve->f & SELECT;
+ sel_mirr= eve_mirr->f & SELECT;
+
+ if((sel || sel_mirr) && (eve != eve_mirr)) {
+ dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+ dvert_mirr= CustomData_em_get(&em->vdata, eve_mirr->data, CD_MDEFORMVERT);
+ if(dvert && dvert_mirr) {
+ VGROUP_MIRR_OP;
+ }
+ }
+
+ eve->tmp.v= eve_mirr->tmp.v= NULL;
+ }
+ }
+
+ BKE_mesh_end_editmesh(me, em);
}
+ else {
+ /* object mode / weight paint */
+ MVert *mv, *mv_mirr;
+ int vidx, vidx_mirr;
+ const int use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
+
+ if (me->dvert == NULL) {
+ MEM_freeN(flip_map);
+ return;
+ }
- EM_cache_x_mirror_vert(ob, em);
+ if (!use_vert_sel) {
+ sel= sel_mirr= TRUE;
+ }
+
+ /* tag verts we have used */
+ for(vidx= 0, mv= me->mvert; vidx < me->totvert; vidx++, mv++) {
+ mv->flag &= ~ME_VERT_TMP_TAG;
+ }
+
+ for(vidx= 0, mv= me->mvert; vidx < me->totvert; vidx++, mv++) {
+ if ( ((mv->flag & ME_VERT_TMP_TAG) == 0) &&
+ ((vidx_mirr= mesh_get_x_mirror_vert(ob, vidx)) != -1) &&
+ (vidx != vidx_mirr) &&
+ ((((mv_mirr= me->mvert + vidx_mirr)->flag) & ME_VERT_TMP_TAG) == 0))
+ {
+
+ if (use_vert_sel) {
+ sel= mv->flag & SELECT;
+ sel_mirr= mv_mirr->flag & SELECT;
+ }
+
+ if (sel || sel_mirr) {
+ dvert= &me->dvert[vidx];
+ dvert_mirr= &me->dvert[vidx_mirr];
- /* Go through the list of editverts and assign them */
- for(eve=em->verts.first; eve; eve=eve->next){
- if((eve_mirr=eve->tmp.v)) {
- sel= eve->f & SELECT;
- sel_mirr= eve_mirr->f & SELECT;
-
- if((sel || sel_mirr) && (eve != eve_mirr)) {
- dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
- dvert_mirr= CustomData_em_get(&em->vdata, eve_mirr->data, CD_MDEFORMVERT);
- if(dvert && dvert_mirr) {
VGROUP_MIRR_OP;
}
- }
- eve->tmp.v= eve_mirr->tmp.v= NULL;
+ mv->flag |= ME_VERT_TMP_TAG;
+ mv_mirr->flag |= ME_VERT_TMP_TAG;
+ }
}
}
-
- BKE_mesh_end_editmesh(me, em);
}
else if (ob->type == OB_LATTICE) {
Lattice *lt= ob->data;
@@ -2013,7 +2087,7 @@ static int vertex_group_poll(bContext *C)
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
ID *data= (ob)? ob->data: NULL;
- return (ob && !ob->id.lib && ELEM(ob->type, OB_MESH, OB_LATTICE) && data && !data->lib);
+ return (ob && !ob->id.lib && OB_TYPE_SUPPORT_VGROUP(ob->type) && data && !data->lib);
}
static int vertex_group_poll_edit(bContext *C)
@@ -2509,7 +2583,10 @@ static int vertex_group_mirror_exec(bContext *C, wmOperator *op)
{
Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
- ED_vgroup_mirror(ob, RNA_boolean_get(op->ptr,"mirror_weights"), RNA_boolean_get(op->ptr,"flip_group_names"));
+ ED_vgroup_mirror(ob,
+ RNA_boolean_get(op->ptr,"mirror_weights"),
+ RNA_boolean_get(op->ptr,"flip_group_names"),
+ RNA_boolean_get(op->ptr,"all_groups"));
DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
@@ -2527,7 +2604,7 @@ void OBJECT_OT_vertex_group_mirror(wmOperatorType *ot)
"flipping when both sides are selected otherwise copy from unselected";
/* api callbacks */
- ot->poll= vertex_group_poll_edit;
+ ot->poll= vertex_group_poll;
ot->exec= vertex_group_mirror_exec;
/* flags */
@@ -2536,6 +2613,7 @@ void OBJECT_OT_vertex_group_mirror(wmOperatorType *ot)
/* properties */
RNA_def_boolean(ot->srna, "mirror_weights", TRUE, "Mirror Weights", "Mirror weights");
RNA_def_boolean(ot->srna, "flip_group_names", TRUE, "Flip Groups", "Flip vertex group names");
+ RNA_def_boolean(ot->srna, "all_groups", FALSE, "All Groups", "Mirror all vertex groups weights");
}
diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c
index 2f0958371f9..cc1c8843015 100644
--- a/source/blender/editors/render/render_internal.c
+++ b/source/blender/editors/render/render_internal.c
@@ -223,20 +223,26 @@ static int screen_render_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
SceneRenderLayer *srl= NULL;
- Render *re= RE_NewRender(scene->id.name);
+ Render *re;
Image *ima;
View3D *v3d= CTX_wm_view3d(C);
Main *mainp= CTX_data_main(C);
- unsigned int lay= (v3d)? v3d->lay: scene->lay;
+ unsigned int lay;
const short is_animation= RNA_boolean_get(op->ptr, "animation");
const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
struct Object *camera_override= v3d ? V3D_CAMERA_LOCAL(v3d) : NULL;
+ /* custom scene and single layer re-render */
+ screen_render_scene_layer_set(op, mainp, &scene, &srl);
+
if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.imtype)) {
BKE_report(op->reports, RPT_ERROR, "Can't write a single file with an animation format selected");
return OPERATOR_CANCELLED;
}
+ re= RE_NewRender(scene->id.name);
+ lay= (v3d)? v3d->lay: scene->lay;
+
G.afbreek= 0;
RE_test_break_cb(re, NULL, (int (*)(void *)) blender_test_break);
@@ -252,9 +258,6 @@ static int screen_render_exec(bContext *C, wmOperator *op)
RE_SetReports(re, op->reports);
- /* custom scene and single layer re-render */
- screen_render_scene_layer_set(op, mainp, &scene, &srl);
-
if(is_animation)
RE_BlenderAnim(re, mainp, scene, camera_override, lay, scene->r.sfra, scene->r.efra, scene->r.frame_step);
else
@@ -500,6 +503,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
const short is_animation= RNA_boolean_get(op->ptr, "animation");
const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
struct Object *camera_override= v3d ? V3D_CAMERA_LOCAL(v3d) : NULL;
+ const char *name;
/* only one render job at a time */
if(WM_jobs_test(CTX_wm_manager(C), scene))
@@ -574,7 +578,10 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
rj->reports= op->reports;
/* setup job */
- steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, "Render", jobflag);
+ if(RE_seq_render_active(scene, &scene->r)) name= "Sequence Render";
+ else name= "Render";
+
+ steve= WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), scene, name, jobflag);
WM_jobs_customdata(steve, rj, render_freejob);
WM_jobs_timer(steve, 0.2, NC_SCENE|ND_RENDER_RESULT, 0);
WM_jobs_callbacks(steve, render_startjob, NULL, NULL, render_endjob);
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 49bdb103139..9da160948cc 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -420,6 +420,12 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
base->object->data= la;
}
}
+
+ if(la && la->nodetree && sp->pr_method==PR_NODE_RENDER) {
+ /* two previews, they get copied by wmJob */
+ ntreeInitPreview(origla->nodetree, sp->sizex, sp->sizey);
+ ntreeInitPreview(la->nodetree, sp->sizex, sp->sizey);
+ }
}
else if(id_type==ID_WO) {
World *wrld= NULL, *origwrld= (World *)id;
@@ -432,6 +438,12 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
sce->lay= 1<<MA_SKY;
sce->world= wrld;
+
+ if(wrld && wrld->nodetree && sp->pr_method==PR_NODE_RENDER) {
+ /* two previews, they get copied by wmJob */
+ ntreeInitPreview(wrld->nodetree, sp->sizex, sp->sizey);
+ ntreeInitPreview(origwrld->nodetree, sp->sizex, sp->sizey);
+ }
}
return sce;
@@ -566,6 +578,18 @@ static void shader_preview_updatejob(void *spv)
if(sp->texcopy && tex->nodetree && sp->texcopy->nodetree)
ntreeLocalSync(sp->texcopy->nodetree, tex->nodetree);
}
+ else if( GS(sp->id->name) == ID_WO) {
+ World *wrld= (World *)sp->id;
+
+ if(sp->worldcopy && wrld->nodetree && sp->worldcopy->nodetree)
+ ntreeLocalSync(sp->worldcopy->nodetree, wrld->nodetree);
+ }
+ else if( GS(sp->id->name) == ID_LA) {
+ Lamp *la= (Lamp *)sp->id;
+
+ if(sp->lampcopy && la->nodetree && sp->lampcopy->nodetree)
+ ntreeLocalSync(sp->lampcopy->nodetree, la->nodetree);
+ }
}
}
}
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index 35d679146fe..80c54d970b4 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -26,7 +26,6 @@
* \ingroup edrend
*/
-
#include <stdlib.h>
#include <string.h>
@@ -76,6 +75,7 @@
#include "ED_curve.h"
#include "ED_mesh.h"
+#include "ED_node.h"
#include "ED_render.h"
#include "ED_screen.h"
@@ -363,16 +363,24 @@ void OBJECT_OT_material_slot_copy(wmOperatorType *ot)
static int new_material_exec(bContext *C, wmOperator *UNUSED(op))
{
+ Scene *scene= CTX_data_scene(C);
Material *ma= CTX_data_pointer_get_type(C, "material", &RNA_Material).data;
PointerRNA ptr, idptr;
PropertyRNA *prop;
/* add or copy material */
- if(ma)
+ if(ma) {
ma= copy_material(ma);
- else
+ }
+ else {
ma= add_material("Material");
+ if(scene_use_new_shading_nodes(scene)) {
+ ED_node_shader_default(scene, &ma->id);
+ ma->use_nodes= 1;
+ }
+ }
+
/* hook into UI */
uiIDContextProperty(C, &ptr, &prop);
@@ -455,16 +463,24 @@ void TEXTURE_OT_new(wmOperatorType *ot)
static int new_world_exec(bContext *C, wmOperator *UNUSED(op))
{
+ Scene *scene= CTX_data_scene(C);
World *wo= CTX_data_pointer_get_type(C, "world", &RNA_World).data;
PointerRNA ptr, idptr;
PropertyRNA *prop;
/* add or copy world */
- if(wo)
+ if(wo) {
wo= copy_world(wo);
- else
+ }
+ else {
wo= add_world("World");
+ if(scene_use_new_shading_nodes(scene)) {
+ ED_node_shader_default(scene, &wo->id);
+ wo->use_nodes= 1;
+ }
+ }
+
/* hook into UI */
uiIDContextProperty(C, &ptr, &prop);
diff --git a/source/blender/editors/render/render_update.c b/source/blender/editors/render/render_update.c
index e80c3d85670..72ea79fae7e 100644
--- a/source/blender/editors/render/render_update.c
+++ b/source/blender/editors/render/render_update.c
@@ -56,11 +56,110 @@
#include "GPU_material.h"
+#include "RE_engine.h"
+
#include "ED_node.h"
#include "ED_render.h"
#include "render_intern.h" // own include
+/***************************** Render Engines ********************************/
+
+void ED_render_engine_update_tagged(bContext *C, Main *bmain)
+{
+ /* viewport rendering update on data changes, happens after depsgraph
+ * updates if there was any change. context is set to the 3d view */
+ bScreen *sc, *prev_sc= CTX_wm_screen(C);
+ ScrArea *sa, *prev_sa= CTX_wm_area(C);
+ ARegion *ar, *prev_ar= CTX_wm_region(C);
+
+ for(sc=bmain->screen.first; sc; sc=sc->id.next) {
+ for(sa=sc->areabase.first; sa; sa=sa->next) {
+ if(sa->spacetype != SPACE_VIEW3D)
+ continue;
+
+ for(ar=sa->regionbase.first; ar; ar=ar->next) {
+ RegionView3D *rv3d;
+ RenderEngine *engine;
+
+ if(ar->regiontype != RGN_TYPE_WINDOW)
+ continue;
+
+ rv3d= ar->regiondata;
+ engine= rv3d->render_engine;
+
+ if(engine && (engine->flag & RE_ENGINE_DO_UPDATE)) {
+ CTX_wm_screen_set(C, sc);
+ CTX_wm_area_set(C, sa);
+ CTX_wm_region_set(C, ar);
+
+ engine->flag &= ~RE_ENGINE_DO_UPDATE;
+ engine->type->view_update(engine, C);
+ }
+ }
+ }
+ }
+
+ CTX_wm_screen_set(C, prev_sc);
+ CTX_wm_area_set(C, prev_sa);
+ CTX_wm_region_set(C, prev_ar);
+}
+
+void ED_render_engine_changed(Main *bmain)
+{
+ /* on changing the render engine type, clear all running render engines */
+ bScreen *sc;
+ ScrArea *sa;
+ ARegion *ar;
+
+ for(sc=bmain->screen.first; sc; sc=sc->id.next) {
+ for(sa=sc->areabase.first; sa; sa=sa->next) {
+ if(sa->spacetype != SPACE_VIEW3D)
+ continue;
+
+ for(ar=sa->regionbase.first; ar; ar=ar->next) {
+ RegionView3D *rv3d;
+
+ if(ar->regiontype != RGN_TYPE_WINDOW)
+ continue;
+
+ rv3d= ar->regiondata;
+
+ if(rv3d->render_engine) {
+ RE_engine_free(rv3d->render_engine);
+ rv3d->render_engine= NULL;
+ }
+ }
+ }
+ }
+}
+
+static void tag_render_engines(Main *bmain)
+{
+ /* tag running render engines for update later on */
+ bScreen *sc;
+ ScrArea *sa;
+ ARegion *ar;
+
+ for(sc=bmain->screen.first; sc; sc=sc->id.next) {
+ for(sa=sc->areabase.first; sa; sa=sa->next) {
+ if(sa->spacetype != SPACE_VIEW3D)
+ continue;
+
+ for(ar=sa->regionbase.first; ar; ar=ar->next) {
+ RegionView3D *rv3d;
+
+ if(ar->regiontype != RGN_TYPE_WINDOW)
+ continue;
+
+ rv3d= ar->regiondata;
+ if(rv3d->render_engine)
+ rv3d->render_engine->flag |= RE_ENGINE_DO_UPDATE;
+ }
+ }
+ }
+}
+
/***************************** Updates ***********************************
* ED_render_id_flush_update gets called from DAG_id_tag_update, to do *
* editor level updates when the ID changes. when these ID blocks are in *
@@ -135,6 +234,7 @@ static void texture_changed(Main *bmain, Tex *tex)
/* find lamps */
for(la=bmain->lamp.first; la; la=la->id.next) {
if(mtex_use_tex(la->mtex, MAX_MTEX, tex));
+ else if(la->nodetree && nodes_use_tex(la->nodetree, tex));
else continue;
BKE_icon_changed(BKE_icon_getid(&la->id));
@@ -143,6 +243,7 @@ static void texture_changed(Main *bmain, Tex *tex)
/* find worlds */
for(wo=bmain->world.first; wo; wo=wo->id.next) {
if(mtex_use_tex(wo->mtex, MAX_MTEX, tex));
+ else if(wo->nodetree && nodes_use_tex(wo->nodetree, tex));
else continue;
BKE_icon_changed(BKE_icon_getid(&wo->id));
@@ -220,8 +321,10 @@ static void scene_changed(Main *bmain, Scene *UNUSED(scene))
void ED_render_id_flush_update(Main *bmain, ID *id)
{
- if(!id)
+ if(!id) {
+ tag_render_engines(bmain);
return;
+ }
switch(GS(id->name)) {
case ID_MA:
diff --git a/source/blender/editors/render/render_view.c b/source/blender/editors/render/render_view.c
index 47957c0bb5a..d8719c7d7cd 100644
--- a/source/blender/editors/render/render_view.c
+++ b/source/blender/editors/render/render_view.c
@@ -58,6 +58,7 @@
/* returns biggest area that is not uv/image editor. Note that it uses buttons */
/* window as the last possible alternative. */
+/* would use BKE_screen_find_big_area(...) but this is too specific */
static ScrArea *biggest_non_image_area(bContext *C)
{
bScreen *sc= CTX_wm_screen(C);
@@ -85,22 +86,6 @@ static ScrArea *biggest_non_image_area(bContext *C)
return big;
}
-static ScrArea *biggest_area(bContext *C)
-{
- bScreen *sc= CTX_wm_screen(C);
- ScrArea *sa, *big= NULL;
- int size, maxsize= 0;
-
- for(sa= sc->areabase.first; sa; sa= sa->next) {
- size= sa->winx*sa->winy;
- if(size > maxsize) {
- maxsize= size;
- big= sa;
- }
- }
- return big;
-}
-
static ScrArea *find_area_showing_r_result(bContext *C, wmWindow **win)
{
wmWindowManager *wm= CTX_wm_manager(C);
@@ -206,7 +191,7 @@ void render_view_open(bContext *C, int mx, int my)
}
else {
/* use any area of decent size */
- sa= biggest_area(C);
+ sa= BKE_screen_find_big_area(CTX_wm_screen(C), -1, 0);
if(sa->spacetype!=SPACE_IMAGE) {
// XXX newspace(sa, SPACE_IMAGE);
sima= sa->spacedata.first;
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 7e79849ba40..9d6d663df5c 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -84,19 +84,19 @@ static void region_draw_emboss(ARegion *ar, rcti *scirct)
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
/* right */
- glColor4ub(0,0,0, 50);
+ glColor4ub(0,0,0, 30);
sdrawline(rect.xmax, rect.ymin, rect.xmax, rect.ymax);
/* bottom */
- glColor4ub(0,0,0, 80);
+ glColor4ub(0,0,0, 30);
sdrawline(rect.xmin, rect.ymin, rect.xmax, rect.ymin);
/* top */
- glColor4ub(255,255,255, 60);
+ glColor4ub(255,255,255, 30);
sdrawline(rect.xmin, rect.ymax, rect.xmax, rect.ymax);
/* left */
- glColor4ub(255,255,255, 50);
+ glColor4ub(255,255,255, 30);
sdrawline(rect.xmin, rect.ymin, rect.xmin, rect.ymax);
glDisable( GL_BLEND );
@@ -414,6 +414,9 @@ void ED_region_do_draw(bContext *C, ARegion *ar)
/* note; this sets state, so we can use wmOrtho and friends */
wmSubWindowScissorSet(win, ar->swinid, &ar->drawrct);
+
+ ar->do_draw= 0;
+ memset(&ar->drawrct, 0, sizeof(ar->drawrct));
UI_SetTheme(sa?sa->spacetype:0, ar->type?ar->type->regionid:0);
@@ -429,18 +432,15 @@ void ED_region_do_draw(bContext *C, ARegion *ar)
at->draw(C, ar);
}
+ /* XXX test: add convention to end regions always in pixel space, for drawing of borders/gestures etc */
+ ED_region_pixelspace(ar);
+
ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_PIXEL);
uiFreeInactiveBlocks(C, &ar->uiblocks);
-
+
if(sa)
region_draw_emboss(ar, &winrct);
-
- /* XXX test: add convention to end regions always in pixel space, for drawing of borders/gestures etc */
- ED_region_pixelspace(ar);
-
- ar->do_draw= 0;
- memset(&ar->drawrct, 0, sizeof(ar->drawrct));
}
/* **********************************
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 0a7e3a2763a..e86dd8dbde3 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -192,7 +192,7 @@ int ED_operator_animview_active(bContext *C)
{
if(ED_operator_areaactive(C)) {
SpaceLink *sl= (SpaceLink *)CTX_wm_space_data(C);
- if (sl && (ELEM6(sl->spacetype, SPACE_SEQ, SPACE_SOUND, SPACE_ACTION, SPACE_NLA, SPACE_IPO, SPACE_TIME)))
+ if (sl && (ELEM5(sl->spacetype, SPACE_SEQ, SPACE_ACTION, SPACE_NLA, SPACE_IPO, SPACE_TIME)))
return TRUE;
}
@@ -406,6 +406,17 @@ int ED_operator_editcurve(bContext *C)
return 0;
}
+int ED_operator_editcurve_3d(bContext *C)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ if(obedit && obedit->type==OB_CURVE) {
+ Curve *cu= (Curve *)obedit->data;
+
+ return (cu->flag&CU_3D) && (NULL != cu->editnurb);
+ }
+ return 0;
+}
+
int ED_operator_editsurf(bContext *C)
{
Object *obedit= CTX_data_edit_object(C);
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index d49ce0cf49a..6b6003fb098 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -57,6 +57,7 @@
#include "IMB_imbuf_types.h"
#include "DNA_brush_types.h"
+#include "DNA_camera_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_node_types.h"
@@ -3000,7 +3001,8 @@ static void project_paint_begin(ProjPaintState *ps)
Object *camera= ps->scene->camera;
/* dont actually use these */
- float _viewdx, _viewdy, _ycor, _lens=0.0f;
+ float _viewdx, _viewdy, _ycor, _lens=0.0f, _sensor_x=DEFAULT_SENSOR_WIDTH, _sensor_y= DEFAULT_SENSOR_HEIGHT;
+ short _sensor_fit= CAMERA_SENSOR_FIT_AUTO;
rctf _viewplane;
/* viewmat & viewinv */
@@ -3012,7 +3014,7 @@ static void project_paint_begin(ProjPaintState *ps)
object_camera_mode(&ps->scene->r, camera);
object_camera_matrix(&ps->scene->r, camera, ps->winx, ps->winy, 0,
winmat, &_viewplane, &ps->clipsta, &ps->clipend,
- &_lens, &_ycor, &_viewdx, &_viewdy);
+ &_lens, &_sensor_x, &_sensor_y, &_sensor_fit, &_ycor, &_viewdx, &_viewdy);
ps->is_ortho= (ps->scene->r.mode & R_ORTHO) ? 1 : 0;
}
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 3e2c4666528..57f926b0612 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -387,37 +387,16 @@ void vpaint_fill(Object *ob, unsigned int paintcol)
/* fills in the selected faces with the current weight and vertex group */
void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
{
- Mesh *me;
+ Mesh *me= ob->data;
+ MFace *mf;
MDeformWeight *dw, *uw;
- int *indexar;
- unsigned int index;
int vgroup, vgroup_mirror= -1;
- int selected;
-
- int use_vert_sel;
-
- me= ob->data;
- if(me==NULL || me->totface==0 || me->dvert==NULL || !me->mface) return;
-
- selected= (me->editflag & ME_EDIT_PAINT_MASK);
-
- use_vert_sel= (me->editflag & ME_EDIT_VERT_SEL) != 0;
+ unsigned int index;
- indexar= get_indexarray(me);
+ /* mutually exclusive, could be made into a */
+ const short paint_selmode= ME_EDIT_PAINT_SEL_MODE(me);
- if(selected) {
- MFace *mf;
- for(index=0, mf= me->mface; index<me->totface; index++, mf++) {
- if((mf->flag & ME_FACE_SEL)==0)
- indexar[index]= 0;
- else
- indexar[index]= index+1;
- }
- }
- else {
- for(index=0; index<me->totface; index++)
- indexar[index]= index+1;
- }
+ if(me->totface==0 || me->dvert==NULL || !me->mface) return;
vgroup= ob->actdef-1;
@@ -428,47 +407,47 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
copy_wpaint_prev(wp, me->dvert, me->totvert);
- for(index=0; index<me->totface; index++) {
- if(indexar[index] && indexar[index]<=me->totface) {
- MFace *mf= &me->mface[indexar[index]-1];
- unsigned int fidx= mf->v4 ? 3:2;
+ for(index=0, mf= me->mface; index < me->totface; index++, mf++) {
+ unsigned int fidx= mf->v4 ? 3:2;
- do {
- unsigned int vidx= *(&mf->v1 + fidx);
+ if ((paint_selmode == SCE_SELECT_FACE) && !(mf->flag & ME_FACE_SEL)) {
+ continue;
+ }
- if(!me->dvert[vidx].flag) {
- if(use_vert_sel && !(me->mvert[vidx].flag & SELECT)) {
- continue;
- }
+ do {
+ unsigned int vidx= *(&mf->v1 + fidx);
- dw= defvert_verify_index(&me->dvert[vidx], vgroup);
- if(dw) {
- uw= defvert_verify_index(wp->wpaint_prev+vidx, vgroup);
- uw->weight= dw->weight; /* set the undo weight */
- dw->weight= paintweight;
-
- if(me->editflag & ME_EDIT_MIRROR_X) { /* x mirror painting */
- int j= mesh_get_x_mirror_vert(ob, vidx);
- if(j>=0) {
- /* copy, not paint again */
- if(vgroup_mirror != -1) {
- dw= defvert_verify_index(me->dvert+j, vgroup_mirror);
- uw= defvert_verify_index(wp->wpaint_prev+j, vgroup_mirror);
- } else {
- dw= defvert_verify_index(me->dvert+j, vgroup);
- uw= defvert_verify_index(wp->wpaint_prev+j, vgroup);
- }
- uw->weight= dw->weight; /* set the undo weight */
- dw->weight= paintweight;
+ if(!me->dvert[vidx].flag) {
+ if((paint_selmode == SCE_SELECT_VERTEX) && !(me->mvert[vidx].flag & SELECT)) {
+ continue;
+ }
+
+ dw= defvert_verify_index(&me->dvert[vidx], vgroup);
+ if(dw) {
+ uw= defvert_verify_index(wp->wpaint_prev+vidx, vgroup);
+ uw->weight= dw->weight; /* set the undo weight */
+ dw->weight= paintweight;
+
+ if(me->editflag & ME_EDIT_MIRROR_X) { /* x mirror painting */
+ int j= mesh_get_x_mirror_vert(ob, vidx);
+ if(j>=0) {
+ /* copy, not paint again */
+ if(vgroup_mirror != -1) {
+ dw= defvert_verify_index(me->dvert+j, vgroup_mirror);
+ uw= defvert_verify_index(wp->wpaint_prev+j, vgroup_mirror);
+ } else {
+ dw= defvert_verify_index(me->dvert+j, vgroup);
+ uw= defvert_verify_index(wp->wpaint_prev+j, vgroup);
}
+ uw->weight= dw->weight; /* set the undo weight */
+ dw->weight= paintweight;
}
}
- me->dvert[vidx].flag= 1;
}
+ me->dvert[vidx].flag= 1;
+ }
-
- } while (fidx--);
- }
+ } while (fidx--);
}
{
@@ -477,8 +456,7 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
dv->flag= 0;
}
}
-
- MEM_freeN(indexar);
+
copy_wpaint_prev(wp, NULL, 0);
DAG_id_tag_update(&me->id, 0);
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 0b009dba651..c26a4d52a9e 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -208,7 +208,8 @@ typedef struct StrokeCache {
int first_time; /* Beginning of stroke may do some things special */
- bglMats *mats;
+ /* from ED_view3d_ob_project_mat_get() */
+ float projection_mat[4][4];
/* Clean this up! */
ViewContext *vc;
@@ -405,7 +406,8 @@ static int sculpt_brush_test_cube(SculptBrushTest *test, float co[3], float loca
}
}
-static float frontface(Brush *brush, float sculpt_normal[3], short no[3], float fno[3])
+static float frontface(Brush *brush, const float sculpt_normal[3],
+ const short no[3], const float fno[3])
{
if (brush->flag & BRUSH_FRONTFACE) {
float dot;
@@ -655,7 +657,11 @@ static float brush_strength(Sculpt *sd, StrokeCache *cache, float feather)
}
/* Return a multiplier for brush strength on a particular vertex. */
-static float tex_strength(SculptSession *ss, Brush *br, float *point, const float len)
+static float tex_strength(SculptSession *ss, Brush *br, float point[3],
+ const float len,
+ const float sculpt_normal[3],
+ const short vno[3],
+ const float fno[3])
{
MTex *mtex = &br->mtex;
float avg= 1;
@@ -673,7 +679,8 @@ static float tex_strength(SculptSession *ss, Brush *br, float *point, const floa
}
else if(ss->texcache) {
float rotation = -mtex->rot;
- float x, y, point_2d[3];
+ float symm_point[3], point_2d[2];
+ float x, y;
float radius;
/* if the active area is being applied for symmetry, flip it
@@ -681,12 +688,13 @@ static float tex_strength(SculptSession *ss, Brush *br, float *point, const floa
position in order to project it. This insures that the
brush texture will be oriented correctly. */
- flip_coord(point_2d, point, ss->cache->mirror_symmetry_pass);
+ flip_coord(symm_point, point, ss->cache->mirror_symmetry_pass);
if (ss->cache->radial_symmetry_pass)
- mul_m4_v3(ss->cache->symm_rot_mat_inv, point_2d);
+ mul_m4_v3(ss->cache->symm_rot_mat_inv, symm_point);
- projectf(ss->cache->mats, point_2d, point_2d);
+ ED_view3d_project_float(ss->cache->vc->ar, symm_point, point_2d,
+ ss->cache->projection_mat);
/* if fixed mode, keep coordinates relative to mouse */
if(mtex->brush_map_mode == MTEX_MAP_MODE_FIXED) {
@@ -742,7 +750,10 @@ static float tex_strength(SculptSession *ss, Brush *br, float *point, const floa
avg += br->texture_sample_bias;
- avg *= brush_curve_strength(br, len, ss->cache->radius); /* Falloff curve */
+ /* Falloff curve */
+ avg *= brush_curve_strength(br, len, ss->cache->radius);
+
+ avg *= frontface(br, sculpt_normal, vno, fno);
return avg;
}
@@ -980,7 +991,8 @@ static void do_mesh_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *node,
BLI_pbvh_vertex_iter_begin(ss->pbvh, node, vd, PBVH_ITER_UNIQUE) {
if(sculpt_brush_test(&test, vd.co)) {
- const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, ss->cache->view_normal, vd.no, vd.fno);
+ const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist,
+ ss->cache->view_normal, vd.no, vd.fno);
float avg[3], val[3];
neighbor_average(ss, avg, vd.vert_indices[vd.i]);
@@ -1073,7 +1085,8 @@ static void do_multires_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *no
fno= data[index].no;
if(sculpt_brush_test(&test, co)) {
- const float fade = bstrength*tex_strength(ss, brush, co, test.dist)*frontface(brush, ss->cache->view_normal, NULL, fno);
+ const float fade = bstrength*tex_strength(ss, brush, co, test.dist,
+ ss->cache->view_normal, NULL, fno);
float *avg, val[3];
float n;
@@ -1169,9 +1182,9 @@ static void do_draw_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
if (sculpt_brush_test(&test, vd.co)) {
- //if(sculpt_brush_test_cyl(&test, vd.co, ss->cache->location, area_normal)) {
/* offset vertex */
- float fade = tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, area_normal, vd.no, vd.fno);
+ float fade = tex_strength(ss, brush, vd.co, test.dist,
+ area_normal, vd.no, vd.fno);
mul_v3_v3fl(proxy[vd.i], offset, fade);
@@ -1225,7 +1238,8 @@ static void do_crease_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnod
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
if(sculpt_brush_test(&test, vd.co)) {
/* offset vertex */
- const float fade = tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, area_normal, vd.no, vd.fno);
+ const float fade = tex_strength(ss, brush, vd.co, test.dist,
+ area_normal, vd.no, vd.fno);
float val1[3];
float val2[3];
@@ -1266,7 +1280,8 @@ static void do_pinch_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
if(sculpt_brush_test(&test, vd.co)) {
- float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, ss->cache->view_normal, vd.no, vd.fno);
+ float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist,
+ ss->cache->view_normal, vd.no, vd.fno);
float val[3];
sub_v3_v3v3(val, test.location, vd.co);
@@ -1326,7 +1341,8 @@ static void do_grab_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
if(sculpt_brush_test(&test, origco[vd.i])) {
- const float fade = bstrength*tex_strength(ss, brush, origco[vd.i], test.dist)*frontface(brush, an, origno[vd.i], NULL);
+ const float fade = bstrength*tex_strength(ss, brush, origco[vd.i], test.dist,
+ an, origno[vd.i], NULL);
mul_v3_v3fl(proxy[vd.i], grab_delta, fade);
@@ -1367,7 +1383,8 @@ static void do_nudge_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
if(sculpt_brush_test(&test, vd.co)) {
- const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, an, vd.no, vd.fno);
+ const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist,
+ an, vd.no, vd.fno);
mul_v3_v3fl(proxy[vd.i], cono, fade);
@@ -1416,7 +1433,8 @@ static void do_snake_hook_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int to
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
if(sculpt_brush_test(&test, vd.co)) {
- const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, an, vd.no, vd.fno);
+ const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist,
+ an, vd.no, vd.fno);
mul_v3_v3fl(proxy[vd.i], grab_delta, fade);
@@ -1464,7 +1482,8 @@ static void do_thumb_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
if(sculpt_brush_test(&test, origco[vd.i])) {
- const float fade = bstrength*tex_strength(ss, brush, origco[vd.i], test.dist)*frontface(brush, an, origno[vd.i], NULL);
+ const float fade = bstrength*tex_strength(ss, brush, origco[vd.i], test.dist,
+ an, origno[vd.i], NULL);
mul_v3_v3fl(proxy[vd.i], cono, fade);
@@ -1510,7 +1529,8 @@ static void do_rotate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnod
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
if(sculpt_brush_test(&test, origco[vd.i])) {
- const float fade = bstrength*tex_strength(ss, brush, origco[vd.i], test.dist)*frontface(brush, an, origno[vd.i], NULL);
+ const float fade = bstrength*tex_strength(ss, brush, origco[vd.i], test.dist,
+ an, origno[vd.i], NULL);
mul_v3_m3v3(proxy[vd.i], m, origco[vd.i]);
sub_v3_v3(proxy[vd.i], origco[vd.i]);
@@ -1564,7 +1584,8 @@ static void do_layer_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
if(sculpt_brush_test(&test, origco[vd.i])) {
- const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, area_normal, vd.no, vd.fno);
+ const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist,
+ area_normal, vd.no, vd.fno);
float *disp= &layer_disp[vd.i];
float val[3];
@@ -1615,7 +1636,8 @@ static void do_inflate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totno
BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
if(sculpt_brush_test(&test, vd.co)) {
- const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist)*frontface(brush, ss->cache->view_normal, vd.no, vd.fno);
+ const float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist,
+ ss->cache->view_normal, vd.no, vd.fno);
float val[3];
if(vd.fno) copy_v3_v3(val, vd.fno);
@@ -1947,7 +1969,8 @@ static void do_flatten_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totno
sub_v3_v3v3(val, intr, vd.co);
if (plane_trim(ss->cache, brush, val)) {
- const float fade = bstrength*tex_strength(ss, brush, vd.co, sqrt(test.dist))*frontface(brush, an, vd.no, vd.fno);
+ const float fade = bstrength*tex_strength(ss, brush, vd.co, sqrt(test.dist),
+ an, vd.no, vd.fno);
mul_v3_v3fl(proxy[vd.i], val, fade);
@@ -2020,7 +2043,9 @@ static void do_clay_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
sub_v3_v3v3(val, intr, vd.co);
if (plane_trim(ss->cache, brush, val)) {
- const float fade = bstrength*tex_strength(ss, brush, vd.co, sqrt(test.dist))*frontface(brush, an, vd.no, vd.fno);
+ const float fade = bstrength*tex_strength(ss, brush, vd.co,
+ sqrt(test.dist),
+ an, vd.no, vd.fno);
mul_v3_v3fl(proxy[vd.i], val, fade);
@@ -2111,7 +2136,9 @@ static void do_clay_tubes_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int to
sub_v3_v3v3(val, intr, vd.co);
if (plane_trim(ss->cache, brush, val)) {
- const float fade = bstrength*tex_strength(ss, brush, vd.co, ss->cache->radius*test.dist)*frontface(brush, an, vd.no, vd.fno);
+ const float fade = bstrength*tex_strength(ss, brush, vd.co,
+ ss->cache->radius*test.dist,
+ an, vd.no, vd.fno);
mul_v3_v3fl(proxy[vd.i], val, fade);
@@ -2172,7 +2199,9 @@ static void do_fill_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
sub_v3_v3v3(val, intr, vd.co);
if (plane_trim(ss->cache, brush, val)) {
- const float fade = bstrength*tex_strength(ss, brush, vd.co, sqrt(test.dist))*frontface(brush, an, vd.no, vd.fno);
+ const float fade = bstrength*tex_strength(ss, brush, vd.co,
+ sqrt(test.dist),
+ an, vd.no, vd.fno);
mul_v3_v3fl(proxy[vd.i], val, fade);
@@ -2233,7 +2262,9 @@ static void do_scrape_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnod
sub_v3_v3v3(val, intr, vd.co);
if (plane_trim(ss->cache, brush, val)) {
- const float fade = bstrength*tex_strength(ss, brush, vd.co, sqrt(test.dist))*frontface(brush, an, vd.no, vd.fno);
+ const float fade = bstrength*tex_strength(ss, brush, vd.co,
+ sqrt(test.dist),
+ an, vd.no, vd.fno);
mul_v3_v3fl(proxy[vd.i], val, fade);
@@ -2782,8 +2813,6 @@ static void sculpt_cache_free(StrokeCache *cache)
{
if(cache->face_norms)
MEM_freeN(cache->face_norms);
- if(cache->mats)
- MEM_freeN(cache->mats);
MEM_freeN(cache);
}
@@ -2882,8 +2911,8 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
cache->brush = brush;
- cache->mats = MEM_callocN(sizeof(bglMats), "sculpt bglMats");
- view3d_get_transformation(vc->ar, vc->rv3d, vc->obact, cache->mats);
+ /* cache projection matrix */
+ ED_view3d_ob_project_mat_get(cache->vc->rv3d, ob, cache->projection_mat);
ED_view3d_global_to_vector(cache->vc->rv3d, cache->vc->rv3d->twmat[3], cache->true_view_normal);
/* Initialize layer brush displacements and persistent coords */
diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c
index 99ab356ac5f..905f7bc80b6 100644
--- a/source/blender/editors/space_api/spacetypes.c
+++ b/source/blender/editors/space_api/spacetypes.c
@@ -81,7 +81,6 @@ void ED_spacetypes_init(void)
ED_spacetype_buttons();
ED_spacetype_info();
ED_spacetype_file();
- ED_spacetype_sound();
ED_spacetype_action();
ED_spacetype_nla();
ED_spacetype_script();
diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c
index 37e6c0b73c9..7091fe094c6 100644
--- a/source/blender/editors/space_graph/graph_draw.c
+++ b/source/blender/editors/space_graph/graph_draw.c
@@ -78,11 +78,11 @@
* - intV: integer value containing color info packed into an int
* - alpha: float value describing the
*/
-#define cpackA(intVC, alpha) \
- { \
- float _cpackCol[3]; \
- cpack_to_rgb(intVC, &_cpackCol[0], &_cpackCol[1], &_cpackCol[2]); \
- glColor4f(_cpackCol[0], _cpackCol[1], _cpackCol[2], alpha); \
+#define cpackA(intVC, alpha) \
+ { \
+ float _cpackCol[3]; \
+ cpack_to_rgb(intVC, &_cpackCol[0], &_cpackCol[1], &_cpackCol[2]); \
+ glColor4f(_cpackCol[0], _cpackCol[1], _cpackCol[2], alpha); \
}
/* *************************** */
diff --git a/source/blender/editors/space_graph/graph_intern.h b/source/blender/editors/space_graph/graph_intern.h
index d0efdefe5a5..bc4fa398221 100644
--- a/source/blender/editors/space_graph/graph_intern.h
+++ b/source/blender/editors/space_graph/graph_intern.h
@@ -57,10 +57,6 @@ void graph_draw_curves(struct bAnimContext *ac, struct SpaceIpo *sipo, struct AR
void graph_draw_ghost_curves(struct bAnimContext *ac, struct SpaceIpo *sipo, struct ARegion *ar);
/* ***************************************** */
-/* graph_header.c */
-void graph_header_buttons(const bContext *C, struct ARegion *ar);
-
-/* ***************************************** */
/* graph_select.c */
void GRAPH_OT_select_all_toggle(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h
index 051926bf689..4310b5dbae8 100644
--- a/source/blender/editors/space_image/image_intern.h
+++ b/source/blender/editors/space_image/image_intern.h
@@ -51,9 +51,6 @@ struct ARegion *image_has_scope_region(struct ScrArea *sa);
extern const char *image_context_dir[]; /* doc access */
-/* image_header.c */
-void image_header_buttons(const struct bContext *C, struct ARegion *ar);
-
void IMAGE_OT_toolbox(struct wmOperatorType *ot);
/* image_draw.c */
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index c83baf24c1c..7121e4872eb 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1009,11 +1009,17 @@ static int save_image_options_init(SaveImageOptions *simopts, SpaceImage *sima,
return (ibuf != NULL);
}
-static void save_image_options_from_op(SaveImageOptions *simopts, wmOperator *op)
+static void save_image_options_from_op(SaveImageOptions *simopts, wmOperator *op, Scene *evil_scene)
{
if (RNA_property_is_set(op->ptr, "color_mode")) simopts->planes= RNA_enum_get(op->ptr, "color_mode");
if (RNA_property_is_set(op->ptr, "file_format")) simopts->imtype= RNA_enum_get(op->ptr, "file_format");
- // if (RNA_property_is_set(op->ptr, "subimtype")) simopts->subimtype= RNA_enum_get(op->ptr, "subimtype"); // XXX
+
+#if 0
+ if (RNA_property_is_set(op->ptr, "subimtype")) simopts->subimtype= RNA_enum_get(op->ptr, "subimtype"); // XXX
+#else
+ simopts->subimtype= evil_scene->r.subimtype;
+#endif
+
if (RNA_property_is_set(op->ptr, "file_quality")) simopts->quality= RNA_int_get(op->ptr, "file_quality");
if (RNA_property_is_set(op->ptr, "filepath")) {
@@ -1141,7 +1147,7 @@ static int image_save_as_exec(bContext *C, wmOperator *op)
/* just incase to initialize values,
* these should be set on invoke or by the caller. */
save_image_options_defaults(&simopts);
- save_image_options_from_op(&simopts, op);
+ save_image_options_from_op(&simopts, op, CTX_data_scene(C));
save_image_doit(C, sima, op, &simopts, TRUE);
@@ -1225,7 +1231,7 @@ static int image_save_exec(bContext *C, wmOperator *op)
if (save_image_options_init(&simopts, sima, scene, FALSE) == 0)
return OPERATOR_CANCELLED;
- save_image_options_from_op(&simopts, op);
+ save_image_options_from_op(&simopts, op, scene);
if (BLI_exists(simopts.filepath) && BLI_file_is_writable(simopts.filepath)) {
save_image_doit(C, sima, op, &simopts, FALSE);
diff --git a/source/blender/editors/space_nla/nla_intern.h b/source/blender/editors/space_nla/nla_intern.h
index ec2e22e65fa..00c16d68f36 100644
--- a/source/blender/editors/space_nla/nla_intern.h
+++ b/source/blender/editors/space_nla/nla_intern.h
@@ -51,11 +51,6 @@ void draw_nla_main_data(bAnimContext *ac, SpaceNla *snla, ARegion *ar);
void draw_nla_channel_list(bContext *C, bAnimContext *ac, ARegion *ar);
/* **************************************** */
-/* nla_header.c */
-
-void nla_header_buttons(const bContext *C, ARegion *ar);
-
-/* **************************************** */
/* nla_select.c */
/* defines for left-right select tool */
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 7a9cf644b55..db8d9b1ddf1 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -842,6 +842,11 @@ static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bN
}
}
+void node_uifunc_group(uiLayout *layout, bContext *C, PointerRNA *ptr)
+{
+ uiTemplateIDBrowse(layout, C, ptr, "node_tree", NULL, NULL, NULL);
+}
+
static void node_common_buts_whileloop(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiItemR(layout, ptr, "max_iterations", 0, NULL, 0);
@@ -867,7 +872,7 @@ static void node_common_set_butfunc(bNodeType *ntype)
{
switch(ntype->type) {
case NODE_GROUP:
-// ntype->uifunc= node_common_buts_group;
+ ntype->uifunc= node_uifunc_group;
ntype->drawfunc= node_draw_group;
ntype->drawupdatefunc= node_update_group;
break;
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index fd7a6ee21fd..c2a2f319c28 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -36,11 +36,13 @@
#include "MEM_guardedalloc.h"
#include "DNA_node_types.h"
+#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
#include "DNA_screen_types.h"
+#include "DNA_world_types.h"
#include "BLI_math.h"
#include "BLI_blenlib.h"
@@ -97,7 +99,13 @@ void ED_node_changed_update(ID *id, bNode *node)
if(treetype==NTREE_SHADER) {
DAG_id_tag_update(id, 0);
- WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, id);
+
+ if(GS(id->name) == ID_MA)
+ WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, id);
+ else if(GS(id->name) == ID_LA)
+ WM_main_add_notifier(NC_LAMP|ND_LIGHTING_DRAW, id);
+ else if(GS(id->name) == ID_WO)
+ WM_main_add_notifier(NC_WORLD|ND_WORLD_DRAW, id);
}
else if(treetype==NTREE_COMPOSIT) {
nodeUpdate(edittree, node);
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index 4c98028644a..c1e50c112fa 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -39,11 +39,13 @@
#include "MEM_guardedalloc.h"
#include "DNA_ID.h"
-#include "DNA_object_types.h"
+#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
#include "DNA_node_types.h"
+#include "DNA_object_types.h"
#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
+#include "DNA_world_types.h"
#include "BLI_math.h"
#include "BLI_blenlib.h"
@@ -267,36 +269,61 @@ bNode *node_tree_get_editgroup(bNodeTree *nodetree)
/* assumes nothing being done in ntree yet, sets the default in/out node */
/* called from shading buttons or header */
-void ED_node_shader_default(Material *ma)
+void ED_node_shader_default(Scene *UNUSED(scene), ID *id)
{
bNode *in, *out;
bNodeSocket *fromsock, *tosock;
+ bNodeTree *ntree;
bNodeTemplate ntemp;
+ int output_type, shader_type;
- /* but lets check it anyway */
- if(ma->nodetree) {
- if (G.f & G_DEBUG)
- printf("error in shader initialize\n");
- return;
+ ntree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, 0);
+
+ switch(GS(id->name)) {
+ case ID_MA: {
+ Material *ma= (Material*)id;
+ ma->nodetree = ntree;
+
+ output_type = SH_NODE_OUTPUT;
+ shader_type = SH_NODE_MATERIAL;
+ break;
+ }
+ case ID_WO: {
+ World *wo= (World*)id;
+ wo->nodetree = ntree;
+
+ output_type = SH_NODE_OUTPUT;
+ shader_type = SH_NODE_MATERIAL;
+ break;
+ }
+ case ID_LA: {
+ Lamp *la= (Lamp*)id;
+ la->nodetree = ntree;
+
+ output_type = SH_NODE_OUTPUT;
+ shader_type = SH_NODE_MATERIAL;
+ break;
+ }
+ default:
+ printf("ED_node_shader_default called on wrong ID type.\n");
+ return;
}
- ma->nodetree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, 0);
-
- ntemp.type = SH_NODE_OUTPUT;
- out= nodeAddNode(ma->nodetree, &ntemp);
+ ntemp.type = output_type;
+ out= nodeAddNode(ntree, &ntemp);
out->locx= 300.0f; out->locy= 300.0f;
- ntemp.type = SH_NODE_MATERIAL;
- in= nodeAddNode(ma->nodetree, &ntemp);
+ ntemp.type = shader_type;
+ in= nodeAddNode(ntree, &ntemp);
in->locx= 10.0f; in->locy= 300.0f;
- nodeSetActive(ma->nodetree, in);
+ nodeSetActive(ntree, in);
/* only a link from color to color */
fromsock= in->outputs.first;
tosock= out->inputs.first;
- nodeAddLink(ma->nodetree, in, fromsock, out, tosock);
+ nodeAddLink(ntree, in, fromsock, out, tosock);
- ntreeUpdateTree(ma->nodetree);
+ ntreeUpdateTree(ntree);
}
/* assumes nothing being done in ntree yet, sets the default in/out node */
@@ -387,6 +414,14 @@ void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *tre
*ntree= ((Material*)id)->nodetree;
if(treetype) *treetype= NTREE_SHADER;
}
+ else if(idtype == ID_LA) {
+ *ntree= ((Lamp*)id)->nodetree;
+ if(treetype) *treetype= NTREE_SHADER;
+ }
+ else if(idtype == ID_WO) {
+ *ntree= ((World*)id)->nodetree;
+ if(treetype) *treetype= NTREE_SHADER;
+ }
else if(idtype == ID_SCE) {
*ntree= ((Scene*)id)->nodetree;
if(treetype) *treetype= NTREE_COMPOSIT;
@@ -428,11 +463,25 @@ void snode_set_context(SpaceNode *snode, Scene *scene)
if(snode->treetype==NTREE_SHADER) {
/* need active object, or we allow pinning... */
- if(ob) {
- Material *ma= give_current_material(ob, ob->actcol);
- if(ma) {
- snode->from= &ob->id;
- snode->id= &ma->id;
+ if(snode->shaderfrom == SNODE_SHADER_OBJECT) {
+ if(ob) {
+ if(ob->type == OB_LAMP) {
+ snode->from= &ob->id;
+ snode->id= ob->data;
+ }
+ else {
+ Material *ma= give_current_material(ob, ob->actcol);
+ if(ma) {
+ snode->from= &ob->id;
+ snode->id= &ma->id;
+ }
+ }
+ }
+ }
+ else { /* SNODE_SHADER_WORLD */
+ if(scene->world) {
+ snode->from= NULL;
+ snode->id= &scene->world->id;
}
}
}
@@ -526,7 +575,7 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node)
/* tree specific activate calls */
if(ntree->type==NTREE_SHADER) {
/* when we select a material, active texture is cleared, for buttons */
- if(node->id && GS(node->id->name)==ID_MA)
+ if(node->id && ELEM3(GS(node->id->name), ID_MA, ID_LA, ID_WO))
nodeClearActiveID(ntree, ID_TE);
if(node->type==SH_NODE_OUTPUT) {
diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c
index 68f5dd6bf14..42b5dafa3e1 100644
--- a/source/blender/editors/space_node/node_header.c
+++ b/source/blender/editors/space_node/node_header.c
@@ -46,9 +46,10 @@
#include "BKE_context.h"
#include "BKE_global.h"
-#include "BKE_screen.h"
-#include "BKE_node.h"
#include "BKE_main.h"
+#include "BKE_node.h"
+#include "BKE_scene.h"
+#include "BKE_screen.h"
#include "RNA_access.h"
@@ -168,10 +169,11 @@ static int node_tree_has_type(int treetype, int nodetype)
static void node_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclass)
{
Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
SpaceNode *snode= CTX_wm_space_node(C);
bNodeTree *ntree;
int nodeclass= GET_INT_FROM_POINTER(arg_nodeclass);
- int event;
+ int event, compatibility= 0;
ntree = snode->nodetree;
@@ -179,6 +181,13 @@ static void node_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclass)
uiItemS(layout);
return;
}
+
+ if(ntree->type == NTREE_SHADER) {
+ if(scene_use_new_shading_nodes(scene))
+ compatibility= NODE_NEW_SHADING;
+ else
+ compatibility= NODE_OLD_SHADING;
+ }
if (nodeclass==NODE_CLASS_GROUP) {
bNodeTree *ngroup;
@@ -210,14 +219,16 @@ static void node_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclass)
uiLayoutSetFunc(layout, do_node_add_static, NULL);
for (ntype=ntreeGetType(ntree->type)->node_types.first; ntype; ntype=ntype->next) {
- if(ntype->nclass==nodeclass && ntype->name)
- uiItemV(layout, ntype->name, 0, ntype->type);
+ if (ntype->nclass==nodeclass && ntype->name)
+ if (!compatibility || (ntype->compatibility & compatibility))
+ uiItemV(layout, ntype->name, 0, ntype->type);
}
}
}
static void node_menu_add(const bContext *C, Menu *menu)
{
+ Scene *scene= CTX_data_scene(C);
SpaceNode *snode= CTX_wm_space_node(C);
uiLayout *layout= menu->layout;
@@ -227,11 +238,15 @@ static void node_menu_add(const bContext *C, Menu *menu)
if(snode->treetype==NTREE_SHADER) {
uiItemMenuF(layout, IFACE_("Input"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
uiItemMenuF(layout, IFACE_("Output"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
+ if(scene_use_new_shading_nodes(scene)) {
+ uiItemMenuF(layout, IFACE_("Shader"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_SHADER));
+ uiItemMenuF(layout, IFACE_("Texture"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_TEXTURE));
+ }
uiItemMenuF(layout, IFACE_("Color"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
uiItemMenuF(layout, IFACE_("Vector"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
uiItemMenuF(layout, IFACE_("Convertor"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
uiItemMenuF(layout, IFACE_("Group"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
- uiItemMenuF(layout, IFACE_("Dynamic"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_DYNAMIC));
+ //uiItemMenuF(layout, IFACE_("Dynamic"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_DYNAMIC));
uiItemMenuF(layout, IFACE_("Layout"), 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_LAYOUT));
}
else if(snode->treetype==NTREE_COMPOSIT) {
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index 35b8666f274..1a808e8ee5f 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -32,10 +32,12 @@
#include <string.h>
#include <stdio.h>
+#include "DNA_lamp_types.h"
+#include "DNA_material_types.h"
#include "DNA_node_types.h"
#include "DNA_object_types.h"
-#include "DNA_material_types.h"
#include "DNA_scene_types.h"
+#include "DNA_world_types.h"
#include "MEM_guardedalloc.h"
@@ -268,9 +270,21 @@ static void node_area_refresh(const struct bContext *C, struct ScrArea *sa)
if(snode->nodetree) {
if(snode->treetype==NTREE_SHADER) {
- Material *ma= (Material *)snode->id;
- if(ma->use_nodes)
- ED_preview_shader_job(C, sa, snode->id, NULL, NULL, 100, 100, PR_NODE_RENDER);
+ if(GS(snode->id->name) == ID_MA) {
+ Material *ma= (Material *)snode->id;
+ if(ma->use_nodes)
+ ED_preview_shader_job(C, sa, snode->id, NULL, NULL, 100, 100, PR_NODE_RENDER);
+ }
+ else if(GS(snode->id->name) == ID_LA) {
+ Lamp *la= (Lamp *)snode->id;
+ if(la->use_nodes)
+ ED_preview_shader_job(C, sa, snode->id, NULL, NULL, 100, 100, PR_NODE_RENDER);
+ }
+ else if(GS(snode->id->name) == ID_WO) {
+ World *wo= (World *)snode->id;
+ if(wo->use_nodes)
+ ED_preview_shader_job(C, sa, snode->id, NULL, NULL, 100, 100, PR_NODE_RENDER);
+ }
}
else if(snode->treetype==NTREE_COMPOSIT) {
Scene *scene= (Scene *)snode->id;
@@ -426,6 +440,10 @@ static void node_region_listener(ARegion *ar, wmNotifier *wmn)
case NC_NODE:
ED_region_tag_redraw(ar);
break;
+ case NC_OBJECT:
+ if(wmn->data==ND_OB_SHADING)
+ ED_region_tag_redraw(ar);
+ break;
case NC_ID:
if(wmn->action == NA_RENAME)
ED_region_tag_redraw(ar);
diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h
index 215ab508ab6..4065b3e2e0b 100644
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@ -229,7 +229,4 @@ void OUTLINER_OT_action_set(struct wmOperatorType *ot);
void outliner_operatortypes(void);
void outliner_keymap(struct wmKeyConfig *keyconf);
-/* outliner_header.c */
-void outliner_header_buttons(const struct bContext *C, struct ARegion *ar);
-
#endif /* ED_OUTLINER_INTERN_H */
diff --git a/source/blender/editors/space_outliner/outliner_tree.c b/source/blender/editors/space_outliner/outliner_tree.c
index 925c4571a66..794f898a1fc 100644
--- a/source/blender/editors/space_outliner/outliner_tree.c
+++ b/source/blender/editors/space_outliner/outliner_tree.c
@@ -109,7 +109,7 @@
#define TS_CHUNK 128
/* ********************************************************* */
-/* Persistant Data */
+/* Persistent Data */
static void outliner_storage_cleanup(SpaceOops *soops)
{
@@ -156,7 +156,7 @@ static void outliner_storage_cleanup(SpaceOops *soops)
}
}
-static void check_persistant(SpaceOops *soops, TreeElement *te, ID *id, short type, short nr)
+static void check_persistent(SpaceOops *soops, TreeElement *te, ID *id, short type, short nr)
{
TreeStore *ts;
TreeStoreElem *tselem;
@@ -818,7 +818,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
/* add to the visual tree */
BLI_addtail(lb, te);
/* add to the storage */
- check_persistant(soops, te, id, type, index);
+ check_persistent(soops, te, id, type, index);
tselem= TREESTORE(te);
/* if we are searching for something expand to see child elements */
diff --git a/source/blender/editors/space_script/CMakeLists.txt b/source/blender/editors/space_script/CMakeLists.txt
index fb88d81ddf6..00f8df299e2 100644
--- a/source/blender/editors/space_script/CMakeLists.txt
+++ b/source/blender/editors/space_script/CMakeLists.txt
@@ -35,7 +35,6 @@ set(INC_SYS
set(SRC
script_edit.c
- script_header.c
script_ops.c
space_script.c
diff --git a/source/blender/editors/space_script/script_header.c b/source/blender/editors/space_script/script_header.c
deleted file mode 100644
index 8354dc1e996..00000000000
--- a/source/blender/editors/space_script/script_header.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
- *
- *
- * Contributor(s): Blender Foundation
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/editors/space_script/script_header.c
- * \ingroup spscript
- */
-
-
-#include <string.h>
-#include <stdio.h>
-
-#include "BLI_blenlib.h"
-#include "BLI_utildefines.h"
-
-
-#include "BKE_context.h"
-
-#include "ED_screen.h"
-#include "ED_types.h"
-#include "ED_util.h"
-
-#include "UI_interface.h"
-#include "UI_resources.h"
-#include "UI_view2d.h"
-
-#include "script_intern.h"
-
-/* ************************ header area region *********************** */
-
-static void do_viewmenu(bContext *UNUSED(C), void *UNUSED(arg), int UNUSED(event))
-{
-
-}
-
-static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *UNUSED(arg))
-{
- ScrArea *curarea= CTX_wm_area(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "dummy_viewmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_viewmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Nothing yet", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
-
- return block;
-}
-
-static void do_script_buttons(bContext *UNUSED(C), void *UNUSED(arg), int UNUSED(event))
-{
- //switch(event) {
- //}
-}
-
-
-void script_header_buttons(const bContext *C, ARegion *ar)
-{
- ScrArea *sa= CTX_wm_area(C);
- uiBlock *block;
- int xco, yco= 3;
-
- block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
- uiBlockSetHandleFunc(block, do_script_buttons, NULL);
-
- xco= ED_area_header_standardbuttons(C, block, yco);
-
- if((sa->flag & HEADER_NO_PULLDOWN)==0) {
- int xmax;
-
- xmax= GetButStringLength("View");
- uiDefPulldownBut(block, dummy_viewmenu, CTX_wm_area(C),
- "View", xco, yco-2, xmax-3, UI_UNIT_Y, "");
- xco+=UI_UNIT_X+xmax;
- }
-
- uiBlockSetEmboss(block, UI_EMBOSS);
-
- /* always as last */
- UI_view2d_totRect_set(&ar->v2d, xco+UI_UNIT_X+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
-
- uiEndBlock(C, block);
- uiDrawBlock(C, block);
-}
-
-
diff --git a/source/blender/editors/space_script/script_intern.h b/source/blender/editors/space_script/script_intern.h
index a3565d070eb..98e9699079b 100644
--- a/source/blender/editors/space_script/script_intern.h
+++ b/source/blender/editors/space_script/script_intern.h
@@ -33,10 +33,6 @@
/* internal exports only */
-
-/* script_header.c */
-void script_header_buttons(const bContext *C, ARegion *ar);
-
/* script_ops.c */
void script_operatortypes(void);
void script_keymap(struct wmKeyConfig *keyconf);
diff --git a/source/blender/editors/space_sound/CMakeLists.txt b/source/blender/editors/space_sound/CMakeLists.txt
deleted file mode 100644
index ae605760975..00000000000
--- a/source/blender/editors/space_sound/CMakeLists.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Contributor(s): Jacques Beaurain.
-#
-# ***** END GPL LICENSE BLOCK *****
-
-set(INC
- ../include
- ../../blenkernel
- ../../blenlib
- ../../blenloader
- ../../makesdna
- ../../makesrna
- ../../windowmanager
- ../../../../intern/guardedalloc
-)
-
-set(INC_SYS
- ${GLEW_INCLUDE_PATH}
-)
-
-set(SRC
- sound_header.c
- space_sound.c
-
- sound_intern.h
-)
-
-blender_add_lib(bf_editor_space_sound "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/editors/space_sound/SConscript b/source/blender/editors/space_sound/SConscript
deleted file mode 100644
index d76fb7939ea..00000000000
--- a/source/blender/editors/space_sound/SConscript
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/python
-Import ('env')
-
-sources = env.Glob('*.c')
-
-incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../makesrna ../../imbuf'
-incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include ../../blenloader'
-
-env.BlenderLib ( 'bf_editors_space_sound', sources, Split(incs), [], libtype=['core'], priority=[75] )
diff --git a/source/blender/editors/space_sound/sound_header.c b/source/blender/editors/space_sound/sound_header.c
deleted file mode 100644
index 6e2010c0c63..00000000000
--- a/source/blender/editors/space_sound/sound_header.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
- *
- *
- * Contributor(s): Blender Foundation
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/editors/space_sound/sound_header.c
- * \ingroup spsnd
- */
-
-
-#include <string.h>
-#include <stdio.h>
-
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_blenlib.h"
-#include "BLI_utildefines.h"
-
-
-#include "BKE_context.h"
-
-#include "ED_screen.h"
-#include "ED_types.h"
-#include "ED_util.h"
-
-#include "BIF_gl.h"
-#include "BIF_glutil.h"
-
-#include "UI_interface.h"
-#include "UI_resources.h"
-#include "UI_view2d.h"
-
-#include "sound_intern.h"
-
-
-/* ************************ header area region *********************** */
-
-static void do_viewmenu(bContext *UNUSED(C), void *UNUSED(arg), int UNUSED(event))
-{
-
-}
-
-static uiBlock *dummy_viewmenu(bContext *C, ARegion *ar, void *UNUSED(arg))
-{
- ScrArea *curarea= CTX_wm_area(C);
- uiBlock *block;
- short yco= 0, menuwidth=120;
-
- block= uiBeginBlock(C, ar, "dummy_viewmenu", UI_EMBOSSP);
- uiBlockSetButmFunc(block, do_viewmenu, NULL);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Nothing yet", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
- if(curarea->headertype==HEADERTOP) {
- uiBlockSetDirection(block, UI_DOWN);
- }
- else {
- uiBlockSetDirection(block, UI_TOP);
- uiBlockFlipOrder(block);
- }
-
- uiTextBoundsBlock(block, 50);
- uiEndBlock(C, block);
-
- return block;
-}
-
-static void do_sound_buttons(bContext *UNUSED(C), void *UNUSED(arg), int event)
-{
- switch(event) {
- }
-}
-
-
-void sound_header_buttons(const bContext *C, ARegion *ar)
-{
- ScrArea *sa= CTX_wm_area(C);
- uiBlock *block;
- int xco, yco= 3;
-
- block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS);
- uiBlockSetHandleFunc(block, do_sound_buttons, NULL);
-
- xco= ED_area_header_standardbuttons(C, block, yco);
-
- if((sa->flag & HEADER_NO_PULLDOWN)==0) {
- int xmax;
-
- xmax= GetButStringLength("View");
- uiDefPulldownBut(block, dummy_viewmenu, CTX_wm_area(C),
- "View", xco, yco-2, xmax-3, UI_UNIT_Y, "");
- xco+=UI_UNIT_X+xmax;
- }
-
- uiBlockSetEmboss(block, UI_EMBOSS);
-
- /* always as last */
- UI_view2d_totRect_set(&ar->v2d, xco+UI_UNIT_X+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin);
-
- uiEndBlock(C, block);
- uiDrawBlock(C, block);
-}
-
-
diff --git a/source/blender/editors/space_sound/sound_intern.h b/source/blender/editors/space_sound/sound_intern.h
deleted file mode 100644
index 88891ff4913..00000000000
--- a/source/blender/editors/space_sound/sound_intern.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
- *
- *
- * Contributor(s): Blender Foundation
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/editors/space_sound/sound_intern.h
- * \ingroup spsnd
- */
-
-#ifndef ED_SOUND_INTERN_H
-#define ED_SOUND_INTERN_H
-
-/* internal exports only */
-
-
-/* sound_header.c */
-void sound_header_buttons(const bContext *C, ARegion *ar);
-
-
-#endif /* ED_SOUND_INTERN_H */
-
diff --git a/source/blender/editors/space_sound/space_sound.c b/source/blender/editors/space_sound/space_sound.c
deleted file mode 100644
index 83d1b5b06c2..00000000000
--- a/source/blender/editors/space_sound/space_sound.c
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * The Original Code is Copyright (C) 2008 Blender Foundation.
- * All rights reserved.
- *
- *
- * Contributor(s): Blender Foundation
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/editors/space_sound/space_sound.c
- * \ingroup spsnd
- */
-
-
-#include <string.h>
-#include <stdio.h>
-
-#include "DNA_scene_types.h"
-
-#include "MEM_guardedalloc.h"
-
-#include "BLI_blenlib.h"
-#include "BLI_math.h"
-#include "BLI_rand.h"
-#include "BLI_utildefines.h"
-
-#include "BKE_context.h"
-#include "BKE_screen.h"
-
-#include "ED_space_api.h"
-#include "ED_screen.h"
-
-#include "BIF_gl.h"
-
-#include "WM_api.h"
-#include "WM_types.h"
-
-#include "UI_resources.h"
-#include "UI_view2d.h"
-
-
-#include "sound_intern.h" // own include
-
-/* ******************** default callbacks for sound space ***************** */
-
-static SpaceLink *sound_new(const bContext *UNUSED(C))
-{
- ARegion *ar;
- SpaceSound *ssound;
-
- ssound= MEM_callocN(sizeof(SpaceSound), "initsound");
- ssound->spacetype= SPACE_SOUND;
-
- /* header */
- ar= MEM_callocN(sizeof(ARegion), "header for sound");
-
- BLI_addtail(&ssound->regionbase, ar);
- ar->regiontype= RGN_TYPE_HEADER;
- ar->alignment= RGN_ALIGN_BOTTOM;
-
- /* main area */
- ar= MEM_callocN(sizeof(ARegion), "main area for sound");
-
- BLI_addtail(&ssound->regionbase, ar);
- ar->regiontype= RGN_TYPE_WINDOW;
-
- ar->v2d.tot.xmin= -4.0f;
- ar->v2d.tot.ymin= -4.0f;
- ar->v2d.tot.xmax= 250.0f;
- ar->v2d.tot.ymax= 255.0f;
-
- ar->v2d.cur.xmin= -4.0f;
- ar->v2d.cur.ymin= -4.0f;
- ar->v2d.cur.xmax= 50.0f;
- ar->v2d.cur.ymax= 255.0f;
-
- ar->v2d.min[0]= 1.0f;
- ar->v2d.min[1]= 259.0f;
-
- ar->v2d.max[0]= MAXFRAMEF;
- ar->v2d.max[1]= 259.0f;
-
- ar->v2d.minzoom= 0.1f;
- ar->v2d.maxzoom= 10.0f;
-
- ar->v2d.scroll = (V2D_SCROLL_BOTTOM|V2D_SCROLL_SCALE_HORIZONTAL);
- ar->v2d.scroll |= (V2D_SCROLL_LEFT);
- ar->v2d.keepzoom= 0;
- ar->v2d.keeptot= 0;
- ar->v2d.keepzoom = V2D_LOCKZOOM_Y;
-
-
- return (SpaceLink *)ssound;
-}
-
-/* not spacelink itself */
-static void sound_free(SpaceLink *UNUSED(sl))
-{
-// SpaceSound *ssound= (SpaceSound*) sl;
-
-
-}
-
-
-/* spacetype; init callback */
-static void sound_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
-{
-
-}
-
-static SpaceLink *sound_duplicate(SpaceLink *sl)
-{
- SpaceSound *ssoundn= MEM_dupallocN(sl);
-
- /* clear or remove stuff from old */
-
- return (SpaceLink *)ssoundn;
-}
-
-
-
-/* add handlers, stuff you only do once or on area/region changes */
-static void sound_main_area_init(wmWindowManager *wm, ARegion *ar)
-{
- wmKeyMap *keymap;
-
- UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
-
- /* own keymap */
- keymap= WM_keymap_find(wm->defaultconf, "Sound", SPACE_SOUND, 0);
- WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
-}
-
-static void sound_main_area_draw(const bContext *C, ARegion *ar)
-{
- /* draw entirely, view changes should be handled here */
- // SpaceSound *ssound= (SpaceSound*)CTX_wm_space_data(C);
- View2D *v2d= &ar->v2d;
-
- /* clear and setup matrix */
- UI_ThemeClearColor(TH_BACK);
- glClear(GL_COLOR_BUFFER_BIT);
-
- UI_view2d_view_ortho(v2d);
-
- /* data... */
-
-
- /* reset view matrix */
- UI_view2d_view_restore(C);
-
- /* scrollers? */
-}
-
-static void sound_operatortypes(void)
-{
-
-}
-
-static void sound_keymap(struct wmKeyConfig *UNUSED(keyconf))
-{
-
-}
-
-/* add handlers, stuff you only do once or on area/region changes */
-static void sound_header_area_init(wmWindowManager *UNUSED(wm), ARegion *ar)
-{
- UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy);
-}
-
-static void sound_header_area_draw(const bContext *C, ARegion *ar)
-{
- float col[3];
-
- /* clear */
- if(ED_screen_area_active(C))
- UI_GetThemeColor3fv(TH_HEADER, col);
- else
- UI_GetThemeColor3fv(TH_HEADERDESEL, col);
-
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- /* set view2d view matrix for scrolling (without scrollers) */
- UI_view2d_view_ortho(&ar->v2d);
-
- sound_header_buttons(C, ar);
-
- /* restore view matrix? */
- UI_view2d_view_restore(C);
-}
-
-static void sound_main_area_listener(ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn))
-{
- /* context changes */
-}
-
-/* only called once, from space/spacetypes.c */
-void ED_spacetype_sound(void)
-{
- SpaceType *st= MEM_callocN(sizeof(SpaceType), "spacetype sound");
- ARegionType *art;
-
- st->spaceid= SPACE_SOUND;
- strncpy(st->name, "Sound", BKE_ST_MAXNAME);
-
- st->new= sound_new;
- st->free= sound_free;
- st->init= sound_init;
- st->duplicate= sound_duplicate;
- st->operatortypes= sound_operatortypes;
- st->keymap= sound_keymap;
-
- /* regions: main window */
- art= MEM_callocN(sizeof(ARegionType), "spacetype sound region");
- art->regionid = RGN_TYPE_WINDOW;
- art->init= sound_main_area_init;
- art->draw= sound_main_area_draw;
- art->listener= sound_main_area_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES;
-
- BLI_addhead(&st->regiontypes, art);
-
- /* regions: header */
- art= MEM_callocN(sizeof(ARegionType), "spacetype sound region");
- art->regionid = RGN_TYPE_HEADER;
- art->prefsizey= HEADERY;
- art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_HEADER;
-
- art->init= sound_header_area_init;
- art->draw= sound_header_area_draw;
-
- BLI_addhead(&st->regiontypes, art);
-
- /* regions: channels */
- art= MEM_callocN(sizeof(ARegionType), "spacetype sound region");
- art->regionid = RGN_TYPE_CHANNELS;
- art->prefsizex= 80;
- art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D;
-
-// art->init= sound_channel_area_init;
-// art->draw= sound_channel_area_draw;
-
- BLI_addhead(&st->regiontypes, art);
-
-
- BKE_spacetype_register(st);
-}
-
diff --git a/source/blender/editors/space_time/time_intern.h b/source/blender/editors/space_time/time_intern.h
index 094b0bc9e86..a345d00bd74 100644
--- a/source/blender/editors/space_time/time_intern.h
+++ b/source/blender/editors/space_time/time_intern.h
@@ -40,8 +40,5 @@ struct wmWindowManager;
void time_operatortypes(void);
void time_keymap(struct wmKeyConfig *keyconf);
-/* time_header.c */
-void time_header_buttons(const bContext *C, ARegion *ar);
-
#endif /* ED_TIME_INTERN_H */
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 036223ce577..bf4a7720564 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -104,11 +104,11 @@
/* this condition has been made more complex since editmode can draw textures */
-#define CHECK_OB_DRAWTEXTURE(vd, dt) \
-((vd->drawtype==OB_TEXTURE && dt>OB_SOLID) || \
+#define CHECK_OB_DRAWTEXTURE(vd, dt) \
+ ((vd->drawtype==OB_TEXTURE && dt>OB_SOLID) || \
(vd->drawtype==OB_SOLID && vd->flag2 & V3D_SOLID_TEX))
-static void draw_bounding_volume(Scene *scene, Object *ob);
+static void draw_bounding_volume(Scene *scene, Object *ob, char type);
static void drawcube_size(float size);
static void drawcircle_size(float size);
@@ -2713,15 +2713,14 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
totface = dm->getNumFaces(dm);
/* vertexpaint, faceselect wants this, but it doesnt work for shaded? */
- if(dt!=OB_SHADED)
- glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
+ glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
// Unwanted combination.
if (draw_flags & DRAW_IS_PAINT_SEL) draw_wire = 0;
if(dt==OB_BOUNDBOX) {
if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0)
- draw_bounding_volume(scene, ob);
+ draw_bounding_volume(scene, ob, ob->boundtype);
}
else if(hasHaloMat || (totface==0 && totedge==0)) {
glPointSize(1.5);
@@ -2863,7 +2862,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
dm->drawLooseEdges(dm);
}
}
- else if(dt==OB_SHADED) {
+ else if(dt==OB_PAINT) {
if(ob==OBACT) {
if(ob && ob->mode & OB_MODE_WEIGHT_PAINT) {
/* enforce default material settings */
@@ -5519,7 +5518,7 @@ static void get_local_bounds(Object *ob, float center[3], float size[3])
}
#endif
-static void draw_bb_quadric(BoundBox *bb, short type)
+static void draw_bb_quadric(BoundBox *bb, char type)
{
float size[3], cent[3];
GLUquadricObj *qobj = gluNewQuadric();
@@ -5558,7 +5557,7 @@ static void draw_bb_quadric(BoundBox *bb, short type)
gluDeleteQuadric(qobj);
}
-static void draw_bounding_volume(Scene *scene, Object *ob)
+static void draw_bounding_volume(Scene *scene, Object *ob, char type)
{
BoundBox *bb= NULL;
@@ -5584,8 +5583,8 @@ static void draw_bounding_volume(Scene *scene, Object *ob)
if(bb==NULL) return;
- if(ob->boundtype==OB_BOUND_BOX) draw_box(bb->vec);
- else draw_bb_quadric(bb, ob->boundtype);
+ if(type==OB_BOUND_BOX) draw_box(bb->vec);
+ else draw_bb_quadric(bb, type);
}
@@ -6004,7 +6003,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
/* maximum drawtype */
- dt= MIN2(v3d->drawtype, ob->dt);
+ dt= v3d->drawtype;
+ if(dt==OB_RENDER) dt= OB_SOLID;
+ dt= MIN2(dt, ob->dt);
if(v3d->zbuf==0 && dt>OB_WIRE) dt= OB_WIRE;
dtx= 0;
@@ -6019,7 +6020,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
dt= OB_SOLID;
}
else {
- dt= OB_SHADED;
+ dt= OB_PAINT;
}
glEnable(GL_DEPTH_TEST);
@@ -6149,7 +6150,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
else if(dt==OB_BOUNDBOX) {
if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0)
- draw_bounding_volume(scene, ob);
+ draw_bounding_volume(scene, ob, ob->boundtype);
}
else if(ED_view3d_boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb))
empty_object= drawDispList(scene, v3d, rv3d, base, dt);
@@ -6165,7 +6166,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
else if(dt==OB_BOUNDBOX) {
if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0)
- draw_bounding_volume(scene, ob);
+ draw_bounding_volume(scene, ob, ob->boundtype);
}
else if(ED_view3d_boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) {
empty_object= drawDispList(scene, v3d, rv3d, base, dt);
@@ -6182,7 +6183,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
drawmball(scene, v3d, rv3d, base, dt);
else if(dt==OB_BOUNDBOX) {
if((v3d->flag2 & V3D_RENDER_OVERRIDE && v3d->drawtype >= OB_WIRE)==0)
- draw_bounding_volume(scene, ob);
+ draw_bounding_volume(scene, ob, ob->boundtype);
}
else
empty_object= drawmball(scene, v3d, rv3d, base, dt);
@@ -6424,6 +6425,14 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
}
}
+ if(ob->gameflag & OB_BOUNDS) {
+ if(ob->boundtype!=ob->collision_boundtype || (dtx & OB_BOUNDBOX)==0) {
+ setlinestyle(2);
+ draw_bounding_volume(scene, ob, ob->collision_boundtype);
+ setlinestyle(0);
+ }
+ }
+
/* draw extra: after normal draw because of makeDispList */
if(dtx && (G.f & G_RENDER_OGL)==0) {
@@ -6431,8 +6440,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
drawaxes(1.0f, OB_ARROWS);
}
if(dtx & OB_BOUNDBOX) {
- if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0)
- draw_bounding_volume(scene, ob);
+ draw_bounding_volume(scene, ob, ob->boundtype);
}
if(dtx & OB_TEXSPACE) drawtexspace(ob);
if(dtx & OB_DRAWNAME) {
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index f868cda485f..ef806cb8881 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -56,6 +56,7 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "RE_engine.h"
#include "RNA_access.h"
@@ -344,6 +345,9 @@ static SpaceLink *view3d_duplicate(SpaceLink *sl)
v3do->lay= v3dn->localvd->lay;
v3do->lay &= 0xFFFFFF;
}
+
+ if(v3dn->drawtype == OB_RENDER)
+ v3dn->drawtype = OB_SOLID;
/* copy or clear inside new stuff */
@@ -549,6 +553,9 @@ static void view3d_main_area_free(ARegion *ar)
if(rv3d->ri) {
// XXX BIF_view3d_previewrender_free(rv3d);
}
+
+ if(rv3d->render_engine)
+ RE_engine_free(rv3d->render_engine);
if(rv3d->depths) {
if(rv3d->depths->depths) MEM_freeN(rv3d->depths->depths);
@@ -573,6 +580,7 @@ static void *view3d_main_area_duplicate(void *poin)
new->depths= NULL;
new->ri= NULL;
+ new->render_engine= NULL;
new->gpd= NULL;
new->sms= NULL;
new->smooth_timer= NULL;
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index 63b0f68f158..70cf113384b 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -139,6 +139,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
float median[7], ve_median[7];
int tot, totw, totweight, totedge, totradius;
char defstr[320];
+ PointerRNA radius_ptr;
median[0]= median[1]= median[2]= median[3]= median[4]= median[5]= median[6]= 0.0;
tot= totw= totweight= totedge= totradius= 0;
@@ -210,6 +211,8 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
BezTriple *bezt;
int a;
ListBase *nurbs= curve_editnurbs(cu);
+ StructRNA *seltype= NULL;
+ void *selp= NULL;
nu= nurbs->first;
while(nu) {
@@ -224,6 +227,8 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
totweight++;
median[5]+= bezt->radius;
totradius++;
+ selp= bezt;
+ seltype= &RNA_BezierSplinePoint;
}
else {
if(bezt->f1 & SELECT) {
@@ -251,12 +256,17 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
totweight++;
median[5]+= bp->radius;
totradius++;
+ selp= bp;
+ seltype= &RNA_SplinePoint;
}
bp++;
}
}
nu= nu->next;
}
+
+ if(totradius==1)
+ RNA_pointer_create(&cu->id, seltype, selp, &radius_ptr);
}
else if(ob->type==OB_LATTICE) {
Lattice *lt= ob->data;
@@ -319,9 +329,11 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
uiBlockEndAlign(block);
if(totweight)
uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 20, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 1, 3, "");
- if(totradius)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 20, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 1, 3, "Radius of curve CPs");
+ if(totradius) {
+ if(totradius==1) uiDefButR(block, NUM, 0, "Radius", 0, 20, 200, 20, &radius_ptr, "radius", 0, 0.0, 100.0, 10, 3, NULL);
+ else uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 20, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 1, 3, "Radius of curve CPs");
}
+ }
else {
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, "Global", 0, 65, 100, 20, &v3d->flag, 0, 0, 0, 0, "Displays global values");
@@ -329,8 +341,10 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
uiBlockEndAlign(block);
if(totweight)
uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 0, 40, 200, 20, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "");
- if(totradius)
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 40, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 10, 3, "Radius of curve CPs");
+ if(totradius) {
+ if(totradius==1) uiDefButR(block, NUM, 0, "Radius", 0, 40, 200, 20, &radius_ptr, "radius", 0, 0.0, 100.0, 10, 3, NULL);
+ else uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Radius:", 0, 40, 200, 20, &(tfp->ve_median[5]), 0.0, 100.0, 10, 3, "Radius of curve CPs");
+ }
}
}
else {
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 32e553262e2..aa69e7121e0 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -62,6 +62,7 @@
#include "BKE_screen.h"
#include "BKE_unit.h"
+#include "RE_engine.h"
#include "RE_pipeline.h" // make_stars
#include "IMB_imbuf_types.h"
@@ -920,17 +921,34 @@ static void draw_selected_name(Scene *scene, Object *ob)
BLF_draw_default(offset, 10, 0.0f, info, sizeof(info)-1);
}
-void view3d_viewborder_size_get(Scene *scene, ARegion *ar, float size_r[2])
+void view3d_viewborder_size_get(Scene *scene, Object *camob, ARegion *ar, float size_r[2])
{
- float winmax= MAX2(ar->winx, ar->winy);
float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp);
-
- if(aspect > 1.0f) {
- size_r[0]= winmax;
- size_r[1]= winmax/aspect;
- } else {
- size_r[0]= winmax*aspect;
- size_r[1]= winmax;
+ short sensor_fit= CAMERA_SENSOR_FIT_AUTO;
+
+ if(camob && camob->type==OB_CAMERA) {
+ Camera *cam= (Camera *)camob->data;
+ sensor_fit= cam->sensor_fit;
+ }
+
+ if(sensor_fit==CAMERA_SENSOR_FIT_AUTO) {
+ float winmax= MAX2(ar->winx, ar->winy);
+
+ if(aspect > 1.0f) {
+ size_r[0]= winmax;
+ size_r[1]= winmax/aspect;
+ } else {
+ size_r[0]= winmax*aspect;
+ size_r[1]= winmax;
+ }
+ }
+ else if(sensor_fit==CAMERA_SENSOR_FIT_HOR) {
+ size_r[0]= ar->winx;
+ size_r[1]= ar->winx/aspect;
+ }
+ else {
+ size_r[0]= ar->winy*aspect;
+ size_r[1]= ar->winy;
}
}
@@ -940,7 +958,7 @@ void ED_view3d_calc_camera_border(Scene *scene, ARegion *ar, View3D *v3d, Region
float size[2];
float dx= 0.0f, dy= 0.0f;
- view3d_viewborder_size_get(scene, ar, size);
+ view3d_viewborder_size_get(scene, v3d->camera, ar, size);
size[0]= size[0]*zoomfac;
size[1]= size[1]*zoomfac;
@@ -1207,6 +1225,21 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
uiSetRoundBox(UI_CNR_ALL);
uiDrawBox(GL_LINE_LOOP, x1, y1, x2, y2, 12.0);
}
+ if (ca && (ca->flag & CAM_SHOWSENSOR)) {
+ /* assume fixed sensor width for now */
+
+ /* float sensor_aspect = ca->sensor_x / ca->sensor_y; */ /* UNUSED */
+ float sensor_scale = (x2i-x1i) / ca->sensor_x;
+ float sensor_height = sensor_scale * ca->sensor_y;
+
+ float ymid = y1i + (y2i-y1i)/2.f;
+ float sy1= ymid - sensor_height/2.f;
+ float sy2= ymid + sensor_height/2.f;
+
+ UI_ThemeColorShade(TH_WIRE, 100);
+
+ uiDrawBox(GL_LINE_LOOP, x1i, sy1, x2i, sy2, 2.0f);
+ }
}
setlinestyle(0);
@@ -1226,6 +1259,7 @@ static void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
{
RegionView3D *rv3d= ar->regiondata;
struct Base *base = scene->basact;
+ int multisample_enabled;
rcti winrct;
BLI_assert(ar->regiontype == RGN_TYPE_WINDOW);
@@ -1252,8 +1286,13 @@ static void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
if(v3d->drawtype > OB_WIRE) v3d->zbuf= TRUE;
+ /* dithering and AA break color coding, so disable */
glDisable(GL_DITHER);
+ multisample_enabled= glIsEnabled(GL_MULTISAMPLE_ARB);
+ if(multisample_enabled)
+ glDisable(GL_MULTISAMPLE_ARB);
+
region_scissor_winrct(ar, &winrct);
glScissor(winrct.xmin, winrct.ymin, winrct.xmax - winrct.xmin, winrct.ymax - winrct.ymin);
@@ -1272,9 +1311,8 @@ static void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
G.f |= G_BACKBUFSEL;
- if(base && (base->lay & v3d->lay)) {
+ if(base && (base->lay & v3d->lay))
draw_object_backbufsel(scene, v3d, rv3d, base->object);
- }
v3d->flag &= ~V3D_INVALID_BACKBUF;
ar->swap= 0; /* mark invalid backbuf for wm draw */
@@ -1283,6 +1321,8 @@ static void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d)
v3d->zbuf= FALSE;
glDisable(GL_DEPTH_TEST);
glEnable(GL_DITHER);
+ if(multisample_enabled)
+ glEnable(GL_MULTISAMPLE_ARB);
if(rv3d->rflag & RV3D_CLIPPING)
view3d_clr_clipping();
@@ -2388,10 +2428,12 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
/* render 3d view */
if(rv3d->persp==RV3D_CAMOB && v3d->camera) {
float winmat[4][4];
- float _clipsta, _clipend, _lens, _yco, _dx, _dy;
+ float _clipsta, _clipend, _lens, _yco, _dx, _dy, _sensor_x= DEFAULT_SENSOR_WIDTH, _sensor_y= DEFAULT_SENSOR_HEIGHT;
+ short _sensor_fit= CAMERA_SENSOR_FIT_AUTO;
rctf _viewplane;
- object_camera_matrix(&scene->r, v3d->camera, sizex, sizey, 0, winmat, &_viewplane, &_clipsta, &_clipend, &_lens, &_yco, &_dx, &_dy);
+ object_camera_matrix(&scene->r, v3d->camera, sizex, sizey, 0, winmat, &_viewplane, &_clipsta, &_clipend, &_lens,
+ &_sensor_x, &_sensor_y, &_sensor_fit, &_yco, &_dx, &_dy);
ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat);
}
@@ -2446,9 +2488,10 @@ ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, Object *camera, int w
invert_m4_m4(rv3d.viewmat, rv3d.viewinv);
{
- float _yco, _dx, _dy;
+ float _yco, _dx, _dy, _sensor_x= DEFAULT_SENSOR_WIDTH, _sensor_y= DEFAULT_SENSOR_HEIGHT;
+ short _sensor_fit= CAMERA_SENSOR_FIT_AUTO;
rctf _viewplane;
- object_camera_matrix(&scene->r, v3d.camera, width, height, 0, rv3d.winmat, &_viewplane, &v3d.near, &v3d.far, &v3d.lens, &_yco, &_dx, &_dy);
+ object_camera_matrix(&scene->r, v3d.camera, width, height, 0, rv3d.winmat, &_viewplane, &v3d.near, &v3d.far, &v3d.lens, &_sensor_x, &_sensor_y, &_sensor_fit, &_yco, &_dx, &_dy);
}
mul_m4_m4m4(rv3d.persmat, rv3d.viewmat, rv3d.winmat);
@@ -2511,6 +2554,62 @@ static void draw_viewport_fps(Scene *scene, ARegion *ar)
BLF_draw_default_ascii(22, ar->winy-17, 0.0f, printable, sizeof(printable)-1);
}
+static int view3d_main_area_draw_engine(const bContext *C, ARegion *ar)
+{
+ Scene *scene= CTX_data_scene(C);
+ View3D *v3d = CTX_wm_view3d(C);
+ RegionView3D *rv3d= CTX_wm_region_view3d(C);
+ RenderEngineType *type;
+
+ if(!rv3d->render_engine) {
+ type= RE_engines_find(scene->r.engine);
+
+ if(!(type->view_update && type->view_draw))
+ return 0;
+
+ rv3d->render_engine= RE_engine_create(type);
+ type->view_update(rv3d->render_engine, C);
+ }
+
+ view3d_main_area_setup_view(scene, v3d, ar, NULL, NULL);
+
+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ ED_region_pixelspace(ar);
+
+ type= rv3d->render_engine->type;
+ type->view_draw(rv3d->render_engine, C);
+
+ return 1;
+}
+
+static void view3d_main_area_draw_engine_info(RegionView3D *rv3d, ARegion *ar)
+{
+ rcti rect;
+ const int header_height = 18;
+
+ if(!rv3d->render_engine || !rv3d->render_engine->text)
+ return;
+
+ /* background box */
+ rect= ar->winrct;
+ rect.xmin= 0;
+ rect.ymin= ar->winrct.ymax - ar->winrct.ymin - header_height;
+ rect.xmax= ar->winrct.xmax - ar->winrct.xmin;
+ rect.ymax= ar->winrct.ymax - ar->winrct.ymin;
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+ glColor4f(0.0f, 0.0f, 0.0f, 0.25f);
+ glRecti(rect.xmin, rect.ymin, rect.xmax+1, rect.ymax+1);
+ glDisable(GL_BLEND);
+
+ /* text */
+ UI_ThemeColor(TH_TEXT_HI);
+ UI_DrawString(12, rect.ymin + 5, rv3d->render_engine->text);
+}
+
/* warning: this function has duplicate drawing in ED_view3d_draw_offscreen() */
static void view3d_main_area_draw_objects(const bContext *C, ARegion *ar, const char **grid_unit)
{
@@ -2721,6 +2820,11 @@ static void view3d_main_area_draw_info(const bContext *C, ARegion *ar, const cha
else
draw_view_icon(rv3d);
+ if(rv3d->render_engine) {
+ view3d_main_area_draw_engine_info(rv3d, ar);
+ return;
+ }
+
if((U.uiflag & USER_SHOW_FPS) && screen->animtimer) {
draw_viewport_fps(scene, ar);
}
@@ -2748,9 +2852,12 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
View3D *v3d = CTX_wm_view3d(C);
const char *grid_unit= NULL;
- view3d_main_area_draw_objects(C, ar, &grid_unit);
-
- ED_region_pixelspace(ar);
+ /* draw viewport using external renderer? */
+ if(!(v3d->drawtype == OB_RENDER && view3d_main_area_draw_engine(C, ar))) {
+ /* draw viewport using opengl */
+ view3d_main_area_draw_objects(C, ar, &grid_unit);
+ ED_region_pixelspace(ar);
+ }
view3d_main_area_draw_info(C, ar, grid_unit);
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index ea8db17daf0..e7fbdaf1deb 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -2255,13 +2255,14 @@ static int view3d_center_camera_exec(bContext *C, wmOperator *UNUSED(op)) /* was
{
ARegion *ar= CTX_wm_region(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
+ View3D *v3d= CTX_wm_view3d(C);
Scene *scene= CTX_data_scene(C);
float xfac, yfac;
float size[2];
rv3d->camdx= rv3d->camdy= 0.0f;
- view3d_viewborder_size_get(scene, ar, size);
+ view3d_viewborder_size_get(scene, v3d->camera, ar, size);
/* 4px is just a little room from the edge of the area */
xfac= (float)ar->winx / (float)(size[0] + 4);
@@ -2523,13 +2524,13 @@ void VIEW3D_OT_zoom_border(wmOperatorType *ot)
}
/* sets the view to 1:1 camera/render-pixel */
-static void view3d_set_1_to_1_viewborder(Scene *scene, ARegion *ar)
+static void view3d_set_1_to_1_viewborder(Scene *scene, ARegion *ar, View3D *v3d)
{
RegionView3D *rv3d= ar->regiondata;
float size[2];
int im_width= (scene->r.size*scene->r.xsch)/100;
- view3d_viewborder_size_get(scene, ar, size);
+ view3d_viewborder_size_get(scene, v3d->camera, ar, size);
rv3d->camzoom= BKE_screen_view3d_zoom_from_fac((float)im_width/size[0]);
CLAMP(rv3d->camzoom, RV3D_CAMZOOM_MIN, RV3D_CAMZOOM_MAX);
@@ -2540,7 +2541,7 @@ static int view3d_zoom_1_to_1_camera_exec(bContext *C, wmOperator *UNUSED(op))
Scene *scene= CTX_data_scene(C);
ARegion *ar= CTX_wm_region(C);
- view3d_set_1_to_1_viewborder(scene, ar);
+ view3d_set_1_to_1_viewborder(scene, ar, CTX_wm_view3d(C));
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, CTX_wm_view3d(C));
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index fa6611b9925..73174dcace8 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -83,9 +83,6 @@
* This can be cleaned when I make some new 'mode' icons.
*/
-#define TEST_EDITMESH if(obedit==0) return; \
- if( (v3d->lay & obedit->lay)==0 ) return;
-
/* view3d handler codes */
#define VIEW3D_HANDLER_BACKGROUND 1
#define VIEW3D_HANDLER_PROPERTIES 2
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index 78af6a823ab..772f29fb502 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -139,7 +139,7 @@ void draw_depth_gpencil(Scene *scene, ARegion *ar, View3D *v3d);
void view3d_clr_clipping(void);
void view3d_set_clipping(RegionView3D *rv3d);
void add_view3d_after(ListBase *lb, Base *base, int flag);
-void view3d_viewborder_size_get(struct Scene *scene, struct ARegion *ar, float size_r[2]);
+void view3d_viewborder_size_get(struct Scene *scene, struct Object *camob, struct ARegion *ar, float size_r[2]);
void circf(float x, float y, float rad);
void circ(float x, float y, float rad);
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 93c577619de..7de1f2a85bb 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -966,10 +966,14 @@ int ED_view3d_clip_range_get(View3D *v3d, RegionView3D *rv3d, float *clipsta, fl
int ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize)
{
Camera *cam=NULL;
- float lens, fac, x1, y1, x2, y2;
+ float lens, sensor_x =DEFAULT_SENSOR_WIDTH, sensor_y= DEFAULT_SENSOR_HEIGHT, fac, x1, y1, x2, y2;
float winx= (float)winxi, winy= (float)winyi;
int orth= 0;
-
+ short sensor_fit= CAMERA_SENSOR_FIT_AUTO;
+
+ /* currnetly using sensor size (depends on fov calculating method) */
+ float sensor= DEFAULT_SENSOR_WIDTH;
+
lens= v3d->lens;
*clipsta= v3d->near;
@@ -992,8 +996,13 @@ int ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winxi, int winy
else if(v3d->camera->type==OB_CAMERA) {
cam= v3d->camera->data;
lens= cam->lens;
+ sensor_x= cam->sensor_x;
+ sensor_y= cam->sensor_y;
*clipsta= cam->clipsta;
*clipend= cam->clipend;
+ sensor_fit= cam->sensor_fit;
+
+ sensor= (cam->sensor_fit==CAMERA_SENSOR_FIT_VERT) ? (cam->sensor_y) : (cam->sensor_x);
}
}
}
@@ -1024,21 +1033,44 @@ int ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winxi, int winy
if(cam && cam->type==CAM_ORTHO) {
/* ortho_scale == 1 means exact 1 to 1 mapping */
float dfac= 2.0f*cam->ortho_scale/fac;
-
- if(winx>winy) x1= -dfac;
- else x1= -winx*dfac/winy;
+
+ if(sensor_fit==CAMERA_SENSOR_FIT_AUTO) {
+ if(winx>winy) {
+ x1= -dfac;
+ y1= -winy*dfac/winx;
+ }
+ else {
+ x1= -winx*dfac/winy;
+ y1= -dfac;
+ }
+ }
+ else if(sensor_fit==CAMERA_SENSOR_FIT_HOR) {
+ x1= -dfac;
+ y1= -winy*dfac/winx;
+ }
+ else {
+ x1= -winx*dfac/winy;
+ y1= -dfac;
+ }
+
x2= -x1;
-
- if(winx>winy) y1= -winy*dfac/winx;
- else y1= -dfac;
y2= -y1;
+
orth= 1;
}
else {
float dfac;
- if(winx>winy) dfac= 64.0f/(fac*winx*lens);
- else dfac= 64.0f/(fac*winy*lens);
+ if(sensor_fit==CAMERA_SENSOR_FIT_AUTO) {
+ if(winx>winy) dfac= (sensor_x * 2.0) / (fac*winx*lens);
+ else dfac= (sensor_x * 2.0) / (fac*winy*lens);
+ }
+ else if(sensor_fit==CAMERA_SENSOR_FIT_HOR) {
+ dfac= (sensor_x * 2.0) / (fac*winx*lens);
+ }
+ else {
+ dfac= (sensor_y * 2.0) / (fac*winy*lens);
+ }
x1= - *clipsta * winx*dfac;
x2= -x1;
@@ -1057,8 +1089,8 @@ int ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winxi, int winy
dy += cam->shifty * cam->ortho_scale;
}
else {
- dx += cam->shiftx * (cam->clipsta / cam->lens) * 32.0f;
- dy += cam->shifty * (cam->clipsta / cam->lens) * 32.0f;
+ dx += cam->shiftx * (cam->clipsta / cam->lens) * sensor;
+ dy += cam->shifty * (cam->clipsta / cam->lens) * sensor;
}
x1+= dx;
@@ -1076,7 +1108,14 @@ int ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winxi, int winy
*pixsize= 1.0f/viewfac;
}
else {
- viewfac= (((winx >= winy)? winx: winy)*lens)/32.0f;
+ float size= ((winx >= winy)? winx: winy);
+
+ if(sensor_fit==CAMERA_SENSOR_FIT_HOR)
+ size= winx;
+ else if(sensor_fit==CAMERA_SENSOR_FIT_VERT)
+ size= winy;
+
+ viewfac= (size*lens)/sensor;
*pixsize= *clipsta/viewfac;
}
}
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 9c1d5adcd1b..759fefba438 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -118,10 +118,22 @@ void setTransformViewMatrices(TransInfo *t)
calculateCenter2D(t);
}
+static void convertViewVec2D(View2D *v2d, float *vec, int dx, int dy)
+{
+ float divx, divy;
+
+ divx= v2d->mask.xmax - v2d->mask.xmin;
+ divy= v2d->mask.ymax - v2d->mask.ymin;
+
+ vec[0]= (v2d->cur.xmax - v2d->cur.xmin) * dx / divx;
+ vec[1]= (v2d->cur.ymax - v2d->cur.ymin) * dy / divy;
+ vec[2]= 0.0f;
+}
+
void convertViewVec(TransInfo *t, float *vec, int dx, int dy)
{
- if (t->spacetype==SPACE_VIEW3D) {
- if (t->ar->regiontype == RGN_TYPE_WINDOW) {
+ if(t->spacetype==SPACE_VIEW3D) {
+ if(t->ar->regiontype == RGN_TYPE_WINDOW) {
float mval_f[2];
mval_f[0]= dx;
mval_f[1]= dy;
@@ -129,50 +141,19 @@ void convertViewVec(TransInfo *t, float *vec, int dx, int dy)
}
}
else if(t->spacetype==SPACE_IMAGE) {
- View2D *v2d = t->view;
- float divx, divy, aspx, aspy;
-
- ED_space_image_uv_aspect(t->sa->spacedata.first, &aspx, &aspy);
+ float aspx, aspy;
- divx= v2d->mask.xmax-v2d->mask.xmin;
- divy= v2d->mask.ymax-v2d->mask.ymin;
+ convertViewVec2D(t->view, vec, dx, dy);
- vec[0]= aspx*(v2d->cur.xmax-v2d->cur.xmin)*(dx)/divx;
- vec[1]= aspy*(v2d->cur.ymax-v2d->cur.ymin)*(dy)/divy;
- vec[2]= 0.0f;
+ ED_space_image_uv_aspect(t->sa->spacedata.first, &aspx, &aspy);
+ vec[0]*= aspx;
+ vec[1]*= aspy;
}
else if(ELEM(t->spacetype, SPACE_IPO, SPACE_NLA)) {
- View2D *v2d = t->view;
- float divx, divy;
-
- divx= v2d->mask.xmax-v2d->mask.xmin;
- divy= v2d->mask.ymax-v2d->mask.ymin;
-
- vec[0]= (v2d->cur.xmax-v2d->cur.xmin)*(dx) / (divx);
- vec[1]= (v2d->cur.ymax-v2d->cur.ymin)*(dy) / (divy);
- vec[2]= 0.0f;
+ convertViewVec2D(t->view, vec, dx, dy);
}
- else if(t->spacetype==SPACE_NODE) {
- View2D *v2d = &t->ar->v2d;
- float divx, divy;
-
- divx= v2d->mask.xmax-v2d->mask.xmin;
- divy= v2d->mask.ymax-v2d->mask.ymin;
-
- vec[0]= (v2d->cur.xmax-v2d->cur.xmin)*(dx)/divx;
- vec[1]= (v2d->cur.ymax-v2d->cur.ymin)*(dy)/divy;
- vec[2]= 0.0f;
- }
- else if(t->spacetype==SPACE_SEQ) {
- View2D *v2d = &t->ar->v2d;
- float divx, divy;
-
- divx= v2d->mask.xmax-v2d->mask.xmin;
- divy= v2d->mask.ymax-v2d->mask.ymin;
-
- vec[0]= (v2d->cur.xmax-v2d->cur.xmin)*(dx)/divx;
- vec[1]= (v2d->cur.ymax-v2d->cur.ymin)*(dy)/divy;
- vec[2]= 0.0f;
+ else if(ELEM(t->spacetype, SPACE_NODE, SPACE_SEQ)) {
+ convertViewVec2D(&t->ar->v2d, vec, dx, dy);
}
}
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index 2d3c1d80d8d..f926f442830 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -610,7 +610,7 @@ void TRANSFORM_OT_tilt(struct wmOperatorType *ot)
ot->exec = transform_exec;
ot->modal = transform_modal;
ot->cancel = transform_cancel;
- ot->poll = ED_operator_editcurve;
+ ot->poll = ED_operator_editcurve_3d;
RNA_def_float_rotation(ot->srna, "value", 1, NULL, -FLT_MAX, FLT_MAX, "Angle", "", -M_PI*2, M_PI*2);
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 7dabb9898cc..5e0eff69047 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -161,17 +161,18 @@ void GPU_buffer_unbind(void);
int GPU_buffer_legacy( struct DerivedMesh *dm );
/* Buffers for non-DerivedMesh drawing */
-void *GPU_build_mesh_buffers(struct GHash *map, struct MVert *mvert,
+typedef struct GPU_Buffers GPU_Buffers;
+GPU_Buffers *GPU_build_mesh_buffers(struct GHash *map, struct MVert *mvert,
struct MFace *mface, int *face_indices,
int totface, int *vert_indices, int uniq_verts,
int totvert);
-void GPU_update_mesh_buffers(void *buffers, struct MVert *mvert,
+void GPU_update_mesh_buffers(GPU_Buffers *buffers, struct MVert *mvert,
int *vert_indices, int totvert);
-void *GPU_build_grid_buffers(struct DMGridData **grids,
+GPU_Buffers *GPU_build_grid_buffers(struct DMGridData **grids,
int *grid_indices, int totgrid, int gridsize);
-void GPU_update_grid_buffers(void *buffers_v, struct DMGridData **grids,
+void GPU_update_grid_buffers(GPU_Buffers *buffers_v, struct DMGridData **grids,
int *grid_indices, int totgrid, int gridsize, int smooth);
-void GPU_draw_buffers(void *buffers);
-void GPU_free_buffers(void *buffers);
+void GPU_draw_buffers(GPU_Buffers *buffers);
+void GPU_free_buffers(GPU_Buffers *buffers);
#endif
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index d833fb5eb04..22cae058b2a 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -1279,7 +1279,7 @@ typedef struct {
short no[3];
} VertexBufferFormat;
-typedef struct {
+struct GPU_Buffers {
/* opengl buffer handles */
GLuint vert_buf, index_buf;
GLenum index_type;
@@ -1297,9 +1297,9 @@ typedef struct {
int gridsize;
unsigned int tot_tri, tot_quad;
-} GPU_Buffers;
+};
-void GPU_update_mesh_buffers(void *buffers_v, MVert *mvert,
+void GPU_update_mesh_buffers(GPU_Buffers *buffers_v, MVert *mvert,
int *vert_indices, int totvert)
{
GPU_Buffers *buffers = buffers_v;
@@ -1336,7 +1336,7 @@ void GPU_update_mesh_buffers(void *buffers_v, MVert *mvert,
buffers->mvert = mvert;
}
-void *GPU_build_mesh_buffers(GHash *map, MVert *mvert, MFace *mface,
+GPU_Buffers *GPU_build_mesh_buffers(GHash *map, MVert *mvert, MFace *mface,
int *face_indices, int totface,
int *vert_indices, int tot_uniq_verts,
int totvert)
@@ -1416,7 +1416,7 @@ void *GPU_build_mesh_buffers(GHash *map, MVert *mvert, MFace *mface,
return buffers;
}
-void GPU_update_grid_buffers(void *buffers_v, DMGridData **grids,
+void GPU_update_grid_buffers(GPU_Buffers *buffers_v, DMGridData **grids,
int *grid_indices, int totgrid, int gridsize, int smooth)
{
GPU_Buffers *buffers = buffers_v;
@@ -1471,7 +1471,7 @@ void GPU_update_grid_buffers(void *buffers_v, DMGridData **grids,
//printf("node updated %p\n", buffers_v);
}
-void *GPU_build_grid_buffers(DMGridData **UNUSED(grids), int *UNUSED(grid_indices),
+GPU_Buffers *GPU_build_grid_buffers(DMGridData **UNUSED(grids), int *UNUSED(grid_indices),
int totgrid, int gridsize)
{
GPU_Buffers *buffers;
@@ -1561,7 +1561,7 @@ void *GPU_build_grid_buffers(DMGridData **UNUSED(grids), int *UNUSED(grid_indice
return buffers;
}
-void GPU_draw_buffers(void *buffers_v)
+void GPU_draw_buffers(GPU_Buffers *buffers_v)
{
GPU_Buffers *buffers = buffers_v;
@@ -1635,7 +1635,7 @@ void GPU_draw_buffers(void *buffers_v)
}
}
-void GPU_free_buffers(void *buffers_v)
+void GPU_free_buffers(GPU_Buffers *buffers_v)
{
if(buffers_v) {
GPU_Buffers *buffers = buffers_v;
diff --git a/source/blender/imbuf/intern/moviecache.c b/source/blender/imbuf/intern/moviecache.c
index 7492b6aec44..41169a1c211 100644
--- a/source/blender/imbuf/intern/moviecache.c
+++ b/source/blender/imbuf/intern/moviecache.c
@@ -25,7 +25,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/blenkernel/intern/moviecache.c
+/** \file blender/imbuf/intern/moviecache.c
* \ingroup bke
*/
@@ -230,7 +230,7 @@ void IMB_moviecache_put(MovieCache *cache, void *userkey, ImBuf *ibuf)
key= BLI_mempool_alloc(cache->keys_pool);
key->cache_owner= cache;
- key->userkey= BLI_mempool_alloc(cache->userkeys_pool);;
+ key->userkey= BLI_mempool_alloc(cache->userkeys_pool);
memcpy(key->userkey, userkey, cache->keysize);
item= BLI_mempool_alloc(cache->items_pool);
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index d2c7d49e5f9..6f2933d154b 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -235,6 +235,7 @@ typedef struct PreviewImage {
#define LIB_PRE_EXISTING 2048
/* runtime */
#define LIB_ID_RECALC 4096
+#define LIB_ID_RECALC_DATA 8192
#ifdef __cplusplus
}
diff --git a/source/blender/makesdna/DNA_camera_types.h b/source/blender/makesdna/DNA_camera_types.h
index 8ad6821702a..292f920da66 100644
--- a/source/blender/makesdna/DNA_camera_types.h
+++ b/source/blender/makesdna/DNA_camera_types.h
@@ -51,6 +51,7 @@ typedef struct Camera {
float passepartalpha;
float clipsta, clipend;
float lens, ortho_scale, drawsize;
+ float sensor_x, sensor_y;
float shiftx, shifty;
/* yafray: dof params */
@@ -61,6 +62,9 @@ typedef struct Camera {
struct Ipo *ipo; // XXX depreceated... old animation system
struct Object *dof_ob;
+
+ char sensor_fit;
+ char pad[7];
} Camera;
/* **************** CAMERA ********************* */
@@ -88,10 +92,18 @@ typedef struct Camera {
#define CAM_ANGLETOGGLE 32
#define CAM_DS_EXPAND 64
#define CAM_PANORAMA 128
+#define CAM_SHOWSENSOR 256
/* yafray: dof sampling switch */
/* #define CAM_YF_NO_QMC 512 */ /* depreceated */
+/* Sensor fit */
+#define CAMERA_SENSOR_FIT_AUTO 0
+#define CAMERA_SENSOR_FIT_HOR 1
+#define CAMERA_SENSOR_FIT_VERT 2
+
+#define DEFAULT_SENSOR_WIDTH 32.0f
+#define DEFAULT_SENSOR_HEIGHT 18.0f
#ifdef __cplusplus
}
diff --git a/source/blender/makesdna/DNA_lamp_types.h b/source/blender/makesdna/DNA_lamp_types.h
index e36573473f3..91930f5766e 100644
--- a/source/blender/makesdna/DNA_lamp_types.h
+++ b/source/blender/makesdna/DNA_lamp_types.h
@@ -37,10 +37,11 @@
#define MAX_MTEX 18
#endif
-struct MTex;
-struct CurveMapping;
struct AnimData;
+struct bNodeTree;
+struct CurveMapping;
struct Ipo;
+struct MTex;
typedef struct Lamp {
ID id;
@@ -98,11 +99,14 @@ typedef struct Lamp {
struct Ipo *ipo; // XXX depreceated... old animation system
struct MTex *mtex[18]; /* MAX_MTEX */
- short pr_texture;
- char pad6[6];
+ short pr_texture, use_nodes;
+ char pad6[4];
/* preview */
struct PreviewImage *preview;
+
+ /* nodes */
+ struct bNodeTree *nodetree;
} Lamp;
/* **************** LAMP ********************* */
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index ece6c84b0e8..bb67b46a7e5 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -125,6 +125,14 @@ typedef struct TFace {
#define ME_EDIT_MIRROR_TOPO (1 << 4)
#define ME_EDIT_VERT_SEL (1 << 5)
+/* we cant have both flags enabled at once,
+ * flags defined in DNA_scene_types.h */
+#define ME_EDIT_PAINT_SEL_MODE(_me) ( \
+ (_me->editflag & ME_EDIT_PAINT_MASK) ? SCE_SELECT_FACE : \
+ (_me->editflag & ME_EDIT_VERT_SEL) ? SCE_SELECT_VERTEX : \
+ 0 \
+ )
+
/* me->flag */
/* #define ME_ISDONE 1 */
#define ME_DEPRECATED 2
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 19eff756ce1..3306b9e97bc 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -111,12 +111,12 @@ typedef struct Object {
/* proxy_from is set in target back to the proxy. */
struct Object *proxy, *proxy_group, *proxy_from;
struct Ipo *ipo; // XXX depreceated... old animation system
- struct Path *path;
+ /* struct Path *path; */
struct BoundBox *bb;
struct bAction *action; // XXX depreceated... old animation system
struct bAction *poselib;
- struct bPose *pose;
- void *data;
+ struct bPose *pose; /* pose data, armature objects only */
+ void *data; /* pointer to objects data - an 'ID' or NULL */
struct bGPdata *gpd; /* Grease Pencil data */
@@ -124,9 +124,9 @@ typedef struct Object {
bMotionPath *mpath; /* motion path cache for this object */
ListBase constraintChannels; // XXX depreceated... old animation system
- ListBase effect;
- ListBase disp;
- ListBase defbase;
+ ListBase effect; // XXX depreceated... keep for readfile
+ ListBase disp; /* list of DispList, used by lattice, metaballs curve & surfaces */
+ ListBase defbase; /* list of bDeformGroup (vertex groups) names and flag only */
ListBase modifiers; /* list of ModifierData structures */
int mode; /* Local object mode */
@@ -156,7 +156,7 @@ typedef struct Object {
*/
float imat_ren[4][4];
- unsigned int lay; /* copy of Base */
+ unsigned int lay; /* copy of Base's layer in the scene */
short flag; /* copy of Base */
short colbits; /* deprecated */
@@ -164,9 +164,10 @@ typedef struct Object {
short transflag, protectflag; /* transformation settings and transform locks */
short trackflag, upflag;
short nlaflag, ipoflag; // xxx depreceated... old animation system
- short ipowin, scaflag; /* ipowin: blocktype last ipowindow */
- short scavisflag, boundtype;
-
+ short scaflag; /* ui state for game logic */
+ char scavisflag; /* more display settings for game logic */
+ char pad5;
+
int dupon, dupoff, dupsta, dupend;
float sf, ctime; /* sf is time-offset, ctime is the objects current time (XXX timing needs to be revised) */
@@ -193,41 +194,33 @@ typedef struct Object {
float min_vel; /* clamp the maximum velocity 0.0 is disabled */
float m_contactProcessingThreshold;
float obstacleRad;
- char pad0[4];
-
+
short rotmode; /* rotation mode - uses defines set out in DNA_action_types.h for PoseChannel rotations... */
-
- char dt, dtx;
- char empty_drawtype, pad1[3];
+
+ char boundtype; /* bounding box use for drawing */
+ char collision_boundtype; /* bounding box type used for collision */
+
+ char restrictflag; /* for restricting view, select, render etc. accessible in outliner */
+
+ char dt; /* viewport draw type */
+ char dtx; /* viewport draw extra settings */
+ char empty_drawtype;
float empty_drawsize;
float dupfacesca; /* dupliface scale */
- ListBase prop;
- ListBase sensors;
- ListBase controllers;
- ListBase actuators;
-
+ ListBase prop; /* game logic property list (not to be confused with IDProperties) */
+ ListBase sensors; /* game logic sensors */
+ ListBase controllers; /* game logic controllers */
+ ListBase actuators; /* game logic actuators */
+
float bbsize[3];
short index; /* custom index, for renderpasses */
unsigned short actdef; /* current deformation group, note: index starts at 1 */
float col[4]; /* object color */
- /**
- * Settings for game objects
- * bit 0: Object has dynamic behaviour
- * bit 2: Object is evaluated by the gameengine
- * bit 6: Use Fh settings in Materials
- * bit 7: Use face normal to rotate Object
- * bit 8: Friction is anisotropic
- * bit 9: Object is a ghost
- * bit 10: Do rigid body dynamics.
- * bit 11: Use bounding object for physics
- */
+
int gameflag;
- /**
- * More settings
- * bit 15: Always ignore activity culling
- */
int gameflag2;
+
struct BulletSoftBody *bsoft; /* settings for game engine bullet soft body */
short softflag; /* softbody settings */
@@ -236,22 +229,18 @@ typedef struct Object {
ListBase constraints; /* object constraints */
ListBase nlastrips; // XXX depreceated... old animation system
- ListBase hooks;
+ ListBase hooks; // XXX depreceated... old animation system
ListBase particlesystem; /* particle systems */
struct PartDeflect *pd; /* particle deflector/attractor/collision data */
struct SoftBody *soft; /* if exists, saved in file */
struct Group *dup_group; /* object duplicator for group */
-
- short fluidsimFlag; /* NT toggle fluidsim participation on/off */
-
- short restrictflag; /* for restricting view, select, render etc. accessible in outliner */
- short shapenr, shapeflag; /* current shape key for menu or pinned, flag for pinning */
+ char body_type; /* for now used to temporarily holds the type of collision object */
+ char shapeflag; /* flag for pinning */
+ short shapenr; /* current shape key for menu or pinned */
float smoothresh; /* smoothresh is phong interpolation ray_shadow correction in render */
- short recalco; /* recalco for temp storage of ob->recalc, bad design warning */
- short body_type; /* for now used to temporarily holds the type of collision object */
-
+
struct FluidsimSettings *fluidsimSettings; /* if fluidsim enabled, store additional settings */
struct DerivedMesh *derivedDeform, *derivedFinal;
@@ -260,12 +249,11 @@ typedef struct Object {
unsigned int state; /* bit masks of game controllers that are active */
unsigned int init_state; /* bit masks of initial state as recorded by the users */
- ListBase gpulamp; /* runtime, for lamps only */
+ ListBase gpulamp; /* runtime, for glsl lamp display only */
ListBase pc_ids;
ListBase *duplilist; /* for temporary dupli list storage, only for use by RNA API */
float ima_ofs[2]; /* offset for image empties */
- char pad3[8];
} Object;
/* Warning, this is not used anymore because hooks are now modifiers */
@@ -286,13 +274,17 @@ typedef struct ObHook {
float force;
} ObHook;
+/* runtime only, but include here for rna access */
typedef struct DupliObject {
struct DupliObject *next, *prev;
struct Object *ob;
unsigned int origlay;
- int index, no_draw, type, animated;
+ int index;
float mat[4][4], omat[4][4];
float orco[3], uv[2];
+
+ short type; /* from Object.transflag */
+ char no_draw, animated;
} DupliObject;
/* **************** OBJECT ********************* */
@@ -321,6 +313,7 @@ typedef struct DupliObject {
/* check if the object type supports materials */
#define OB_TYPE_SUPPORT_MATERIAL(_type) ((_type) >= OB_MESH && (_type) <= OB_MBALL)
+#define OB_TYPE_SUPPORT_VGROUP(_type) (ELEM(_type, OB_MESH, OB_LATTICE))
/* partype: first 4 bits: type */
#define PARTYPE 15
@@ -384,8 +377,11 @@ typedef struct DupliObject {
#define OB_BOUNDBOX 1
#define OB_WIRE 2
#define OB_SOLID 3
-#define OB_SHADED 4
+#define OB_MATERIAL 4
#define OB_TEXTURE 5
+#define OB_RENDER 6
+
+#define OB_PAINT 100 /* temporary used in draw code */
/* dtx: flags, char! */
#define OB_AXIS 2
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index cadd070c537..5d437fefebc 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -400,7 +400,9 @@ typedef struct SpaceNode {
struct bNodeTree *nodetree, *edittree;
int treetype; /* treetype: as same nodetree->type */
short texfrom; /* texfrom object, world or brush */
+ short shaderfrom; /* shader from object or world */
short recalc; /* currently on 0/1, for auto compo */
+ short pad[3];
ListBase linkdrag; /* temporary data for modal linking operator */
struct bGPdata *gpd; /* grease-pencil data */
@@ -418,6 +420,10 @@ typedef struct SpaceNode {
#define SNODE_TEX_WORLD 1
#define SNODE_TEX_BRUSH 2
+/* snode->shaderfrom */
+#define SNODE_SHADER_OBJECT 0
+#define SNODE_SHADER_WORLD 1
+
typedef struct SpaceLogic {
SpaceLink *next, *prev;
ListBase regionbase; /* storage of regions for inactive spaces */
@@ -432,68 +438,6 @@ typedef struct SpaceLogic {
struct bGPdata *gpd; /* grease-pencil data */
} SpaceLogic;
-/* note, this entire struct isnt used anymore!,
- * may remove some day - campbell */
-typedef struct SpaceImaSel {
- SpaceLink *next, *prev;
- ListBase regionbase; /* storage of regions for inactive spaces */
- int spacetype;
- float blockscale;
-
- short blockhandler[8];
-
- View2D v2d; /* deprecated, copied to region */
-
- struct FileList *files;
-
- /* specific stuff for drawing */
- char title[24];
- char dir[240];
- char file[80];
-
- short type, menu, flag, sort;
-
- void *curfont;
- int active_file;
-
- int numtilesx;
- int numtilesy;
-
- int selstate;
-
- struct rcti viewrect;
- struct rcti bookmarkrect;
-
- float scrollpos; /* current position of scrollhandle */
- float scrollheight; /* height of the scrollhandle */
- float scrollarea; /* scroll region, scrollpos is from 0 to scrollarea */
-
- float aspect;
- unsigned short retval; /* event */
-
- short ipotype;
-
- short filter;
- short active_bookmark;
- short pad, pad1;
-
- /* view settings */
- short prv_w;
- short prv_h;
-
- /* one day we'll add unions to dna */
- void (*returnfunc)(char *);
- void (*returnfunc_event)(unsigned short);
- void (*returnfunc_args)(char *, void *, void *);
-
- void *arg1, *arg2;
- short *menup; /* pointer to menu result or ID browsing */
- char *pupmenu; /* optional menu in header */
-
- struct ImBuf *img;
-} SpaceImaSel;
-
-
typedef struct ConsoleLine {
struct ConsoleLine *next, *prev;
@@ -545,22 +489,6 @@ typedef struct SpaceUserPref {
} SpaceUserPref;
-typedef struct SpaceSound {
- struct SpaceLink *next, *prev;
- ListBase regionbase; /* storage of regions for inactive spaces */
- int spacetype;
- float blockscale;
- struct ScrArea *area;
-
- View2D v2d;
-
- struct bSound *sound;
- short mode, sndnr;
- short xof, yof;
- short flag, lock;
- int pad2;
-} SpaceSound;
-
/* view3d Now in DNA_view3d_types.h */
@@ -948,11 +876,11 @@ enum {
SPACE_INFO,
SPACE_SEQ,
SPACE_TEXT,
- SPACE_IMASEL,
- SPACE_SOUND,
+ SPACE_IMASEL, /* deprecated */
+ SPACE_SOUND, /* Deprecated */
SPACE_ACTION,
SPACE_NLA,
- SPACE_SCRIPT,
+ SPACE_SCRIPT, /* Deprecated */
SPACE_TIME,
SPACE_NODE,
SPACE_LOGIC,
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index a3934618582..f54c83d6612 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -267,13 +267,11 @@ typedef struct bTheme {
ThemeSpace tv3d;
ThemeSpace tfile;
ThemeSpace tipo;
- ThemeSpace tinfo;
- ThemeSpace tsnd;
+ ThemeSpace tinfo;
ThemeSpace tact;
ThemeSpace tnla;
ThemeSpace tseq;
ThemeSpace tima;
- ThemeSpace timasel;
ThemeSpace text;
ThemeSpace toops;
ThemeSpace ttime;
@@ -442,10 +440,10 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_TOOLTIPS_PYTHON (1 << 26)
/* helper macro for checking frame clamping */
-#define FRAMENUMBER_MIN_CLAMP(cfra) \
- { \
- if ((U.flag & USER_NONEGFRAMES) && (cfra < 0)) \
- cfra = 0; \
+#define FRAMENUMBER_MIN_CLAMP(cfra) \
+ { \
+ if ((U.flag & USER_NONEGFRAMES) && (cfra < 0)) \
+ cfra = 0; \
}
/* viewzom */
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index d94d4318725..aaf4186945e 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -39,6 +39,7 @@ struct SpaceLink;
struct Base;
struct BoundBox;
struct RenderInfo;
+struct RenderEngine;
struct bGPdata;
struct SmoothViewStore;
struct wmTimer;
@@ -115,6 +116,7 @@ typedef struct RegionView3D {
struct RegionView3D *localvd; /* allocated backup of its self while in localview */
struct RenderInfo *ri;
+ struct RenderEngine *render_engine;
struct ViewDepths *depths;
/* animated smooth view */
@@ -164,8 +166,8 @@ typedef struct View3D {
int layact;
/**
- * The drawing mode for the 3d display. Set to OB_WIRE, OB_SOLID,
- * OB_SHADED or OB_TEXTURE */
+ * The drawing mode for the 3d display. Set to OB_BOUNDBOX, OB_WIRE, OB_SOLID,
+ * OB_TEXTURE, OB_MATERIAL or OB_RENDER */
short drawtype;
short ob_centre_cursor; /* optional bool for 3d cursor to define center */
short scenelock, around;
diff --git a/source/blender/makesdna/DNA_world_types.h b/source/blender/makesdna/DNA_world_types.h
index 500851e23b8..0c455022db4 100644
--- a/source/blender/makesdna/DNA_world_types.h
+++ b/source/blender/makesdna/DNA_world_types.h
@@ -34,6 +34,7 @@
#include "DNA_ID.h"
struct AnimData;
+struct bNodeTree;
struct Ipo;
struct MTex;
@@ -95,7 +96,7 @@ typedef struct World {
float misi, miststa, mistdist, misthi;
- float starr, starg, starb, stark;
+ float starr, starg, starb, stark; /* Deprecated */
float starsize, starmindist;
float stardist, starcolnoise;
@@ -120,11 +121,14 @@ typedef struct World {
struct Ipo *ipo; // XXX depreceated... old animation system
struct MTex *mtex[18]; /* MAX_MTEX */
- short pr_texture, pad[3];
+ short pr_texture, use_nodes, pad[2];
/* previews */
struct PreviewImage *preview;
+ /* nodes */
+ struct bNodeTree *nodetree;
+
} World;
/* **************** WORLD ********************* */
@@ -182,7 +186,7 @@ typedef struct World {
#define WOMAP_HORIZ 2
#define WOMAP_ZENUP 4
#define WOMAP_ZENDOWN 8
-#define WOMAP_MIST 16
+#define WOMAP_MIST 16 /* Deprecated */
/* flag */
#define WO_DS_EXPAND (1<<0)
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 188c5893028..8fff1928bbd 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -70,6 +70,7 @@ extern StructRNA RNA_ArmatureSensor;
extern StructRNA RNA_ArrayModifier;
extern StructRNA RNA_BackgroundImage;
extern StructRNA RNA_BevelModifier;
+extern StructRNA RNA_SplinePoint;
extern StructRNA RNA_BezierSplinePoint;
extern StructRNA RNA_BlendData;
extern StructRNA RNA_BlendTexture;
@@ -877,37 +878,49 @@ int RNA_collection_length(PointerRNA *ptr, const char *name);
void RNA_collection_add(PointerRNA *ptr, const char *name, PointerRNA *r_value);
void RNA_collection_clear(PointerRNA *ptr, const char *name);
-#define RNA_BEGIN(sptr, itemptr, propname) \
- { \
- CollectionPropertyIterator rna_macro_iter; \
- for(RNA_collection_begin(sptr, propname, &rna_macro_iter); rna_macro_iter.valid; RNA_property_collection_next(&rna_macro_iter)) { \
+#define RNA_BEGIN(sptr, itemptr, propname) \
+ { \
+ CollectionPropertyIterator rna_macro_iter; \
+ for(RNA_collection_begin(sptr, propname, &rna_macro_iter); \
+ rna_macro_iter.valid; \
+ RNA_property_collection_next(&rna_macro_iter)) \
+ { \
PointerRNA itemptr= rna_macro_iter.ptr;
-#define RNA_END \
- } \
- RNA_property_collection_end(&rna_macro_iter); \
+#define RNA_END \
+ } \
+ RNA_property_collection_end(&rna_macro_iter); \
}
-#define RNA_PROP_BEGIN(sptr, itemptr, prop) \
- { \
- CollectionPropertyIterator rna_macro_iter; \
- for(RNA_property_collection_begin(sptr, prop, &rna_macro_iter); rna_macro_iter.valid; RNA_property_collection_next(&rna_macro_iter)) { \
+#define RNA_PROP_BEGIN(sptr, itemptr, prop) \
+ { \
+ CollectionPropertyIterator rna_macro_iter; \
+ for(RNA_property_collection_begin(sptr, prop, &rna_macro_iter); \
+ rna_macro_iter.valid; \
+ RNA_property_collection_next(&rna_macro_iter)) \
+ { \
PointerRNA itemptr= rna_macro_iter.ptr;
-#define RNA_PROP_END \
- } \
- RNA_property_collection_end(&rna_macro_iter); \
+#define RNA_PROP_END \
+ } \
+ RNA_property_collection_end(&rna_macro_iter); \
}
-#define RNA_STRUCT_BEGIN(sptr, prop) \
- { \
- CollectionPropertyIterator rna_macro_iter; \
- for(RNA_property_collection_begin(sptr, RNA_struct_iterator_property(sptr->type), &rna_macro_iter); rna_macro_iter.valid; RNA_property_collection_next(&rna_macro_iter)) { \
+#define RNA_STRUCT_BEGIN(sptr, prop) \
+ { \
+ CollectionPropertyIterator rna_macro_iter; \
+ for(RNA_property_collection_begin( \
+ sptr, \
+ RNA_struct_iterator_property(sptr->type), \
+ &rna_macro_iter); \
+ rna_macro_iter.valid; \
+ RNA_property_collection_next(&rna_macro_iter)) \
+ { \
PropertyRNA *prop= rna_macro_iter.ptr.data;
-#define RNA_STRUCT_END \
- } \
- RNA_property_collection_end(&rna_macro_iter); \
+#define RNA_STRUCT_END \
+ } \
+ RNA_property_collection_end(&rna_macro_iter); \
}
/* check if the idproperty exists, for operators */
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 5007aefeaef..d4a9cf1f830 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -70,25 +70,28 @@ static int replace_if_different(char *tmpfile, const char *dep_files[])
{
// return 0; // use for testing had edited rna
-#define REN_IF_DIFF \
- { \
- FILE *file_test= fopen(orgfile, "rb"); \
- if(file_test) { \
- fclose(file_test); \
- if(fp_org) fclose(fp_org); \
- if(fp_new) fclose(fp_new); \
- if(remove(orgfile) != 0) { \
- fprintf(stderr, "%s:%d, Remove Error (%s): \"%s\"\n", __FILE__, __LINE__, strerror(errno), orgfile); \
- return -1; \
- } \
- } \
- } \
- if(rename(tmpfile, orgfile) != 0) { \
- fprintf(stderr, "%s:%d, Rename Error (%s): \"%s\" -> \"%s\"\n", __FILE__, __LINE__, strerror(errno), tmpfile, orgfile); \
- return -1; \
- } \
- remove(tmpfile); \
- return 1; \
+#define REN_IF_DIFF \
+ { \
+ FILE *file_test= fopen(orgfile, "rb"); \
+ if(file_test) { \
+ fclose(file_test); \
+ if(fp_org) fclose(fp_org); \
+ if(fp_new) fclose(fp_new); \
+ if(remove(orgfile) != 0) { \
+ fprintf(stderr, "%s:%d, Remove Error (%s): \"%s\"\n", \
+ __FILE__, __LINE__, strerror(errno), orgfile); \
+ return -1; \
+ } \
+ } \
+ } \
+ if(rename(tmpfile, orgfile) != 0) { \
+ fprintf(stderr, "%s:%d, Rename Error (%s): \"%s\" -> \"%s\"\n", \
+ __FILE__, __LINE__, strerror(errno), tmpfile, orgfile); \
+ return -1; \
+ } \
+ remove(tmpfile); \
+ return 1; \
+
/* end REN_IF_DIFF */
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index 194c3e8d18e..e4692d32338 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -486,6 +486,16 @@ static void rna_def_ID(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
RNA_def_property_ui_text(prop, "Tag", "Tools can use this to tag data (initial state is undefined)");
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", LIB_ID_RECALC);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Is Updated", "Datablock is tagged for recalculation");
+
+ prop= RNA_def_property(srna, "is_updated_data", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", LIB_ID_RECALC_DATA);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Is Updated Data", "Datablock data is tagged for recalculation");
+
prop= RNA_def_property(srna, "library", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "lib");
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index a33efda38d0..793d0112af7 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -2930,28 +2930,28 @@ int RNA_property_collection_raw_array(PointerRNA *ptr, PropertyRNA *prop, Proper
return 1;
}
-#define RAW_GET(dtype, var, raw, a) \
-{ \
- switch(raw.type) { \
- case PROP_RAW_CHAR: var = (dtype)((char*)raw.array)[a]; break; \
- case PROP_RAW_SHORT: var = (dtype)((short*)raw.array)[a]; break; \
- case PROP_RAW_INT: var = (dtype)((int*)raw.array)[a]; break; \
- case PROP_RAW_FLOAT: var = (dtype)((float*)raw.array)[a]; break; \
- case PROP_RAW_DOUBLE: var = (dtype)((double*)raw.array)[a]; break; \
- default: var = (dtype)0; \
- } \
-}
-
-#define RAW_SET(dtype, raw, a, var) \
-{ \
- switch(raw.type) { \
- case PROP_RAW_CHAR: ((char*)raw.array)[a] = (char)var; break; \
- case PROP_RAW_SHORT: ((short*)raw.array)[a] = (short)var; break; \
- case PROP_RAW_INT: ((int*)raw.array)[a] = (int)var; break; \
- case PROP_RAW_FLOAT: ((float*)raw.array)[a] = (float)var; break; \
- case PROP_RAW_DOUBLE: ((double*)raw.array)[a] = (double)var; break; \
- default: break; \
- } \
+#define RAW_GET(dtype, var, raw, a) \
+{ \
+ switch(raw.type) { \
+ case PROP_RAW_CHAR: var = (dtype)((char*)raw.array)[a]; break; \
+ case PROP_RAW_SHORT: var = (dtype)((short*)raw.array)[a]; break; \
+ case PROP_RAW_INT: var = (dtype)((int*)raw.array)[a]; break; \
+ case PROP_RAW_FLOAT: var = (dtype)((float*)raw.array)[a]; break; \
+ case PROP_RAW_DOUBLE: var = (dtype)((double*)raw.array)[a]; break; \
+ default: var = (dtype)0; \
+ } \
+}
+
+#define RAW_SET(dtype, raw, a, var) \
+{ \
+ switch(raw.type) { \
+ case PROP_RAW_CHAR: ((char*)raw.array)[a] = (char)var; break; \
+ case PROP_RAW_SHORT: ((short*)raw.array)[a] = (short)var; break; \
+ case PROP_RAW_INT: ((int*)raw.array)[a] = (int)var; break; \
+ case PROP_RAW_FLOAT: ((float*)raw.array)[a] = (float)var; break; \
+ case PROP_RAW_DOUBLE: ((double*)raw.array)[a] = (double)var; break; \
+ default: break; \
+ } \
}
int RNA_raw_type_sizeof(RawPropertyType type)
diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c
index 596e1a7f357..db71dee26ce 100644
--- a/source/blender/makesrna/intern/rna_actuator.c
+++ b/source/blender/makesrna/intern/rna_actuator.c
@@ -109,6 +109,18 @@ static StructRNA* rna_Actuator_refine(struct PointerRNA *ptr)
}
}
+void rna_Actuator_name_set(PointerRNA *ptr, const char *value)
+{
+ bActuator *act= (bActuator *)ptr->data;
+
+ BLI_strncpy_utf8(act->name, value, sizeof(act->name));
+
+ if (ptr->id.data) {
+ Object *ob= (Object *)ptr->id.data;
+ BLI_uniquename(&ob->actuators, act, "Actuator", '.', offsetof(bActuator, name), sizeof(act->name));
+ }
+}
+
static void rna_Actuator_type_set(struct PointerRNA *ptr, int value)
{
bActuator *act= (bActuator *)ptr->data;
@@ -525,6 +537,7 @@ void rna_def_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Name", "");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Actuator_name_set");
RNA_def_struct_name_property(srna, prop);
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_camera.c b/source/blender/makesrna/intern/rna_camera.c
index 9e89c4aaab0..1e7a969caaa 100644
--- a/source/blender/makesrna/intern/rna_camera.c
+++ b/source/blender/makesrna/intern/rna_camera.c
@@ -40,19 +40,65 @@
#ifdef RNA_RUNTIME
#include "BKE_object.h"
+#include "BKE_depsgraph.h"
/* only for rad/deg conversion! can remove later */
+static float get_camera_sensor(Camera *cam)
+{
+ if(cam->sensor_fit==CAMERA_SENSOR_FIT_AUTO) {
+ return cam->sensor_x;
+ }
+ else if(cam->sensor_fit==CAMERA_SENSOR_FIT_HOR) {
+ return cam->sensor_x;
+ }
+ else {
+ return cam->sensor_y;
+ }
+}
+
static float rna_Camera_angle_get(PointerRNA *ptr)
{
Camera *cam= ptr->id.data;
-
- return lens_to_angle(cam->lens);
+ float sensor= get_camera_sensor(cam);
+ return focallength_to_fov(cam->lens, sensor);
}
static void rna_Camera_angle_set(PointerRNA *ptr, float value)
{
Camera *cam= ptr->id.data;
- cam->lens= angle_to_lens(value);
+ float sensor= get_camera_sensor(cam);
+ cam->lens= fov_to_focallength(value, sensor);
+}
+
+static float rna_Camera_angle_x_get(PointerRNA *ptr)
+{
+ Camera *cam= ptr->id.data;
+ return focallength_to_fov(cam->lens, cam->sensor_x);
+}
+
+static void rna_Camera_angle_x_set(PointerRNA *ptr, float value)
+{
+ Camera *cam= ptr->id.data;
+ cam->lens= fov_to_focallength(value, cam->sensor_x);
+}
+
+static float rna_Camera_angle_y_get(PointerRNA *ptr)
+{
+ Camera *cam= ptr->id.data;
+ return focallength_to_fov(cam->lens, cam->sensor_y);
+}
+
+static void rna_Camera_angle_y_set(PointerRNA *ptr, float value)
+{
+ Camera *cam= ptr->id.data;
+ cam->lens= fov_to_focallength(value, cam->sensor_y);
+}
+
+static void rna_Camera_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
+{
+ Camera *camera= (Camera*)ptr->id.data;
+
+ DAG_id_tag_update(&camera->id, 0);
}
#else
@@ -79,6 +125,11 @@ void RNA_def_camera(BlenderRNA *brna)
{0, "MILLIMETERS", 0, "Millimeters", ""},
{CAM_ANGLETOGGLE, "DEGREES", 0, "Degrees", ""},
{0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem sensor_fit_items[] = {
+ {CAMERA_SENSOR_FIT_AUTO, "AUTO", 0, "Auto", "Calculate field of view using sensor size, with direction depending on image resolution"},
+ {CAMERA_SENSOR_FIT_HOR, "HORIZONTAL", 0, "Horizontal", "Calculate field of view using sensor width"},
+ {CAMERA_SENSOR_FIT_VERT, "VERTICAL", 0, "Vertical", "Calculate field of view using sensor height"},
+ {0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "Camera", "ID");
RNA_def_struct_ui_text(srna, "Camera", "Camera datablock for storing camera settings");
@@ -88,7 +139,7 @@ void RNA_def_camera(BlenderRNA *brna)
prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, prop_type_items);
RNA_def_property_ui_text(prop, "Type", "Camera types");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
prop= RNA_def_property(srna, "show_guide", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "dtx");
@@ -96,7 +147,13 @@ void RNA_def_camera(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_ENUM_FLAG);
RNA_def_property_ui_text(prop, "Composition Guides", "Draw overlay");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
-
+
+ prop= RNA_def_property(srna, "sensor_fit", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "sensor_fit");
+ RNA_def_property_enum_items(prop, sensor_fit_items);
+ RNA_def_property_ui_text(prop, "Sensor Fit", "Mode of calculating field of view from sensor dimensions and focal length");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
+
/* Number values */
prop= RNA_def_property(srna, "passepartout_alpha", PROP_FLOAT, PROP_FACTOR);
@@ -104,6 +161,27 @@ void RNA_def_camera(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Passepartout Alpha", "Opacity (alpha) of the darkened overlay in Camera view");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+ prop= RNA_def_property(srna, "angle_x", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_range(prop, M_PI * (0.367/180.0), M_PI * (172.847/180.0));
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "Horizontal FOV", "Camera lens horizontal field of view in degrees");
+ RNA_def_property_float_funcs(prop, "rna_Camera_angle_x_get", "rna_Camera_angle_x_set", NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
+
+ prop= RNA_def_property(srna, "angle_y", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_range(prop, M_PI * (0.367/180.0), M_PI * (172.847/180.0));
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "Vertical FOV", "Camera lens vertical field of view in degrees");
+ RNA_def_property_float_funcs(prop, "rna_Camera_angle_y_get", "rna_Camera_angle_y_set", NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
+
+ prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_range(prop, M_PI * (0.367/180.0), M_PI * (172.847/180.0));
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "Field of View", "Camera lens field of view in degrees");
+ RNA_def_property_float_funcs(prop, "rna_Camera_angle_get", "rna_Camera_angle_set", NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
+
prop= RNA_def_property(srna, "clip_start", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "clipsta");
RNA_def_property_range(prop, 0.001f, FLT_MAX);
@@ -120,20 +198,27 @@ void RNA_def_camera(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "lens");
RNA_def_property_range(prop, 1.0f, 5000.0f);
RNA_def_property_ui_text(prop, "Focal Length", "Perspective Camera lens value in millimeters");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
-
- prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
- RNA_def_property_range(prop, M_PI * (0.367/180.0), M_PI * (172.847/180.0));
- RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
- RNA_def_property_ui_text(prop, "Angle", "Perspective Camera lens field of view in degrees");
- RNA_def_property_float_funcs(prop, "rna_Camera_angle_get", "rna_Camera_angle_set", NULL); /* only for deg/rad conversion */
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
+
+ prop= RNA_def_property(srna, "sensor_width", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "sensor_x");
+ RNA_def_property_range(prop, 1.0f, FLT_MAX);
+ RNA_def_property_ui_range(prop, 1.0f, 100.f, 1, 2);
+ RNA_def_property_ui_text(prop, "Sensor Width", "Horizontal size of the image sensor area in millimeters");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
+
+ prop= RNA_def_property(srna, "sensor_height", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "sensor_y");
+ RNA_def_property_range(prop, 1.0f, FLT_MAX);
+ RNA_def_property_ui_range(prop, 1.0f, 100.f, 1, 2);
+ RNA_def_property_ui_text(prop, "Sensor Height", "Vertical size of the image sensor area in millimeters");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
prop= RNA_def_property(srna, "ortho_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ortho_scale");
RNA_def_property_range(prop, 0.01f, 4000.0f);
RNA_def_property_ui_text(prop, "Orthographic Scale", "Orthographic Camera scale (similar to zoom)");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
prop= RNA_def_property(srna, "draw_size", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "drawsize");
@@ -147,14 +232,14 @@ void RNA_def_camera(BlenderRNA *brna)
RNA_def_property_range(prop, -10.0f, 10.0f);
RNA_def_property_ui_range(prop, -2.0, 2.0, 1, 3);
RNA_def_property_ui_text(prop, "Shift X", "Perspective Camera horizontal shift");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
prop= RNA_def_property(srna, "shift_y", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "shifty");
RNA_def_property_range(prop, -10.0f, 10.0f);
RNA_def_property_ui_range(prop, -2.0, 2.0, 1, 3);
RNA_def_property_ui_text(prop, "Shift Y", "Perspective Camera vertical shift");
- RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Camera_update");
prop= RNA_def_property(srna, "dof_distance", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "YF_dofdist");
@@ -188,6 +273,11 @@ void RNA_def_camera(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Name", "Show the active Camera's name in Camera view");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+ prop= RNA_def_property(srna, "show_sensor", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", CAM_SHOWSENSOR);
+ RNA_def_property_ui_text(prop, "Show Sensor Size", "Show sensor size (film gate) in Camera view");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+
prop= RNA_def_property(srna, "lens_unit", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
RNA_def_property_enum_items(prop, prop_lens_unit_items);
diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c
index 59d23b7a878..60144e0cf7f 100644
--- a/source/blender/makesrna/intern/rna_color.c
+++ b/source/blender/makesrna/intern/rna_color.c
@@ -167,19 +167,20 @@ static char *rna_ColorRampElement_path(PointerRNA *ptr)
/* helper macro for use here to try and get the path
* - this calls the standard code for getting a path to a texture...
*/
-#define COLRAMP_GETPATH \
-{ \
-prop= RNA_struct_find_property(&ramp_ptr, "elements"); \
-if (prop) { \
-index= RNA_property_collection_lookup_index(&ramp_ptr, prop, ptr); \
-if (index >= 0) { \
-char *texture_path= rna_ColorRamp_path(&ramp_ptr); \
-path= BLI_sprintfN("%s.elements[%d]", texture_path, index); \
-MEM_freeN(texture_path); \
-} \
-} \
+
+#define COLRAMP_GETPATH \
+{ \
+ prop= RNA_struct_find_property(&ramp_ptr, "elements"); \
+ if (prop) { \
+ index= RNA_property_collection_lookup_index(&ramp_ptr, prop, ptr); \
+ if (index >= 0) { \
+ char *texture_path= rna_ColorRamp_path(&ramp_ptr); \
+ path= BLI_sprintfN("%s.elements[%d]", texture_path, index); \
+ MEM_freeN(texture_path); \
+ } \
+ } \
}
-
+
/* determine the path from the ID-block to the ramp */
// FIXME: this is a very slow way to do it, but it will have to suffice...
if (ptr->id.data) {
diff --git a/source/blender/makesrna/intern/rna_controller.c b/source/blender/makesrna/intern/rna_controller.c
index fe899f99ed2..89239c10ffd 100644
--- a/source/blender/makesrna/intern/rna_controller.c
+++ b/source/blender/makesrna/intern/rna_controller.c
@@ -75,6 +75,18 @@ static struct StructRNA* rna_Controller_refine(struct PointerRNA *ptr)
}
}
+void rna_Constroller_name_set(PointerRNA *ptr, const char *value)
+{
+ bController *cont= (bController *)ptr->data;
+
+ BLI_strncpy_utf8(cont->name, value, sizeof(cont->name));
+
+ if (ptr->id.data) {
+ Object *ob= (Object *)ptr->id.data;
+ BLI_uniquename(&ob->controllers, cont, "Controller", '.', offsetof(bController, name), sizeof(cont->name));
+ }
+}
+
static void rna_Controller_type_set(struct PointerRNA *ptr, int value)
{
bController *cont= (bController *)ptr->data;
@@ -177,6 +189,7 @@ void RNA_def_controller(BlenderRNA *brna)
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Name", "");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Constroller_name_set");
RNA_def_struct_name_property(srna, prop);
RNA_def_property_update(prop, NC_LOGIC, NULL);
diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c
index cbac594a80f..93fdc2b2136 100644
--- a/source/blender/makesrna/intern/rna_curve.c
+++ b/source/blender/makesrna/intern/rna_curve.c
@@ -268,26 +268,10 @@ static void rna_Curve_active_textbox_index_range(PointerRNA *ptr, int *min, int
static void rna_Curve_dimension_set(PointerRNA *ptr, int value)
{
Curve *cu= (Curve*)ptr->id.data;
- ListBase *nurbs= BKE_curve_nurbs(cu);
- Nurb *nu= nurbs->first;
+ if(value==CU_3D) cu->flag |= CU_3D;
+ else cu->flag &= ~CU_3D;
- if(value==CU_3D) {
- cu->flag |= CU_3D;
- for( ; nu; nu= nu->next) {
- nu->flag &= ~CU_2D;
- }
- }
- else {
- cu->flag &= ~CU_3D;
- for( ; nu; nu= nu->next) {
- nu->flag |= CU_2D;
- test2DNurb(nu);
-
- /* since the handles are moved they need to be auto-located again */
- if(nu->type == CU_BEZIER)
- calchandlesNurb(nu);
- }
- }
+ update_curve_dimension(cu);
}
static EnumPropertyItem *rna_Curve_fill_mode_itemf(bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *UNUSED(free))
diff --git a/source/blender/makesrna/intern/rna_lamp.c b/source/blender/makesrna/intern/rna_lamp.c
index 572559546c8..629711fcf96 100644
--- a/source/blender/makesrna/intern/rna_lamp.c
+++ b/source/blender/makesrna/intern/rna_lamp.c
@@ -46,6 +46,7 @@
#include "BKE_main.h"
#include "BKE_texture.h"
+#include "ED_node.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -145,6 +146,15 @@ static void rna_Lamp_spot_size_set(PointerRNA *ptr, float value)
la->spotsize= RAD2DEGF(value);
}
+static void rna_Lamp_use_nodes_update(Main *blain, Scene *scene, PointerRNA *ptr)
+{
+ Lamp *la= (Lamp*)ptr->data;
+
+ if(la->use_nodes && la->nodetree==NULL)
+ ED_node_shader_default(scene, &la->id);
+
+ rna_Lamp_update(blain, scene, ptr);
+}
#else
@@ -366,6 +376,17 @@ static void rna_def_lamp(BlenderRNA *brna)
RNA_def_property_boolean_negative_sdna(prop, NULL, "mode", LA_NO_DIFF);
RNA_def_property_ui_text(prop, "Diffuse", "Lamp does diffuse shading");
RNA_def_property_update(prop, 0, "rna_Lamp_update");
+
+ /* nodes */
+ prop= RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
+ RNA_def_property_ui_text(prop, "Node Tree", "Node tree for node based lamps");
+
+ prop= RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "Use Nodes", "Use shader nodes to render the lamp");
+ RNA_def_property_update(prop, 0, "rna_Lamp_use_nodes_update");
/* common */
rna_def_animdata_common(srna);
diff --git a/source/blender/makesrna/intern/rna_main.c b/source/blender/makesrna/intern/rna_main.c
index 92c84da165b..076bdfe1964 100644
--- a/source/blender/makesrna/intern/rna_main.c
+++ b/source/blender/makesrna/intern/rna_main.c
@@ -324,7 +324,7 @@ void RNA_def_main(BlenderRNA *brna)
prop= RNA_def_property(srna, "is_dirty", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_funcs(prop, "rna_Main_is_dirty_get", NULL);
- RNA_def_property_ui_text(prop, "File is Saved", "Have recent edits been saved to disk");
+ RNA_def_property_ui_text(prop, "File Has Unsaved Changes", "Have recent edits been saved to disk");
prop= RNA_def_property(srna, "is_saved", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index 3f7cdf8d204..1b80e33b40c 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -62,6 +62,7 @@
#include "BKE_particle.h"
#include "BKE_font.h"
#include "BKE_node.h"
+#include "BKE_depsgraph.h"
#include "BKE_speaker.h"
#include "DNA_armature_types.h"
@@ -548,6 +549,33 @@ void rna_Main_actions_tag(Main *bmain, int value) { tag_main_lb(&bmain->action,
void rna_Main_particles_tag(Main *bmain, int value) { tag_main_lb(&bmain->particle, value); }
void rna_Main_gpencil_tag(Main *bmain, int value) { tag_main_lb(&bmain->gpencil, value); }
+static int rna_Main_cameras_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_CA); }
+static int rna_Main_scenes_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_SCE); }
+static int rna_Main_objects_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_OB); }
+static int rna_Main_materials_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_MA); }
+static int rna_Main_node_groups_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_NT); }
+static int rna_Main_meshes_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_ME); }
+static int rna_Main_lamps_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_LA); }
+static int rna_Main_libraries_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_LI); }
+static int rna_Main_screens_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_SCR); }
+static int rna_Main_window_managers_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_WM); }
+static int rna_Main_images_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_IM); }
+static int rna_Main_lattices_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_LT); }
+static int rna_Main_curves_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_CU); }
+static int rna_Main_metaballs_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_MB); }
+static int rna_Main_fonts_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_VF); }
+static int rna_Main_textures_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_TE); }
+static int rna_Main_brushes_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_BR); }
+static int rna_Main_worlds_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_WO); }
+static int rna_Main_groups_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_GR); }
+static int rna_Main_texts_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_TXT); }
+static int rna_Main_speakers_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_SPK); }
+static int rna_Main_sounds_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_SO); }
+static int rna_Main_armatures_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_AR); }
+static int rna_Main_actions_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_AC); }
+static int rna_Main_particles_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_PA); }
+static int rna_Main_gpencil_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_GD); }
+
#else
void RNA_api_main(StructRNA *srna)
@@ -574,6 +602,7 @@ void RNA_def_main_cameras(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataCameras");
srna= RNA_def_struct(brna, "BlendDataCameras", NULL);
@@ -597,6 +626,10 @@ void RNA_def_main_cameras(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_cameras_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_cameras_is_updated_get", NULL);
}
void RNA_def_main_scenes(BlenderRNA *brna, PropertyRNA *cprop)
@@ -604,6 +637,7 @@ void RNA_def_main_scenes(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataScenes");
srna= RNA_def_struct(brna, "BlendDataScenes", NULL);
@@ -623,6 +657,10 @@ void RNA_def_main_scenes(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_ui_description(func, "Remove a scene from the current blendfile");
parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene to remove");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_scenes_is_updated_get", NULL);
}
void RNA_def_main_objects(BlenderRNA *brna, PropertyRNA *cprop)
@@ -630,6 +668,7 @@ void RNA_def_main_objects(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataObjects");
srna= RNA_def_struct(brna, "BlendDataObjects", NULL);
@@ -657,6 +696,10 @@ void RNA_def_main_objects(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_objects_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_objects_is_updated_get", NULL);
}
void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
@@ -664,6 +707,7 @@ void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataMaterials");
srna= RNA_def_struct(brna, "BlendDataMaterials", NULL);
@@ -687,12 +731,17 @@ void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_materials_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_materials_is_updated_get", NULL);
}
void RNA_def_main_node_groups(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
static EnumPropertyItem node_nodetree_items[] = {
{0, "SHADER", 0, "Shader", ""},
@@ -724,12 +773,17 @@ void RNA_def_main_node_groups(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_node_groups_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_node_groups_is_updated_get", NULL);
}
void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataMeshes");
srna= RNA_def_struct(brna, "BlendDataMeshes", NULL);
@@ -753,12 +807,17 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_meshes_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_meshes_is_updated_get", NULL);
}
void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataLamps");
srna= RNA_def_struct(brna, "BlendDataLamps", NULL);
@@ -784,6 +843,10 @@ void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_lamps_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_lamps_is_updated_get", NULL);
}
void RNA_def_main_libraries(BlenderRNA *brna, PropertyRNA *cprop)
@@ -791,6 +854,7 @@ void RNA_def_main_libraries(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataLibraries");
srna= RNA_def_struct(brna, "BlendDataLibraries", NULL);
@@ -800,6 +864,10 @@ void RNA_def_main_libraries(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_libraries_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_libraries_is_updated_get", NULL);
}
void RNA_def_main_screens(BlenderRNA *brna, PropertyRNA *cprop)
@@ -807,6 +875,7 @@ void RNA_def_main_screens(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataScreens");
srna= RNA_def_struct(brna, "BlendDataScreens", NULL);
@@ -816,6 +885,10 @@ void RNA_def_main_screens(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_screens_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_screens_is_updated_get", NULL);
}
void RNA_def_main_window_managers(BlenderRNA *brna, PropertyRNA *cprop)
@@ -823,6 +896,7 @@ void RNA_def_main_window_managers(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataWindowManagers");
srna= RNA_def_struct(brna, "BlendDataWindowManagers", NULL);
@@ -832,12 +906,17 @@ void RNA_def_main_window_managers(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_window_managers_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_window_managers_is_updated_get", NULL);
}
void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataImages");
srna= RNA_def_struct(brna, "BlendDataImages", NULL);
@@ -876,6 +955,10 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_images_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_images_is_updated_get", NULL);
}
void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop)
@@ -883,6 +966,7 @@ void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataLattices");
srna= RNA_def_struct(brna, "BlendDataLattices", NULL);
@@ -906,12 +990,17 @@ void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_lattices_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_lattices_is_updated_get", NULL);
}
void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataCurves");
srna= RNA_def_struct(brna, "BlendDataCurves", NULL);
@@ -937,12 +1026,17 @@ void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_curves_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_curves_is_updated_get", NULL);
}
void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataMetaBalls");
srna= RNA_def_struct(brna, "BlendDataMetaBalls", NULL);
@@ -966,12 +1060,17 @@ void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_metaballs_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_metaballs_is_updated_get", NULL);
}
void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataFonts");
srna= RNA_def_struct(brna, "BlendDataFonts", NULL);
@@ -996,12 +1095,17 @@ void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_fonts_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_fonts_is_updated_get", NULL);
}
void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataTextures");
srna= RNA_def_struct(brna, "BlendDataTextures", NULL);
@@ -1027,12 +1131,17 @@ void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_textures_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_textures_is_updated_get", NULL);
}
void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataBrushes");
srna= RNA_def_struct(brna, "BlendDataBrushes", NULL);
@@ -1056,6 +1165,10 @@ void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_brushes_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_brushes_is_updated_get", NULL);
}
void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop)
@@ -1063,6 +1176,7 @@ void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataWorlds");
srna= RNA_def_struct(brna, "BlendDataWorlds", NULL);
@@ -1086,6 +1200,10 @@ void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_worlds_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_worlds_is_updated_get", NULL);
}
void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
@@ -1093,6 +1211,7 @@ void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataGroups");
srna= RNA_def_struct(brna, "BlendDataGroups", NULL);
@@ -1115,6 +1234,10 @@ void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_groups_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_groups_is_updated_get", NULL);
}
void RNA_def_main_speakers(BlenderRNA *brna, PropertyRNA *cprop)
@@ -1122,6 +1245,7 @@ void RNA_def_main_speakers(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataSpeakers");
srna= RNA_def_struct(brna, "BlendDataSpeakers", NULL);
@@ -1145,6 +1269,10 @@ void RNA_def_main_speakers(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_speakers_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_speakers_is_updated_get", NULL);
}
void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
@@ -1152,6 +1280,7 @@ void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataTexts");
srna= RNA_def_struct(brna, "BlendDataTexts", NULL);
@@ -1184,6 +1313,10 @@ void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_texts_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_texts_is_updated_get", NULL);
}
void RNA_def_main_sounds(BlenderRNA *brna, PropertyRNA *cprop)
@@ -1191,6 +1324,7 @@ void RNA_def_main_sounds(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataSounds");
srna= RNA_def_struct(brna, "BlendDataSounds", NULL);
@@ -1202,6 +1336,10 @@ void RNA_def_main_sounds(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_sounds_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_sounds_is_updated_get", NULL);
}
void RNA_def_main_armatures(BlenderRNA *brna, PropertyRNA *cprop)
@@ -1209,6 +1347,7 @@ void RNA_def_main_armatures(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataArmatures");
srna= RNA_def_struct(brna, "BlendDataArmatures", NULL);
@@ -1232,12 +1371,17 @@ void RNA_def_main_armatures(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_armatures_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_armatures_is_updated_get", NULL);
}
void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataActions");
srna= RNA_def_struct(brna, "BlendDataActions", NULL);
@@ -1261,12 +1405,17 @@ void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_actions_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_actions_is_updated_get", NULL);
}
void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataParticles");
srna= RNA_def_struct(brna, "BlendDataParticles", NULL);
@@ -1290,6 +1439,10 @@ void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_particles_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_particles_is_updated_get", NULL);
}
void RNA_def_main_gpencil(BlenderRNA *brna, PropertyRNA *cprop)
@@ -1297,6 +1450,7 @@ void RNA_def_main_gpencil(BlenderRNA *brna, PropertyRNA *cprop)
StructRNA *srna;
FunctionRNA *func;
PropertyRNA *parm;
+ PropertyRNA *prop;
RNA_def_property_srna(cprop, "BlendDataGreasePencils");
srna= RNA_def_struct(brna, "BlendDataGreasePencils", NULL);
@@ -1306,6 +1460,10 @@ void RNA_def_main_gpencil(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "tag", "rna_Main_gpencil_tag");
parm= RNA_def_boolean(func, "value", 0, "Value", "");
RNA_def_property_flag(parm, PROP_REQUIRED);
+
+ prop= RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_gpencil_is_updated_get", NULL);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c
index 990d3b89bce..57770be57eb 100644
--- a/source/blender/makesrna/intern/rna_material.c
+++ b/source/blender/makesrna/intern/rna_material.c
@@ -269,13 +269,14 @@ static void rna_Material_use_specular_ramp_set(PointerRNA *ptr, int value)
ma->ramp_spec= add_colorband(0);
}
-static void rna_Material_use_nodes_set(PointerRNA *ptr, int value)
+static void rna_Material_use_nodes_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Material *ma= (Material*)ptr->data;
- ma->use_nodes= value;
if(ma->use_nodes && ma->nodetree==NULL)
- ED_node_shader_default(ma);
+ ED_node_shader_default(scene, &ma->id);
+
+ rna_Material_update(bmain, scene, ptr);
}
static EnumPropertyItem *rna_Material_texture_coordinates_itemf(bContext *UNUSED(C), PointerRNA *ptr,
@@ -1954,9 +1955,9 @@ void RNA_def_material(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1);
- RNA_def_property_boolean_funcs(prop, NULL, "rna_Material_use_nodes_set");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Use Nodes", "Use shader nodes to render the material");
- RNA_def_property_update(prop, 0, "rna_Material_update");
+ RNA_def_property_update(prop, 0, "rna_Material_use_nodes_update");
prop= RNA_def_property(srna, "active_node_material", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Material");
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 96c23effdfb..1445cf3b537 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -56,7 +56,7 @@
#include "MEM_guardedalloc.h"
EnumPropertyItem nodetree_type_items[] = {
- {NTREE_SHADER, "MATERIAL", ICON_MATERIAL, "Material", "Material nodes" },
+ {NTREE_SHADER, "SHADER", ICON_MATERIAL, "Shader", "Shader nodes" },
{NTREE_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture nodes" },
{NTREE_COMPOSIT, "COMPOSITING", ICON_RENDERLAYERS, "Compositing", "Compositing nodes" },
{0, NULL, 0, NULL, NULL}
@@ -189,7 +189,7 @@ static StructRNA *rna_NodeTree_refine(struct PointerRNA *ptr)
case NTREE_TEXTURE:
return &RNA_TextureNodeTree;
default:
- return &RNA_UnknownType;
+ return &RNA_NodeTree;
}
}
@@ -232,6 +232,8 @@ static StructRNA *rna_NodeSocket_refine(PointerRNA *ptr)
case SOCK_RGBA:
return &RNA_NodeSocketRGBA;
break;
+ case SOCK_SHADER:
+ return &RNA_NodeSocketShader;
}
#undef SUBTYPE
@@ -2998,6 +3000,7 @@ void RNA_def_nodetree(BlenderRNA *brna)
#undef SUBTYPE
rna_def_node_socket_subtype(brna, SOCK_BOOLEAN, 0, "NodeSocketBoolean", "Boolean Node Socket");
rna_def_node_socket_subtype(brna, SOCK_RGBA, 0, "NodeSocketRGBA", "RGBA Node Socket");
+ rna_def_node_socket_subtype(brna, SOCK_SHADER, 0, "NodeSocketShader", "Shader Closure Node Socket");
rna_def_node(brna);
rna_def_node_link(brna);
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index f0ba435954b..be2375f5716 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -286,6 +286,8 @@ static void rna_Object_layer_update__internal(Main *bmain, Scene *scene, Base *b
else {
DAG_scene_sort(bmain, scene);
}
+
+ DAG_id_type_tag(bmain, ID_OB);
}
static void rna_Object_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -899,11 +901,11 @@ static void rna_GameObjectSettings_physics_type_set(PointerRNA *ptr, int value)
break;
case OB_BODY_TYPE_OCCLUDER:
ob->gameflag |= OB_OCCLUDER;
- ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC|OB_NAVMESH);
+ ob->gameflag &= ~(OB_SENSOR|OB_RIGID_BODY|OB_SOFT_BODY|OB_COLLISION|OB_DYNAMIC|OB_NAVMESH);
break;
case OB_BODY_TYPE_NAVMESH:
ob->gameflag |= OB_NAVMESH;
- ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_DYNAMIC|OB_OCCLUDER);
+ ob->gameflag &= ~(OB_SENSOR|OB_RIGID_BODY|OB_SOFT_BODY|OB_COLLISION|OB_DYNAMIC|OB_OCCLUDER);
if (ob->type == OB_MESH) {
/* could be moved into mesh UI but for now ensure mesh data layer */
@@ -912,7 +914,7 @@ static void rna_GameObjectSettings_physics_type_set(PointerRNA *ptr, int value)
break;
case OB_BODY_TYPE_NO_COLLISION:
- ob->gameflag &= ~(OB_SENSOR|OB_COLLISION|OB_OCCLUDER|OB_DYNAMIC|OB_NAVMESH);
+ ob->gameflag &= ~(OB_SENSOR|OB_RIGID_BODY|OB_SOFT_BODY|OB_COLLISION|OB_OCCLUDER|OB_DYNAMIC|OB_NAVMESH);
break;
case OB_BODY_TYPE_STATIC:
ob->gameflag |= OB_COLLISION;
@@ -946,10 +948,10 @@ static void rna_GameObjectSettings_physics_type_set(PointerRNA *ptr, int value)
if (ob->type == OB_MESH) {
/* this is needed to refresh the derived meshes draw func */
DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
- WM_main_add_notifier(NC_OBJECT|ND_DRAW, ptr->id.data);
}
}
+ WM_main_add_notifier(NC_OBJECT|ND_DRAW, ptr->id.data);
}
static PointerRNA rna_Object_active_particle_system_get(PointerRNA *ptr)
@@ -1530,9 +1532,10 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_collision_bounds", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_BOUNDS);
RNA_def_property_ui_text(prop, "Use Collision Bounds", "Specify a collision bounds type other than the default");
+ RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
prop= RNA_def_property(srna, "collision_bounds_type", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "boundtype");
+ RNA_def_property_enum_sdna(prop, NULL, "collision_boundtype");
RNA_def_property_enum_items(prop, collision_bounds_items);
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Object_collision_bounds_itemf");
RNA_def_property_ui_text(prop, "Collision Bounds", "Select the collision type");
@@ -1793,7 +1796,6 @@ static void rna_def_object(BlenderRNA *brna)
{OB_BOUNDBOX, "BOUNDS", 0, "Bounds", "Draw the bounding box of the object"},
{OB_WIRE, "WIRE", 0, "Wire", "Draw the object as a wireframe"},
{OB_SOLID, "SOLID", 0, "Solid", "Draw the object as a solid (if solid drawing is enabled in the viewport)"},
- // disabled {OB_SHADED, "SHADED", 0, "Shaded", ""},
{OB_TEXTURE, "TEXTURED", 0, "Textured", "Draw the object with textures (if textures are enabled in the viewport)"},
{0, NULL, 0, NULL, NULL}};
@@ -1802,8 +1804,6 @@ static void rna_def_object(BlenderRNA *brna)
{OB_BOUND_SPHERE, "SPHERE", 0, "Sphere", "Draw bounds as sphere"},
{OB_BOUND_CYLINDER, "CYLINDER", 0, "Cylinder", "Draw bounds as cylinder"},
{OB_BOUND_CONE, "CONE", 0, "Cone", "Draw bounds as cone"},
- {OB_BOUND_TRIANGLE_MESH, "POLYHEDRON", 0, "Polyhedron", "Draw bounds as polyhedron"},
- {OB_BOUND_CAPSULE, "CAPSULE", 0, "Capsule", "Draw bounds as capsule"},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem dupli_items[] = {
@@ -2225,7 +2225,7 @@ static void rna_def_object(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_dupli_frames_speed", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "transflag", OB_DUPLINOSPEED);
- RNA_def_property_ui_text(prop, "Dupli Frames Speed", "Set dupliframes to use the frame"); // TODO, better descriptio!
+ RNA_def_property_ui_text(prop, "Dupli Frames Speed", "Set dupliframes to use the current frame instead of parent curve's evaluation time");
RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_internal_update");
prop= RNA_def_property(srna, "use_dupli_vertices_rotation", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index 1498d161209..530d162b1fe 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -48,12 +48,39 @@
#include "BKE_context.h"
#include "BKE_report.h"
-/* RenderEngine */
+/* RenderEngine Callbacks */
+
+void engine_tag_redraw(RenderEngine *engine)
+{
+ engine->flag |= RE_ENGINE_DO_DRAW;
+}
+
+void engine_tag_update(RenderEngine *engine)
+{
+ engine->flag |= RE_ENGINE_DO_UPDATE;
+}
+
+static void engine_update(RenderEngine *engine, Main *bmain, Scene *scene)
+{
+ extern FunctionRNA rna_RenderEngine_update_func;
+ PointerRNA ptr;
+ ParameterList list;
+ FunctionRNA *func;
+
+ RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+ func= &rna_RenderEngine_update_func;
+
+ RNA_parameter_list_create(&list, &ptr, func);
+ RNA_parameter_set_lookup(&list, "data", &bmain);
+ RNA_parameter_set_lookup(&list, "scene", &scene);
+ engine->type->ext.call(NULL, &ptr, func, &list);
+
+ RNA_parameter_list_free(&list);
+}
static void engine_render(RenderEngine *engine, struct Scene *scene)
{
extern FunctionRNA rna_RenderEngine_render_func;
-
PointerRNA ptr;
ParameterList list;
FunctionRNA *func;
@@ -68,6 +95,40 @@ static void engine_render(RenderEngine *engine, struct Scene *scene)
RNA_parameter_list_free(&list);
}
+static void engine_view_update(RenderEngine *engine, const struct bContext *context)
+{
+ extern FunctionRNA rna_RenderEngine_view_update_func;
+ PointerRNA ptr;
+ ParameterList list;
+ FunctionRNA *func;
+
+ RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+ func= &rna_RenderEngine_view_update_func;
+
+ RNA_parameter_list_create(&list, &ptr, func);
+ RNA_parameter_set_lookup(&list, "context", &context);
+ engine->type->ext.call(NULL, &ptr, func, &list);
+
+ RNA_parameter_list_free(&list);
+}
+
+static void engine_view_draw(RenderEngine *engine, const struct bContext *context)
+{
+ extern FunctionRNA rna_RenderEngine_view_draw_func;
+ PointerRNA ptr;
+ ParameterList list;
+ FunctionRNA *func;
+
+ RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+ func= &rna_RenderEngine_view_draw_func;
+
+ RNA_parameter_list_create(&list, &ptr, func);
+ RNA_parameter_set_lookup(&list, "context", &context);
+ engine->type->ext.call(NULL, &ptr, func, &list);
+
+ RNA_parameter_list_free(&list);
+}
+
/* RenderEngine registration */
static void rna_RenderEngine_unregister(Main *UNUSED(bmain), StructRNA *type)
@@ -87,7 +148,7 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo
RenderEngineType *et, dummyet = {NULL};
RenderEngine dummyengine= {NULL};
PointerRNA dummyptr;
- int have_function[1];
+ int have_function[4];
/* setup dummy engine & engine type to store static properties in */
dummyengine.type= &dummyet;
@@ -122,13 +183,22 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo
et->ext.free= free;
RNA_struct_blender_type_set(et->ext.srna, et);
- et->render= (have_function[0])? engine_render: NULL;
+ et->update= (have_function[0])? engine_update: NULL;
+ et->render= (have_function[1])? engine_render: NULL;
+ et->view_update= (have_function[2])? engine_view_update: NULL;
+ et->view_draw= (have_function[3])? engine_view_draw: NULL;
BLI_addtail(&R_engines, et);
return et->ext.srna;
}
+static void **rna_RenderEngine_instance(PointerRNA *ptr)
+{
+ RenderEngine *engine = ptr->data;
+ return &engine->py_instance;
+}
+
static StructRNA* rna_RenderEngine_refine(PointerRNA *ptr)
{
RenderEngine *engine= (RenderEngine*)ptr->data;
@@ -203,14 +273,39 @@ static void rna_def_render_engine(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "RenderEngine");
RNA_def_struct_ui_text(srna, "Render Engine", "Render engine");
RNA_def_struct_refine_func(srna, "rna_RenderEngine_refine");
- RNA_def_struct_register_funcs(srna, "rna_RenderEngine_register", "rna_RenderEngine_unregister", NULL);
+ RNA_def_struct_register_funcs(srna, "rna_RenderEngine_register", "rna_RenderEngine_unregister", "rna_RenderEngine_instance");
+
+ /* final render callbacks */
+ func= RNA_def_function(srna, "update", NULL);
+ RNA_def_function_ui_description(func, "Export scene data for render");
+ RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
+ RNA_def_pointer(func, "data", "BlendData", "", "");
+ RNA_def_pointer(func, "scene", "Scene", "", "");
- /* render */
func= RNA_def_function(srna, "render", NULL);
RNA_def_function_ui_description(func, "Render scene into an image");
- RNA_def_function_flag(func, FUNC_REGISTER);
+ RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
RNA_def_pointer(func, "scene", "Scene", "", "");
+ /* viewport render callbacks */
+ func= RNA_def_function(srna, "view_update", NULL);
+ RNA_def_function_ui_description(func, "Update on data changes for viewport render");
+ RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
+ RNA_def_pointer(func, "context", "Context", "", "");
+
+ func= RNA_def_function(srna, "view_draw", NULL);
+ RNA_def_function_ui_description(func, "Draw viewport render");
+ RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
+ RNA_def_pointer(func, "context", "Context", "", "");
+
+ /* tag for redraw */
+ RNA_def_function(srna, "tag_redraw", "engine_tag_redraw");
+ RNA_def_function_ui_description(func, "Request redraw for viewport rendering");
+
+ /* tag for update */
+ RNA_def_function(srna, "tag_update", "engine_tag_update");
+ RNA_def_function_ui_description(func, "Request update call for viewport rendering");
+
func= RNA_def_function(srna, "begin_result", "RE_engine_begin_result");
prop= RNA_def_int(func, "x", 0, 0, INT_MAX, "X", "", 0, INT_MAX);
RNA_def_property_flag(prop, PROP_REQUIRED);
@@ -251,9 +346,16 @@ static void rna_def_render_engine(BlenderRNA *brna)
prop= RNA_def_string(func, "message", "", 0, "Report Message", "");
RNA_def_property_flag(prop, PROP_REQUIRED);
- /* registration */
RNA_define_verify_sdna(0);
+ prop= RNA_def_property(srna, "is_animation", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", RE_ENGINE_ANIMATION);
+
+ prop= RNA_def_property(srna, "is_preview", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", RE_ENGINE_PREVIEW);
+
+ /* registration */
+
prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "type->idname");
RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
@@ -270,6 +372,10 @@ static void rna_def_render_engine(BlenderRNA *brna)
RNA_def_property_boolean_negative_sdna(prop, NULL, "type->flag", RE_USE_POSTPROCESS);
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
+ prop= RNA_def_property(srna, "bl_use_shading_nodes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "type->flag", RE_USE_SHADING_NODES);
+ RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
+
RNA_define_verify_sdna(1);
}
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 7bdaa0a512f..63fce2d9edb 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -40,6 +40,7 @@
#include "BLI_math.h"
/* Include for Bake Options */
+#include "RE_engine.h"
#include "RE_pipeline.h"
#ifdef WITH_QUICKTIME
@@ -55,6 +56,8 @@
#include <libavformat/avformat.h>
#endif
+#include "ED_render.h"
+
#include "WM_api.h"
#include "WM_types.h"
@@ -773,6 +776,11 @@ static int rna_RenderSettings_engine_get(PointerRNA *ptr)
return 0;
}
+static void rna_RenderSettings_engine_update(Main *bmain, Scene *UNUSED(unused), PointerRNA *UNUSED(ptr))
+{
+ ED_render_engine_changed(bmain);
+}
+
static void rna_Scene_glsl_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
{
Scene *scene= (Scene*)ptr->id.data;
@@ -830,6 +838,12 @@ static int rna_RenderSettings_multiple_engines_get(PointerRNA *UNUSED(ptr))
return (BLI_countlist(&R_engines) > 1);
}
+static int rna_RenderSettings_use_shading_nodes_get(PointerRNA *ptr)
+{
+ Scene *scene= (Scene*)ptr->id.data;
+ return scene_use_new_shading_nodes(scene);
+}
+
static int rna_RenderSettings_use_game_engine_get(PointerRNA *ptr)
{
RenderData *rd= (RenderData*)ptr->data;
@@ -3212,13 +3226,18 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
RNA_def_property_enum_funcs(prop, "rna_RenderSettings_engine_get", "rna_RenderSettings_engine_set",
"rna_RenderSettings_engine_itemf");
RNA_def_property_ui_text(prop, "Engine", "Engine to use for rendering");
- RNA_def_property_update(prop, NC_WINDOW, NULL);
+ RNA_def_property_update(prop, NC_WINDOW, "rna_RenderSettings_engine_update");
prop= RNA_def_property(srna, "has_multiple_engines", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_multiple_engines_get", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Multiple Engines", "More than one rendering engine is available");
+ prop= RNA_def_property(srna, "use_shading_nodes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_use_shading_nodes_get", NULL);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Use Shading Nodes", "Active render engine uses new shading nodes system");
+
prop= RNA_def_property(srna, "use_game_engine", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_RenderSettings_use_game_engine_get", NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c
index 345ebb2cd80..250c61ed5f4 100644
--- a/source/blender/makesrna/intern/rna_scene_api.c
+++ b/source/blender/makesrna/intern/rna_scene_api.c
@@ -69,6 +69,7 @@ static void rna_Scene_frame_set(Scene *scene, int frame, float subframe)
static void rna_Scene_update_tagged(Scene *scene)
{
scene_update_tagged(G.main, scene);
+ scene_clear_tagged(G.main, scene);
}
static void rna_SceneRender_get_frame_path(RenderData *rd, int frame, char *name)
diff --git a/source/blender/makesrna/intern/rna_sensor.c b/source/blender/makesrna/intern/rna_sensor.c
index 217b50b38e5..ba58a66a2d6 100644
--- a/source/blender/makesrna/intern/rna_sensor.c
+++ b/source/blender/makesrna/intern/rna_sensor.c
@@ -102,6 +102,18 @@ static StructRNA* rna_Sensor_refine(struct PointerRNA *ptr)
}
}
+void rna_Sensor_name_set(PointerRNA *ptr, const char *value)
+{
+ bSensor *sens= (bSensor *)ptr->data;
+
+ BLI_strncpy_utf8(sens->name, value, sizeof(sens->name));
+
+ if (ptr->id.data) {
+ Object *ob= (Object *)ptr->id.data;
+ BLI_uniquename(&ob->sensors, sens, "Sensor", '.', offsetof(bSensor, name), sizeof(sens->name));
+ }
+}
+
static void rna_Sensor_type_set(struct PointerRNA *ptr, int value)
{
bSensor *sens= (bSensor *)ptr->data;
@@ -260,6 +272,7 @@ static void rna_def_sensor(BlenderRNA *brna)
prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
RNA_def_property_ui_text(prop, "Name", "Sensor name");
+ RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Sensor_name_set");
RNA_def_struct_name_property(srna, prop);
RNA_def_property_update(prop, NC_LOGIC, NULL);
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 33dcc2eb0b9..2aa99b5941a 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -47,6 +47,9 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "RE_engine.h"
+#include "RE_pipeline.h"
+
#include "RNA_enum_types.h"
EnumPropertyItem space_type_items[] = {
@@ -60,11 +63,8 @@ EnumPropertyItem space_type_items[] = {
{SPACE_INFO, "INFO", 0, "Info", ""},
{SPACE_SEQ, "SEQUENCE_EDITOR", 0, "Sequence Editor", ""},
{SPACE_TEXT, "TEXT_EDITOR", 0, "Text Editor", ""},
- //{SPACE_IMASEL, "IMAGE_BROWSER", 0, "Image Browser", ""},
- {SPACE_SOUND, "AUDIO_WINDOW", 0, "Audio Window", ""},
{SPACE_ACTION, "DOPESHEET_EDITOR", 0, "DopeSheet Editor", ""},
{SPACE_NLA, "NLA_EDITOR", 0, "NLA Editor", ""},
- {SPACE_SCRIPT, "SCRIPTS_WINDOW", 0, "Scripts Window", ""},
{SPACE_TIME, "TIMELINE", 0, "Timeline", ""},
{SPACE_NODE, "NODE_EDITOR", 0, "Node Editor", ""},
{SPACE_LOGIC, "LOGIC_EDITOR", 0, "Logic Editor", ""},
@@ -101,8 +101,8 @@ EnumPropertyItem viewport_shade_items[] = {
{OB_BOUNDBOX, "BOUNDBOX", ICON_BBOX, "Bounding Box", "Display the object's local bounding boxes only"},
{OB_WIRE, "WIREFRAME", ICON_WIRE, "Wireframe", "Display the object as wire edges"},
{OB_SOLID, "SOLID", ICON_SOLID, "Solid", "Display the object solid, lit with default OpenGL lights"},
- //{OB_SHADED, "SHADED", ICON_SMOOTH, "Shaded", "Display the object solid, with preview shading interpolated at vertices"},
{OB_TEXTURE, "TEXTURED", ICON_POTATO, "Textured", "Display the object solid, with face-assigned textures"},
+ {OB_RENDER, "RENDERED", ICON_SMOOTH, "Rendered", "Display render preview"},
{0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
@@ -152,16 +152,10 @@ static StructRNA* rna_Space_refine(struct PointerRNA *ptr)
return &RNA_SpaceSequenceEditor;
case SPACE_TEXT:
return &RNA_SpaceTextEditor;
- //case SPACE_IMASEL:
- // return &RNA_SpaceImageBrowser;
- /*case SPACE_SOUND:
- return &RNA_SpaceAudioWindow;*/
case SPACE_ACTION:
return &RNA_SpaceDopeSheetEditor;
case SPACE_NLA:
return &RNA_SpaceNLA;
- /*case SPACE_SCRIPT:
- return &RNA_SpaceScriptsWindow;*/
case SPACE_TIME:
return &RNA_SpaceTimeline;
case SPACE_NODE:
@@ -322,6 +316,25 @@ static void rna_SpaceView3D_layer_update(Main *bmain, Scene *UNUSED(scene), Poin
DAG_on_visible_update(bmain, FALSE);
}
+static void rna_SpaceView3D_viewport_shade_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ View3D *v3d= (View3D*)(ptr->data);
+ ScrArea *sa= rna_area_from_space(ptr);
+
+ if(v3d->drawtype != OB_RENDER) {
+ ARegion *ar;
+
+ for(ar=sa->regionbase.first; ar; ar=ar->next) {
+ RegionView3D *rv3d = ar->regiondata;
+
+ if(rv3d && rv3d->render_engine) {
+ RE_engine_free(rv3d->render_engine);
+ rv3d->render_engine= NULL;
+ }
+ }
+ }
+}
+
static void rna_SpaceView3D_pivot_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
{
if (U.uiflag & USER_LOCKAROUND) {
@@ -432,6 +445,29 @@ static void rna_RegionView3D_view_matrix_set(PointerRNA *ptr, const float *value
ED_view3d_from_m4((float (*)[4])values, rv3d->ofs, rv3d->viewquat, &rv3d->dist);
}
+static EnumPropertyItem *rna_SpaceView3D_viewport_shade_itemf(bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free)
+{
+ Scene *scene = ((bScreen*)ptr->id.data)->scene;
+ RenderEngineType *type = RE_engines_find(scene->r.engine);
+
+ EnumPropertyItem *item= NULL;
+ int totitem= 0;
+
+ RNA_enum_items_add_value(&item, &totitem, viewport_shade_items, OB_BOUNDBOX);
+ RNA_enum_items_add_value(&item, &totitem, viewport_shade_items, OB_WIRE);
+ RNA_enum_items_add_value(&item, &totitem, viewport_shade_items, OB_SOLID);
+ RNA_enum_items_add_value(&item, &totitem, viewport_shade_items, OB_TEXTURE);
+
+ if(type->view_draw) {
+ RNA_enum_items_add_value(&item, &totitem, viewport_shade_items, OB_RENDER);
+ }
+
+ RNA_enum_item_end(&item, &totitem);
+ *free= 1;
+
+ return item;
+}
+
/* Space Image Editor */
static PointerRNA rna_SpaceImageEditor_uvedit_get(PointerRNA *ptr)
@@ -1236,8 +1272,9 @@ static void rna_def_space_view3d(BlenderRNA *brna)
prop= RNA_def_property(srna, "viewport_shade", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "drawtype");
RNA_def_property_enum_items(prop, viewport_shade_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_SpaceView3D_viewport_shade_itemf");
RNA_def_property_ui_text(prop, "Viewport Shading", "Method to display/shade objects in the 3D View");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_SpaceView3D_viewport_shade_update");
prop= RNA_def_property(srna, "local_view", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "localvd");
@@ -2473,6 +2510,11 @@ static void rna_def_space_node(BlenderRNA *brna)
{SNODE_TEX_BRUSH, "BRUSH", ICON_BRUSH_DATA, "Brush", "Edit texture nodes from Brush"},
{0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem shader_type_items[] = {
+ {SNODE_SHADER_OBJECT, "OBJECT", ICON_OBJECT_DATA, "Object", "Edit shader nodes from Object"},
+ {SNODE_SHADER_WORLD, "WORLD", ICON_WORLD_DATA, "World", "Edit shader nodes from World"},
+ {0, NULL, 0, NULL, NULL}};
+
static EnumPropertyItem backdrop_channels_items[] = {
{0, "COLOR", ICON_IMAGE_RGB, "Color", "Draw image with RGB colors"},
{SNODE_USE_ALPHA, "COLOR_ALPHA", ICON_IMAGE_RGB_ALPHA, "Color and Alpha",
@@ -2496,6 +2538,12 @@ static void rna_def_space_node(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Texture Type", "Type of data to take texture from");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE, NULL);
+ prop= RNA_def_property(srna, "shader_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "shaderfrom");
+ RNA_def_property_enum_items(prop, shader_type_items);
+ RNA_def_property_ui_text(prop, "Shader Type", "Type of data to take shader from");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_NODE, NULL);
+
prop= RNA_def_property(srna, "id", PROP_POINTER, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "ID", "Datablock whose nodes are being edited");
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 898ee2b2623..fc9c8a241c6 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -1392,7 +1392,7 @@ static void rna_def_userdef_theme_space_logic(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
- /* space_buts */
+ /* space_logic */
srna= RNA_def_struct(brna, "ThemeLogicEditor", NULL);
RNA_def_struct_sdna(srna, "ThemeSpace");
@@ -1451,37 +1451,6 @@ static void rna_def_userdef_theme_space_time(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_userdef_update");
}
-static void rna_def_userdef_theme_space_sound(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- /* space_sound */
-
- srna= RNA_def_struct(brna, "ThemeAudioWindow", NULL);
- RNA_def_struct_sdna(srna, "ThemeSpace");
- RNA_def_struct_ui_text(srna, "Theme Audio Window", "Theme settings for the Audio Window");
-
- rna_def_userdef_theme_spaces_main(srna, SPACE_SOUND);
-
- prop= RNA_def_property(srna, "grid", PROP_FLOAT, PROP_COLOR_GAMMA);
- RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Grid", "");
- RNA_def_property_update(prop, 0, "rna_userdef_update");
-
- prop= RNA_def_property(srna, "window_sliders", PROP_FLOAT, PROP_COLOR_GAMMA);
- RNA_def_property_float_sdna(prop, NULL, "shade1");
- RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Window Sliders", "");
- RNA_def_property_update(prop, 0, "rna_userdef_update");
-
- prop= RNA_def_property(srna, "frame_current", PROP_FLOAT, PROP_COLOR_GAMMA);
- RNA_def_property_float_sdna(prop, NULL, "cframe");
- RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Current Frame", "");
- RNA_def_property_update(prop, 0, "rna_userdef_update");
-}
-
static void rna_def_userdef_theme_space_image(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1956,7 +1925,6 @@ static void rna_def_userdef_dothemes(BlenderRNA *brna)
rna_def_userdef_theme_space_info(brna);
rna_def_userdef_theme_space_userpref(brna);
rna_def_userdef_theme_space_console(brna);
- rna_def_userdef_theme_space_sound(brna);
rna_def_userdef_theme_space_logic(brna);
rna_def_userdef_theme_colorset(brna);
rna_def_userdef_themes(brna);
diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c
index 22570460093..d421aff7157 100644
--- a/source/blender/makesrna/intern/rna_world.c
+++ b/source/blender/makesrna/intern/rna_world.c
@@ -46,6 +46,8 @@
#include "BKE_main.h"
#include "BKE_texture.h"
+#include "ED_node.h"
+
#include "WM_api.h"
static PointerRNA rna_World_lighting_get(PointerRNA *ptr)
@@ -119,6 +121,15 @@ static void rna_World_stars_update(Main *UNUSED(bmain), Scene *UNUSED(scene), Po
WM_main_add_notifier(NC_WORLD|ND_WORLD_STARS, wo);
}
+static void rna_World_use_nodes_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ World *wrld= (World*)ptr->data;
+
+ if(wrld->use_nodes && wrld->nodetree==NULL)
+ ED_node_shader_default(scene, &wrld->id);
+
+ rna_World_update(bmain, scene, ptr);
+}
#else
@@ -161,11 +172,6 @@ static void rna_def_world_mtex(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Zenith Down", "Affect the color of the zenith below");
RNA_def_property_update(prop, 0, "rna_World_update");
- /* unused
- prop= RNA_def_property(srna, "map_mist", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_MIST);
- RNA_def_property_ui_text(prop, "Mist", "Causes the texture to affect the intensity of the mist");*/
-
prop= RNA_def_property(srna, "texture_coords", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "texco");
RNA_def_property_enum_items(prop, texco_items);
@@ -393,7 +399,7 @@ static void rna_def_world_mist(BlenderRNA *brna)
prop= RNA_def_property(srna, "intensity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "misi");
RNA_def_property_range(prop, 0, 1);
- RNA_def_property_ui_text(prop, "Intensity", "Intensity of the mist effect");
+ RNA_def_property_ui_text(prop, "Minimum", "Overall minimum intensity of the mist effect");
RNA_def_property_update(prop, 0, "rna_World_update");
prop= RNA_def_property(srna, "start", PROP_FLOAT, PROP_DISTANCE);
@@ -461,13 +467,6 @@ static void rna_def_world_stars(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Color Randomization", "Randomize star colors");
RNA_def_property_update(prop, 0, "rna_World_stars_update");
-
- /* unused
- prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
- RNA_def_property_float_sdna(prop, NULL, "starr");
- RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Color", "Stars color");
- RNA_def_property_update(prop, 0, "rna_World_update");*/
}
void RNA_def_world(BlenderRNA *brna)
@@ -564,6 +563,17 @@ void RNA_def_world(BlenderRNA *brna)
RNA_def_property_pointer_funcs(prop, "rna_World_stars_get", NULL, NULL, NULL);
RNA_def_property_ui_text(prop, "Stars", "World stars settings");
+ /* nodes */
+ prop= RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
+ RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
+ RNA_def_property_ui_text(prop, "Node Tree", "Node tree for node based worlds");
+
+ prop= RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1);
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
+ RNA_def_property_ui_text(prop, "Use Nodes", "Use shader nodes to render the world");
+ RNA_def_property_update(prop, 0, "rna_World_use_nodes_update");
+
rna_def_lighting(brna);
rna_def_world_mist(brna);
rna_def_world_stars(brna);
diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c
index b8e95ad4c51..347af0066c6 100644
--- a/source/blender/modifiers/intern/MOD_solidify.c
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -626,7 +626,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
add_v3_v3(edge_vert_nos[ed->v1], nor);
add_v3_v3(edge_vert_nos[ed->v2], nor);
#endif
- origindex[numFaces * 2 + i]= fidx;
}
#ifdef SOLIDIFY_SIDE_NORMALS
diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c
index cf5856b6339..df528a0cb11 100644
--- a/source/blender/modifiers/intern/MOD_uvproject.c
+++ b/source/blender/modifiers/intern/MOD_uvproject.c
@@ -38,6 +38,7 @@
#include "DNA_meshdata_types.h"
#include "DNA_camera_types.h"
#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
#include "BLI_math.h"
#include "BLI_string.h"
@@ -159,7 +160,7 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
float scax= umd->scalex ? umd->scalex : 1.0f;
float scay= umd->scaley ? umd->scaley : 1.0f;
int free_uci= 0;
-
+
aspect = aspx / aspy;
for(i = 0; i < umd->num_projectors; ++i)
@@ -194,16 +195,28 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
free_uci= 1;
}
else {
- float scale= (cam->type == CAM_PERSP) ? cam->clipsta * 32.0f / cam->lens : cam->ortho_scale;
+ float sensor= (cam->sensor_fit == CAMERA_SENSOR_FIT_VERT) ? (cam->sensor_y) : cam->sensor_x;
+ float scale= (cam->type == CAM_PERSP) ? cam->clipsta * sensor / cam->lens : cam->ortho_scale;
float xmax, xmin, ymax, ymin;
- if(aspect > 1.0f) {
+ if(cam->sensor_fit==CAMERA_SENSOR_FIT_AUTO) {
+ if(aspect > 1.0f) {
+ xmax = 0.5f * scale;
+ ymax = xmax / aspect;
+ } else {
+ ymax = 0.5f * scale;
+ xmax = ymax * aspect;
+ }
+ }
+ else if(cam->sensor_fit==CAMERA_SENSOR_FIT_HOR) {
xmax = 0.5f * scale;
ymax = xmax / aspect;
- } else {
+ }
+ else {
ymax = 0.5f * scale;
xmax = ymax * aspect;
}
+
xmin = -xmax;
ymin = -ymax;
diff --git a/source/blender/nodes/composite/node_composite_util.c b/source/blender/nodes/composite/node_composite_util.c
index b8282f2c452..929b87618d8 100644
--- a/source/blender/nodes/composite/node_composite_util.c
+++ b/source/blender/nodes/composite/node_composite_util.c
@@ -1358,24 +1358,24 @@ void IIR_gauss(CompBuf* src, float sigma, int chan, int xy)
tsM[7] = sc*(cf[1]*cf[2] + cf[3]*cf[2]*cf[2] - cf[1]*cf[3]*cf[3] - cf[3]*cf[3]*cf[3] - cf[3]*cf[2] + cf[3]);
tsM[8] = sc*(cf[3]*(cf[1] + cf[3]*cf[2]));
-#define YVV(L)\
-{\
- W[0] = cf[0]*X[0] + cf[1]*X[0] + cf[2]*X[0] + cf[3]*X[0];\
- W[1] = cf[0]*X[1] + cf[1]*W[0] + cf[2]*X[0] + cf[3]*X[0];\
- W[2] = cf[0]*X[2] + cf[1]*W[1] + cf[2]*W[0] + cf[3]*X[0];\
- for (i=3; i<L; i++)\
- W[i] = cf[0]*X[i] + cf[1]*W[i-1] + cf[2]*W[i-2] + cf[3]*W[i-3];\
- tsu[0] = W[L-1] - X[L-1];\
- tsu[1] = W[L-2] - X[L-1];\
- tsu[2] = W[L-3] - X[L-1];\
- tsv[0] = tsM[0]*tsu[0] + tsM[1]*tsu[1] + tsM[2]*tsu[2] + X[L-1];\
- tsv[1] = tsM[3]*tsu[0] + tsM[4]*tsu[1] + tsM[5]*tsu[2] + X[L-1];\
- tsv[2] = tsM[6]*tsu[0] + tsM[7]*tsu[1] + tsM[8]*tsu[2] + X[L-1];\
- Y[L-1] = cf[0]*W[L-1] + cf[1]*tsv[0] + cf[2]*tsv[1] + cf[3]*tsv[2];\
- Y[L-2] = cf[0]*W[L-2] + cf[1]*Y[L-1] + cf[2]*tsv[0] + cf[3]*tsv[1];\
- Y[L-3] = cf[0]*W[L-3] + cf[1]*Y[L-2] + cf[2]*Y[L-1] + cf[3]*tsv[0];\
- for (i=L-4; i>=0; i--)\
- Y[i] = cf[0]*W[i] + cf[1]*Y[i+1] + cf[2]*Y[i+2] + cf[3]*Y[i+3];\
+#define YVV(L) \
+{ \
+ W[0] = cf[0]*X[0] + cf[1]*X[0] + cf[2]*X[0] + cf[3]*X[0]; \
+ W[1] = cf[0]*X[1] + cf[1]*W[0] + cf[2]*X[0] + cf[3]*X[0]; \
+ W[2] = cf[0]*X[2] + cf[1]*W[1] + cf[2]*W[0] + cf[3]*X[0]; \
+ for (i=3; i<L; i++) \
+ W[i] = cf[0]*X[i] + cf[1]*W[i-1] + cf[2]*W[i-2] + cf[3]*W[i-3]; \
+ tsu[0] = W[L-1] - X[L-1]; \
+ tsu[1] = W[L-2] - X[L-1]; \
+ tsu[2] = W[L-3] - X[L-1]; \
+ tsv[0] = tsM[0]*tsu[0] + tsM[1]*tsu[1] + tsM[2]*tsu[2] + X[L-1]; \
+ tsv[1] = tsM[3]*tsu[0] + tsM[4]*tsu[1] + tsM[5]*tsu[2] + X[L-1]; \
+ tsv[2] = tsM[6]*tsu[0] + tsM[7]*tsu[1] + tsM[8]*tsu[2] + X[L-1]; \
+ Y[L-1] = cf[0]*W[L-1] + cf[1]*tsv[0] + cf[2]*tsv[1] + cf[3]*tsv[2]; \
+ Y[L-2] = cf[0]*W[L-2] + cf[1]*Y[L-1] + cf[2]*tsv[0] + cf[3]*tsv[1]; \
+ Y[L-3] = cf[0]*W[L-3] + cf[1]*Y[L-2] + cf[2]*Y[L-1] + cf[3]*tsv[0]; \
+ for (i=L-4; i>=0; i--) \
+ Y[i] = cf[0]*W[i] + cf[1]*Y[i+1] + cf[2]*Y[i+2] + cf[3]*Y[i+3]; \
}
// intermediate buffers
diff --git a/source/blender/nodes/composite/nodes/node_composite_alphaOver.c b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c
index d9774453d3e..b542954948a 100644
--- a/source/blender/nodes/composite/nodes/node_composite_alphaOver.c
+++ b/source/blender/nodes/composite/nodes/node_composite_alphaOver.c
@@ -35,8 +35,8 @@
/* **************** ALPHAOVER ******************** */
static bNodeSocketTemplate cmp_node_alphaover_in[]= {
{ SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_alphaover_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c
index fe04e69993f..17038fd6780 100644
--- a/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_bilateralblur.c
@@ -33,8 +33,8 @@
/* **************** BILATERALBLUR ******************** */
static bNodeSocketTemplate cmp_node_bilateralblur_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
- { SOCK_RGBA, 1, "Determinator", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
+ { SOCK_RGBA, 1, "Determinator", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
@@ -43,43 +43,47 @@ static bNodeSocketTemplate cmp_node_bilateralblur_out[]= {
{ -1, 0, "" }
};
-#define INIT_C3\
- mean0 = 1; mean1[0] = src[0];mean1[1] = src[1];mean1[2] = src[2];mean1[3] = src[3];
+#define INIT_C3 \
+ mean0 = 1; \
+ mean1[0] = src[0]; \
+ mean1[1] = src[1]; \
+ mean1[2] = src[2]; \
+ mean1[3] = src[3];
/* finds color distances */
-#define COLOR_DISTANCE_C3(c1, c2)\
- ((c1[0] - c2[0])*(c1[0] - c2[0]) + \
- (c1[1] - c2[1])*(c1[1] - c2[1]) + \
- (c1[2] - c2[2])*(c1[2] - c2[2]) + \
- (c1[3] - c2[3])*(c1[3] - c2[3]))
+#define COLOR_DISTANCE_C3(c1, c2) \
+ ((c1[0] - c2[0])*(c1[0] - c2[0]) + \
+ (c1[1] - c2[1])*(c1[1] - c2[1]) + \
+ (c1[2] - c2[2])*(c1[2] - c2[2]) + \
+ (c1[3] - c2[3])*(c1[3] - c2[3]))
/* this is the main kernel function for comparing color distances
and adding them weighted to the final color */
-#define KERNEL_ELEMENT_C3(k)\
- temp_color = src + deltas[k];\
- ref_color = ref + deltas[k];\
- w = weight_tab[k] + COLOR_DISTANCE_C3(ref, ref_color )*i2sigma_color;\
- w = 1./(w*w + 1); \
- mean0 += w;\
- mean1[0] += temp_color[0]*w; \
- mean1[1] += temp_color[1]*w; \
- mean1[2] += temp_color[2]*w; \
+#define KERNEL_ELEMENT_C3(k) \
+ temp_color = src + deltas[k]; \
+ ref_color = ref + deltas[k]; \
+ w = weight_tab[k] + COLOR_DISTANCE_C3(ref, ref_color )*i2sigma_color; \
+ w = 1.0/(w*w + 1); \
+ mean0 += w; \
+ mean1[0] += temp_color[0]*w; \
+ mean1[1] += temp_color[1]*w; \
+ mean1[2] += temp_color[2]*w; \
mean1[3] += temp_color[3]*w;
/* write blurred values to image */
-#define UPDATE_OUTPUT_C3\
- mean0 = 1./mean0;\
- dest[x*pix + 0] = mean1[0]*mean0; \
- dest[x*pix + 1] = mean1[1]*mean0; \
- dest[x*pix + 2] = mean1[2]*mean0; \
+#define UPDATE_OUTPUT_C3 \
+ mean0 = 1.0/mean0; \
+ dest[x*pix + 0] = mean1[0]*mean0; \
+ dest[x*pix + 1] = mean1[1]*mean0; \
+ dest[x*pix + 2] = mean1[2]*mean0; \
dest[x*pix + 3] = mean1[3]*mean0;
/* initializes deltas for fast access to neighbour pixels */
-#define INIT_3X3_DELTAS( deltas, step, nch ) \
- ((deltas)[0] = (nch), (deltas)[1] = -(step) + (nch), \
- (deltas)[2] = -(step), (deltas)[3] = -(step) - (nch), \
- (deltas)[4] = -(nch), (deltas)[5] = (step) - (nch), \
- (deltas)[6] = (step), (deltas)[7] = (step) + (nch));
+#define INIT_3X3_DELTAS( deltas, step, nch ) \
+ ((deltas)[0] = (nch), (deltas)[1] = -(step) + (nch), \
+ (deltas)[2] = -(step), (deltas)[3] = -(step) - (nch), \
+ (deltas)[4] = -(nch), (deltas)[5] = (step) - (nch), \
+ (deltas)[6] = (step), (deltas)[7] = (step) + (nch));
/* code of this node was heavily inspired by the smooth function of opencv library.
diff --git a/source/blender/nodes/composite/nodes/node_composite_blur.c b/source/blender/nodes/composite/nodes/node_composite_blur.c
index 2db80385951..188ac653506 100644
--- a/source/blender/nodes/composite/nodes/node_composite_blur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_blur.c
@@ -35,7 +35,7 @@
/* **************** BLUR ******************** */
static bNodeSocketTemplate cmp_node_blur_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ SOCK_FLOAT, 1, "Size", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_brightness.c b/source/blender/nodes/composite/nodes/node_composite_brightness.c
index 95099e7adfb..9153e3899fc 100644
--- a/source/blender/nodes/composite/nodes/node_composite_brightness.c
+++ b/source/blender/nodes/composite/nodes/node_composite_brightness.c
@@ -37,7 +37,7 @@
/* **************** Brigh and contrsast ******************** */
static bNodeSocketTemplate cmp_node_brightcontrast_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ SOCK_FLOAT, 1, "Bright", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE},
{ SOCK_FLOAT, 1, "Contrast", 0.0f, 0.0f, 0.0f, 0.0f, -100.0f, 100.0f, PROP_NONE},
{ -1, 0, "" }
diff --git a/source/blender/nodes/composite/nodes/node_composite_channelMatte.c b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c
index dbdfc6712dc..10f0afb6cf6 100644
--- a/source/blender/nodes/composite/nodes/node_composite_channelMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_channelMatte.c
@@ -35,7 +35,7 @@
/* ******************* Channel Matte Node ********************************* */
static bNodeSocketTemplate cmp_node_channel_matte_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Image", 1.0f, 1.0f, 1.0f, 1.0f},
{-1,0,""}
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c
index 71bb7c35d01..25891aeaa68 100644
--- a/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_chromaMatte.c
@@ -34,8 +34,8 @@
/* ******************* Chroma Key ********************************************************** */
static bNodeSocketTemplate cmp_node_chroma_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
- {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Image", 1.0f, 1.0f, 1.0f, 1.0f},
+ {SOCK_RGBA,1,"Key Color", 1.0f, 1.0f, 1.0f, 1.0f},
{-1,0,""}
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_colorMatte.c b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c
index a82d8cf1f41..3dfc3a193a8 100644
--- a/source/blender/nodes/composite/nodes/node_composite_colorMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_colorMatte.c
@@ -34,8 +34,8 @@
/* ******************* Color Key ********************************************************** */
static bNodeSocketTemplate cmp_node_color_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
- {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Image", 1.0f, 1.0f, 1.0f, 1.0f},
+ {SOCK_RGBA,1,"Key Color", 1.0f, 1.0f, 1.0f, 1.0f},
{-1,0,""}
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_colorSpill.c b/source/blender/nodes/composite/nodes/node_composite_colorSpill.c
index 6b833d44f72..c85a81b9bdb 100644
--- a/source/blender/nodes/composite/nodes/node_composite_colorSpill.c
+++ b/source/blender/nodes/composite/nodes/node_composite_colorSpill.c
@@ -37,7 +37,7 @@
/* ******************* Color Spill Supression ********************************* */
static bNodeSocketTemplate cmp_node_color_spill_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Image", 1.0f, 1.0f, 1.0f, 1.0f},
{SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
{-1,0,""}
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_colorbalance.c b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c
index e9176db4c0d..eb75802c0a6 100644
--- a/source/blender/nodes/composite/nodes/node_composite_colorbalance.c
+++ b/source/blender/nodes/composite/nodes/node_composite_colorbalance.c
@@ -37,7 +37,7 @@
/* ******************* Color Balance ********************************* */
static bNodeSocketTemplate cmp_node_colorbalance_in[]={
{SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Image", 1.0f, 1.0f, 1.0f, 1.0f},
{-1,0,""}
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_crop.c b/source/blender/nodes/composite/nodes/node_composite_crop.c
index c20593726cc..7847726c68e 100644
--- a/source/blender/nodes/composite/nodes/node_composite_crop.c
+++ b/source/blender/nodes/composite/nodes/node_composite_crop.c
@@ -35,7 +35,7 @@
/* **************** Crop ******************** */
static bNodeSocketTemplate cmp_node_crop_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_crop_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_curves.c b/source/blender/nodes/composite/nodes/node_composite_curves.c
index c796a01f5a8..675710942fb 100644
--- a/source/blender/nodes/composite/nodes/node_composite_curves.c
+++ b/source/blender/nodes/composite/nodes/node_composite_curves.c
@@ -121,7 +121,7 @@ void register_node_type_cmp_curve_vec(ListBase *lb)
/* **************** CURVE RGB ******************** */
static bNodeSocketTemplate cmp_node_curve_rgb_in[]= {
{ SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_FACTOR},
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ SOCK_RGBA, 1, "Black Level", 0.0f, 0.0f, 0.0f, 1.0f},
{ SOCK_RGBA, 1, "White Level", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
diff --git a/source/blender/nodes/composite/nodes/node_composite_defocus.c b/source/blender/nodes/composite/nodes/node_composite_defocus.c
index 72a9897188c..2232c4a489e 100644
--- a/source/blender/nodes/composite/nodes/node_composite_defocus.c
+++ b/source/blender/nodes/composite/nodes/node_composite_defocus.c
@@ -34,8 +34,8 @@
/* ************ qdn: Defocus node ****************** */
static bNodeSocketTemplate cmp_node_defocus_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
- { SOCK_FLOAT, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Z", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_defocus_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_diffMatte.c b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c
index 8b1647414da..c621d524044 100644
--- a/source/blender/nodes/composite/nodes/node_composite_diffMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_diffMatte.c
@@ -34,8 +34,8 @@
/* ******************* channel Difference Matte ********************************* */
static bNodeSocketTemplate cmp_node_diff_matte_in[]={
- {SOCK_RGBA,1,"Image 1", 0.8f, 0.8f, 0.8f, 1.0f},
- {SOCK_RGBA,1,"Image 2", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Image 1", 1.0f, 1.0f, 1.0f, 1.0f},
+ {SOCK_RGBA,1,"Image 2", 1.0f, 1.0f, 1.0f, 1.0f},
{-1,0,""}
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_directionalblur.c b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c
index c77dc16bbf3..591870d0911 100644
--- a/source/blender/nodes/composite/nodes/node_composite_directionalblur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_directionalblur.c
@@ -33,7 +33,7 @@
#include "node_composite_util.h"
static bNodeSocketTemplate cmp_node_dblur_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.f},
{ -1, 0, "" }
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_displace.c b/source/blender/nodes/composite/nodes/node_composite_displace.c
index 8242acb6d49..02a1d203bef 100644
--- a/source/blender/nodes/composite/nodes/node_composite_displace.c
+++ b/source/blender/nodes/composite/nodes/node_composite_displace.c
@@ -36,7 +36,7 @@
/* **************** Displace ******************** */
static bNodeSocketTemplate cmp_node_displace_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ SOCK_VECTOR, 1, "Vector", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_TRANSLATION},
{ SOCK_FLOAT, 1, "X Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, "Y Scale", 0.0f, 0.0f, 0.0f, 0.0f, -1000.0f, 1000.0f, PROP_FACTOR},
diff --git a/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c
index c4c6abbd718..401b143aac3 100644
--- a/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_distanceMatte.c
@@ -34,8 +34,8 @@
/* ******************* channel Distance Matte ********************************* */
static bNodeSocketTemplate cmp_node_distance_matte_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
- {SOCK_RGBA,1,"Key Color", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Image", 1.0f, 1.0f, 1.0f, 1.0f},
+ {SOCK_RGBA,1,"Key Color", 1.0f, 1.0f, 1.0f, 1.0f},
{-1,0,""}
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_filter.c b/source/blender/nodes/composite/nodes/node_composite_filter.c
index 717942a0ec9..071ee84377c 100644
--- a/source/blender/nodes/composite/nodes/node_composite_filter.c
+++ b/source/blender/nodes/composite/nodes/node_composite_filter.c
@@ -34,8 +34,8 @@
/* **************** FILTER ******************** */
static bNodeSocketTemplate cmp_node_filter_in[]= {
- { SOCK_FLOAT, 1, "Fac", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_FLOAT, 1, "Fac", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_filter_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_flip.c b/source/blender/nodes/composite/nodes/node_composite_flip.c
index ba1b72a1fb4..01f58182227 100644
--- a/source/blender/nodes/composite/nodes/node_composite_flip.c
+++ b/source/blender/nodes/composite/nodes/node_composite_flip.c
@@ -34,7 +34,7 @@
/* **************** Flip ******************** */
static bNodeSocketTemplate cmp_node_flip_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_gamma.c b/source/blender/nodes/composite/nodes/node_composite_gamma.c
index 1f8f934b1ba..2bb600db99d 100644
--- a/source/blender/nodes/composite/nodes/node_composite_gamma.c
+++ b/source/blender/nodes/composite/nodes/node_composite_gamma.c
@@ -36,7 +36,7 @@
/* **************** Gamma Tools ******************** */
static bNodeSocketTemplate cmp_node_gamma_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ SOCK_FLOAT, 1, "Gamma", 1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 10.0f, PROP_UNSIGNED},
{ -1, 0, "" }
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_glare.c b/source/blender/nodes/composite/nodes/node_composite_glare.c
index 8660a4d612f..f4391a1af77 100644
--- a/source/blender/nodes/composite/nodes/node_composite_glare.c
+++ b/source/blender/nodes/composite/nodes/node_composite_glare.c
@@ -33,7 +33,7 @@
#include "node_composite_util.h"
static bNodeSocketTemplate cmp_node_glare_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_glare_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c
index a1c17abfdf6..c2304b37c0d 100644
--- a/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c
+++ b/source/blender/nodes/composite/nodes/node_composite_hueSatVal.c
@@ -36,7 +36,7 @@
/* **************** Hue Saturation ******************** */
static bNodeSocketTemplate cmp_node_hue_sat_in[]= {
{ SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_hue_sat_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_huecorrect.c b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c
index 6b9196d58dc..f18eca3dfcc 100644
--- a/source/blender/nodes/composite/nodes/node_composite_huecorrect.c
+++ b/source/blender/nodes/composite/nodes/node_composite_huecorrect.c
@@ -34,7 +34,7 @@
static bNodeSocketTemplate cmp_node_huecorrect_in[]= {
{ SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, PROP_FACTOR},
- { SOCK_RGBA, 1, "Image", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_idMask.c b/source/blender/nodes/composite/nodes/node_composite_idMask.c
index cf21efb000e..914483bc52f 100644
--- a/source/blender/nodes/composite/nodes/node_composite_idMask.c
+++ b/source/blender/nodes/composite/nodes/node_composite_idMask.c
@@ -36,7 +36,7 @@
/* **************** ID Mask ******************** */
static bNodeSocketTemplate cmp_node_idmask_in[]= {
- { SOCK_FLOAT, 1, "ID value", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "ID value", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_idmask_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_invert.c b/source/blender/nodes/composite/nodes/node_composite_invert.c
index 25ac24cf185..c428e37bd35 100644
--- a/source/blender/nodes/composite/nodes/node_composite_invert.c
+++ b/source/blender/nodes/composite/nodes/node_composite_invert.c
@@ -34,7 +34,7 @@
/* **************** INVERT ******************** */
static bNodeSocketTemplate cmp_node_invert_in[]= {
{ SOCK_FLOAT, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
- { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Color", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_lensdist.c b/source/blender/nodes/composite/nodes/node_composite_lensdist.c
index 4d2794d844d..e57f405ed68 100644
--- a/source/blender/nodes/composite/nodes/node_composite_lensdist.c
+++ b/source/blender/nodes/composite/nodes/node_composite_lensdist.c
@@ -33,7 +33,7 @@
#include "node_composite_util.h"
static bNodeSocketTemplate cmp_node_lensdist_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ SOCK_FLOAT, 1, "Distort", 0.f, 0.f, 0.f, 0.f, -0.999f, 1.f, PROP_NONE},
{ SOCK_FLOAT, 1, "Dispersion", 0.f, 0.f, 0.f, 0.f, 0.f, 1.f, PROP_NONE},
{ -1, 0, "" }
diff --git a/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c b/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c
index 8c37b3dd90f..8573849b069 100644
--- a/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c
+++ b/source/blender/nodes/composite/nodes/node_composite_lummaMatte.c
@@ -35,7 +35,7 @@
/* ******************* Luma Matte Node ********************************* */
static bNodeSocketTemplate cmp_node_luma_matte_in[]={
- {SOCK_RGBA,1,"Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ {SOCK_RGBA,1,"Image", 1.0f, 1.0f, 1.0f, 1.0f},
{-1,0,""}
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_mapUV.c b/source/blender/nodes/composite/nodes/node_composite_mapUV.c
index f4daf49f55d..5dc6d1c3aaa 100644
--- a/source/blender/nodes/composite/nodes/node_composite_mapUV.c
+++ b/source/blender/nodes/composite/nodes/node_composite_mapUV.c
@@ -35,7 +35,7 @@
/* **************** Map UV ******************** */
static bNodeSocketTemplate cmp_node_mapuv_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ SOCK_VECTOR, 1, "UV", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_mapValue.c b/source/blender/nodes/composite/nodes/node_composite_mapValue.c
index 30eb0b8640b..81e963d4790 100644
--- a/source/blender/nodes/composite/nodes/node_composite_mapValue.c
+++ b/source/blender/nodes/composite/nodes/node_composite_mapValue.c
@@ -34,7 +34,7 @@
/* **************** MAP VALUE ******************** */
static bNodeSocketTemplate cmp_node_map_value_in[]= {
- { SOCK_FLOAT, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Value", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_map_value_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_normalize.c b/source/blender/nodes/composite/nodes/node_composite_normalize.c
index a119a0b7de3..36206d82d0b 100644
--- a/source/blender/nodes/composite/nodes/node_composite_normalize.c
+++ b/source/blender/nodes/composite/nodes/node_composite_normalize.c
@@ -35,7 +35,7 @@
/* **************** NORMALIZE single channel, useful for Z buffer ******************** */
static bNodeSocketTemplate cmp_node_normalize_in[]= {
- { SOCK_FLOAT, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f, PROP_NONE},
+ { SOCK_FLOAT, 1, "Value", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, PROP_NONE},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_normalize_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_premulkey.c b/source/blender/nodes/composite/nodes/node_composite_premulkey.c
index 7ce2f80e580..b188b0dd323 100644
--- a/source/blender/nodes/composite/nodes/node_composite_premulkey.c
+++ b/source/blender/nodes/composite/nodes/node_composite_premulkey.c
@@ -36,7 +36,7 @@
/* **************** Premul and Key Alpha Convert ******************** */
static bNodeSocketTemplate cmp_node_premulkey_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_premulkey_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_rgb.c b/source/blender/nodes/composite/nodes/node_composite_rgb.c
index e86de3c7839..a7c820ddce6 100644
--- a/source/blender/nodes/composite/nodes/node_composite_rgb.c
+++ b/source/blender/nodes/composite/nodes/node_composite_rgb.c
@@ -35,7 +35,7 @@
/* **************** RGB ******************** */
static bNodeSocketTemplate cmp_node_rgb_out[]= {
- { SOCK_RGBA, 0, "RGBA", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 0, "RGBA", 0.5f, 0.5f, 0.5f, 1.0f},
{ -1, 0, "" }
};
diff --git a/source/blender/nodes/composite/nodes/node_composite_rotate.c b/source/blender/nodes/composite/nodes/node_composite_rotate.c
index 74ab33eb093..96712baf8b0 100644
--- a/source/blender/nodes/composite/nodes/node_composite_rotate.c
+++ b/source/blender/nodes/composite/nodes/node_composite_rotate.c
@@ -35,7 +35,7 @@
/* **************** Rotate ******************** */
static bNodeSocketTemplate cmp_node_rotate_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ SOCK_FLOAT, 1, "Degr", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_ANGLE},
{ -1, 0, "" }
};
@@ -60,6 +60,7 @@ static void node_composit_exec_rotate(void *UNUSED(data), bNode *node, bNodeStac
rad= (M_PI*in[1]->vec[0])/180.0f;
+
s= sin(rad);
c= cos(rad);
centx= cbuf->x/2;
diff --git a/source/blender/nodes/composite/nodes/node_composite_scale.c b/source/blender/nodes/composite/nodes/node_composite_scale.c
index 48631a18dcb..5eb789ae0c9 100644
--- a/source/blender/nodes/composite/nodes/node_composite_scale.c
+++ b/source/blender/nodes/composite/nodes/node_composite_scale.c
@@ -37,7 +37,7 @@
#define CMP_SCALE_MAX 12000
static bNodeSocketTemplate cmp_node_scale_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ SOCK_FLOAT, 1, "X", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX, PROP_FACTOR},
{ SOCK_FLOAT, 1, "Y", 1.0f, 0.0f, 0.0f, 0.0f, 0.0001f, CMP_SCALE_MAX, PROP_FACTOR},
{ -1, 0, "" }
diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c
index 4a5036a6a7f..bf58d443aec 100644
--- a/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.c
@@ -35,7 +35,7 @@
/* **************** SEPARATE HSVA ******************** */
static bNodeSocketTemplate cmp_node_sephsva_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_sephsva_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c
index 143c67d099a..ade2b22bf35 100644
--- a/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.c
@@ -34,7 +34,7 @@
/* **************** SEPARATE RGBA ******************** */
static bNodeSocketTemplate cmp_node_seprgba_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_seprgba_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c
index 502d1999101..3b3d57bf442 100644
--- a/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.c
@@ -35,7 +35,7 @@
/* **************** SEPARATE YCCA ******************** */
static bNodeSocketTemplate cmp_node_sepycca_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_sepycca_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c b/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c
index 5a766df29ed..aedb5652e61 100644
--- a/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.c
@@ -35,7 +35,7 @@
/* **************** SEPARATE YUVA ******************** */
static bNodeSocketTemplate cmp_node_sepyuva_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_sepyuva_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_tonemap.c b/source/blender/nodes/composite/nodes/node_composite_tonemap.c
index c243c104774..36e583a77ff 100644
--- a/source/blender/nodes/composite/nodes/node_composite_tonemap.c
+++ b/source/blender/nodes/composite/nodes/node_composite_tonemap.c
@@ -33,7 +33,7 @@
#include "node_composite_util.h"
static bNodeSocketTemplate cmp_node_tonemap_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_tonemap_out[]= {
diff --git a/source/blender/nodes/composite/nodes/node_composite_translate.c b/source/blender/nodes/composite/nodes/node_composite_translate.c
index 1865d6fc3d4..2b25ef92a1e 100644
--- a/source/blender/nodes/composite/nodes/node_composite_translate.c
+++ b/source/blender/nodes/composite/nodes/node_composite_translate.c
@@ -36,7 +36,7 @@
/* **************** Translate ******************** */
static bNodeSocketTemplate cmp_node_translate_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ SOCK_FLOAT, 1, "X", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_NONE},
{ SOCK_FLOAT, 1, "Y", 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, 10000.0f, PROP_NONE},
{ -1, 0, "" }
diff --git a/source/blender/nodes/composite/nodes/node_composite_vecBlur.c b/source/blender/nodes/composite/nodes/node_composite_vecBlur.c
index cdf56c230d8..a0fbcec198a 100644
--- a/source/blender/nodes/composite/nodes/node_composite_vecBlur.c
+++ b/source/blender/nodes/composite/nodes/node_composite_vecBlur.c
@@ -35,7 +35,7 @@
/* **************** VECTOR BLUR ******************** */
static bNodeSocketTemplate cmp_node_vecblur_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
{ SOCK_FLOAT, 1, "Z", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_NONE},
{ SOCK_VECTOR, 1, "Speed", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_VELOCITY},
{ -1, 0, "" }
diff --git a/source/blender/nodes/composite/nodes/node_composite_zcombine.c b/source/blender/nodes/composite/nodes/node_composite_zcombine.c
index 46a66957eac..7aac3539960 100644
--- a/source/blender/nodes/composite/nodes/node_composite_zcombine.c
+++ b/source/blender/nodes/composite/nodes/node_composite_zcombine.c
@@ -36,10 +36,10 @@
/* **************** Z COMBINE ******************** */
/* lazy coder note: node->custom2 is abused to send signal */
static bNodeSocketTemplate cmp_node_zcombine_in[]= {
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
- { SOCK_FLOAT, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f, PROP_NONE},
- { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f},
- { SOCK_FLOAT, 1, "Z", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 10000.0f, PROP_NONE},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Z", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 10000.0f, PROP_NONE},
+ { SOCK_RGBA, 1, "Image", 1.0f, 1.0f, 1.0f, 1.0f},
+ { SOCK_FLOAT, 1, "Z", 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 10000.0f, PROP_NONE},
{ -1, 0, "" }
};
static bNodeSocketTemplate cmp_node_zcombine_out[]= {
diff --git a/source/blender/nodes/intern/node_common.c b/source/blender/nodes/intern/node_common.c
index c43c1b36a84..11dcf44a288 100644
--- a/source/blender/nodes/intern/node_common.c
+++ b/source/blender/nodes/intern/node_common.c
@@ -980,6 +980,7 @@ void register_node_type_frame(ListBase *lb)
node_type_base(ntype, NODE_FRAME, "Frame", NODE_CLASS_LAYOUT, NODE_BACKGROUND);
node_type_size(ntype, 150, 100, 0);
+ node_type_compatibility(ntype, NODE_OLD_SHADING|NODE_NEW_SHADING);
ntype->needs_free = 1;
nodeRegisterType(lb, ntype);
diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c
index cc8e1619570..d0ae17914ca 100644
--- a/source/blender/nodes/shader/node_shader_tree.c
+++ b/source/blender/nodes/shader/node_shader_tree.c
@@ -32,8 +32,10 @@
#include <string.h>
+#include "DNA_lamp_types.h"
#include "DNA_material_types.h"
#include "DNA_node_types.h"
+#include "DNA_world_types.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
@@ -56,11 +58,20 @@
static void foreach_nodetree(Main *main, void *calldata, bNodeTreeCallback func)
{
Material *ma;
- for(ma= main->mat.first; ma; ma= ma->id.next) {
- if(ma->nodetree) {
+ Lamp *la;
+ World *wo;
+
+ for(ma= main->mat.first; ma; ma= ma->id.next)
+ if(ma->nodetree)
func(calldata, &ma->id, ma->nodetree);
- }
- }
+
+ for(la= main->lamp.first; la; la= la->id.next)
+ if(la->nodetree)
+ func(calldata, &la->id, la->nodetree);
+
+ for(wo= main->world.first; wo; wo= wo->id.next)
+ if(wo->nodetree)
+ func(calldata, &wo->id, wo->nodetree);
}
static void local_sync(bNodeTree *localtree, bNodeTree *ntree)
@@ -212,8 +223,15 @@ void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr)
/* each material node has own local shaderesult, with optional copying */
memset(shr, 0, sizeof(ShadeResult));
- if (!exec)
- exec = ntree->execdata = ntreeShaderBeginExecTree(ntree, 1);
+ /* ensure execdata is only initialized once */
+ if (!exec) {
+ BLI_lock_thread(LOCK_NODES);
+ if(!ntree->execdata)
+ ntree->execdata = ntreeShaderBeginExecTree(ntree, 1);
+ BLI_unlock_thread(LOCK_NODES);
+
+ exec = ntree->execdata;
+ }
nts= ntreeGetThreadStack(exec, shi->thread);
ntreeExecThreadNodes(exec, nts, &scd, shi->thread);
diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c
index c75fbc8d923..b0ef6ccccbf 100644
--- a/source/blender/nodes/shader/node_shader_util.c
+++ b/source/blender/nodes/shader/node_shader_util.c
@@ -207,6 +207,8 @@ void node_gpu_stack_from_data(struct GPUNodeStack *gs, int type, bNodeStack *ns)
gs->type= GPU_VEC3;
else if (type == SOCK_RGBA)
gs->type= GPU_VEC4;
+ else if (type == SOCK_SHADER)
+ gs->type= GPU_VEC4;
else
gs->type= GPU_NONE;
diff --git a/source/blender/nodes/shader/nodes/node_shader_camera.c b/source/blender/nodes/shader/nodes/node_shader_camera.c
index 15332bfa066..c7882a6e0e2 100644
--- a/source/blender/nodes/shader/nodes/node_shader_camera.c
+++ b/source/blender/nodes/shader/nodes/node_shader_camera.c
@@ -62,6 +62,7 @@ void register_node_type_sh_camera(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_CAMERA, "Camera Data", NODE_CLASS_INPUT, 0);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, NULL, sh_node_camera_out);
node_type_size(&ntype, 95, 95, 120);
node_type_storage(&ntype, "node_camera", NULL, NULL);
diff --git a/source/blender/nodes/shader/nodes/node_shader_curves.c b/source/blender/nodes/shader/nodes/node_shader_curves.c
index 9c441e45656..7ac05bb28bf 100644
--- a/source/blender/nodes/shader/nodes/node_shader_curves.c
+++ b/source/blender/nodes/shader/nodes/node_shader_curves.c
@@ -74,6 +74,7 @@ void register_node_type_sh_curve_vec(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_CURVE_VEC, "Vector Curves", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_curve_vec_in, sh_node_curve_vec_out);
node_type_size(&ntype, 200, 140, 320);
node_type_init(&ntype, node_shader_init_curve_vec);
@@ -128,6 +129,7 @@ void register_node_type_sh_curve_rgb(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_CURVE_RGB, "RGB Curves", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_curve_rgb_in, sh_node_curve_rgb_out);
node_type_size(&ntype, 200, 140, 320);
node_type_init(&ntype, node_shader_init_curve_rgb);
diff --git a/source/blender/nodes/shader/nodes/node_shader_dynamic.c b/source/blender/nodes/shader/nodes/node_shader_dynamic.c
index d41ddecbab3..51ddb865c54 100644
--- a/source/blender/nodes/shader/nodes/node_shader_dynamic.c
+++ b/source/blender/nodes/shader/nodes/node_shader_dynamic.c
@@ -766,6 +766,7 @@ void register_node_type_sh_dynamic(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, NODE_DYNAMIC, "Dynamic", NODE_CLASS_OP_DYNAMIC, NODE_OPTIONS, NULL, NULL);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_size(&ntype, 150, 60, 300);
node_type_init(&ntype, node_dynamic_init_cb);
node_type_storage(&ntype, "NodeScriptDict", node_dynamic_free_storage_cb, node_dynamic_copy_cb);
@@ -781,6 +782,7 @@ void register_node_type_sh_dynamic(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, NODE_DYNAMIC, "Dynamic", NODE_CLASS_OP_DYNAMIC, 0);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
nodeRegisterType(lb, &ntype);
}
diff --git a/source/blender/nodes/shader/nodes/node_shader_geom.c b/source/blender/nodes/shader/nodes/node_shader_geom.c
index 11ac94a1ce9..ab4931f12ac 100644
--- a/source/blender/nodes/shader/nodes/node_shader_geom.c
+++ b/source/blender/nodes/shader/nodes/node_shader_geom.c
@@ -143,6 +143,7 @@ void register_node_type_sh_geom(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_GEOMETRY, "Geometry", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, NULL, sh_node_geom_out);
node_type_size(&ntype, 120, 80, 160);
node_type_init(&ntype, node_shader_init_geometry);
diff --git a/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c b/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c
index db717c48a88..7fb31d80ffc 100644
--- a/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c
+++ b/source/blender/nodes/shader/nodes/node_shader_hueSatVal.c
@@ -85,6 +85,7 @@ void register_node_type_sh_hue_sat(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_HUE_SAT, "Hue Saturation Value", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_hue_sat_in, sh_node_hue_sat_out);
node_type_size(&ntype, 150, 80, 250);
node_type_exec(&ntype, node_shader_exec_hue_sat);
diff --git a/source/blender/nodes/shader/nodes/node_shader_invert.c b/source/blender/nodes/shader/nodes/node_shader_invert.c
index 44d26bfff4e..066ff14a870 100644
--- a/source/blender/nodes/shader/nodes/node_shader_invert.c
+++ b/source/blender/nodes/shader/nodes/node_shader_invert.c
@@ -77,6 +77,7 @@ void register_node_type_sh_invert(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_INVERT, "Invert", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_invert_in, sh_node_invert_out);
node_type_size(&ntype, 90, 80, 100);
node_type_exec(&ntype, node_shader_exec_invert);
diff --git a/source/blender/nodes/shader/nodes/node_shader_mapping.c b/source/blender/nodes/shader/nodes/node_shader_mapping.c
index 7ec30952ea1..862c52187dc 100644
--- a/source/blender/nodes/shader/nodes/node_shader_mapping.c
+++ b/source/blender/nodes/shader/nodes/node_shader_mapping.c
@@ -91,6 +91,7 @@ void register_node_type_sh_mapping(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_MAPPING, "Mapping", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_mapping_in, sh_node_mapping_out);
node_type_size(&ntype, 240, 160, 320);
node_type_init(&ntype, node_shader_init_mapping);
diff --git a/source/blender/nodes/shader/nodes/node_shader_material.c b/source/blender/nodes/shader/nodes/node_shader_material.c
index 408b7b0ea48..f93928d8884 100644
--- a/source/blender/nodes/shader/nodes/node_shader_material.c
+++ b/source/blender/nodes/shader/nodes/node_shader_material.c
@@ -305,6 +305,7 @@ void register_node_type_sh_material(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_MATERIAL, "Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_material_in, sh_node_material_out);
node_type_size(&ntype, 120, 80, 240);
node_type_init(&ntype, node_shader_init_material);
@@ -320,6 +321,7 @@ void register_node_type_sh_material_ext(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_MATERIAL_EXT, "Extended Material", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_material_ext_in, sh_node_material_ext_out);
node_type_size(&ntype, 120, 80, 240);
node_type_init(&ntype, node_shader_init_material);
diff --git a/source/blender/nodes/shader/nodes/node_shader_math.c b/source/blender/nodes/shader/nodes/node_shader_math.c
index 6faad500793..13ee1f79fe6 100644
--- a/source/blender/nodes/shader/nodes/node_shader_math.c
+++ b/source/blender/nodes/shader/nodes/node_shader_math.c
@@ -241,6 +241,7 @@ void register_node_type_sh_math(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_math_in, sh_node_math_out);
node_type_size(&ntype, 120, 110, 160);
node_type_label(&ntype, node_math_label);
diff --git a/source/blender/nodes/shader/nodes/node_shader_mixRgb.c b/source/blender/nodes/shader/nodes/node_shader_mixRgb.c
index 463146ec59c..7aed6bce4c4 100644
--- a/source/blender/nodes/shader/nodes/node_shader_mixRgb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_mixRgb.c
@@ -78,6 +78,7 @@ void register_node_type_sh_mix_rgb(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_MIX_RGB, "Mix", NODE_CLASS_OP_COLOR, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_mix_rgb_in, sh_node_mix_rgb_out);
node_type_size(&ntype, 100, 60, 150);
node_type_label(&ntype, node_blend_label);
diff --git a/source/blender/nodes/shader/nodes/node_shader_normal.c b/source/blender/nodes/shader/nodes/node_shader_normal.c
index 0038570c5b1..c23c6d328cf 100644
--- a/source/blender/nodes/shader/nodes/node_shader_normal.c
+++ b/source/blender/nodes/shader/nodes/node_shader_normal.c
@@ -84,6 +84,7 @@ void register_node_type_sh_normal(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_NORMAL, "Normal", NODE_CLASS_OP_VECTOR, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_normal_in, sh_node_normal_out);
node_type_init(&ntype, node_shader_init_normal);
node_type_exec(&ntype, node_shader_exec_normal);
diff --git a/source/blender/nodes/shader/nodes/node_shader_output.c b/source/blender/nodes/shader/nodes/node_shader_output.c
index 98a23534f90..ea7fae8f961 100644
--- a/source/blender/nodes/shader/nodes/node_shader_output.c
+++ b/source/blender/nodes/shader/nodes/node_shader_output.c
@@ -83,6 +83,7 @@ void register_node_type_sh_output(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_OUTPUT, "Output", NODE_CLASS_OUTPUT, NODE_PREVIEW);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_output_in, NULL);
node_type_size(&ntype, 80, 60, 200);
node_type_exec(&ntype, node_shader_exec_output);
diff --git a/source/blender/nodes/shader/nodes/node_shader_rgb.c b/source/blender/nodes/shader/nodes/node_shader_rgb.c
index db2e9905a01..1a0b4ea616b 100644
--- a/source/blender/nodes/shader/nodes/node_shader_rgb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_rgb.c
@@ -71,6 +71,7 @@ void register_node_type_sh_rgb(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_RGB, "RGB", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, NULL, sh_node_rgb_out);
node_type_init(&ntype, node_shader_init_rgb);
node_type_size(&ntype, 140, 80, 140);
diff --git a/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c
index 77d8cdf033a..4f409bb3ec1 100644
--- a/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c
+++ b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.c
@@ -61,6 +61,7 @@ void register_node_type_sh_seprgb(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_SEPRGB, "Separate RGB", NODE_CLASS_CONVERTOR, 0);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_seprgb_in, sh_node_seprgb_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_shader_exec_seprgb);
@@ -100,6 +101,7 @@ void register_node_type_sh_combrgb(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_COMBRGB, "Combine RGB", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_combrgb_in, sh_node_combrgb_out);
node_type_size(&ntype, 80, 40, 140);
node_type_exec(&ntype, node_shader_exec_combrgb);
diff --git a/source/blender/nodes/shader/nodes/node_shader_squeeze.c b/source/blender/nodes/shader/nodes/node_shader_squeeze.c
index ec2c1860597..16a9ae8aedc 100644
--- a/source/blender/nodes/shader/nodes/node_shader_squeeze.c
+++ b/source/blender/nodes/shader/nodes/node_shader_squeeze.c
@@ -67,6 +67,7 @@ void register_node_type_sh_squeeze(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_SQUEEZE, "Squeeze Value", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_squeeze_in, sh_node_squeeze_out);
node_type_size(&ntype, 120, 110, 160);
node_type_storage(&ntype, "node_squeeze", NULL, NULL);
diff --git a/source/blender/nodes/shader/nodes/node_shader_texture.c b/source/blender/nodes/shader/nodes/node_shader_texture.c
index 199af9a69a9..588cdc1da83 100644
--- a/source/blender/nodes/shader/nodes/node_shader_texture.c
+++ b/source/blender/nodes/shader/nodes/node_shader_texture.c
@@ -136,6 +136,7 @@ void register_node_type_sh_texture(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_TEXTURE, "Texture", NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_texture_in, sh_node_texture_out);
node_type_size(&ntype, 120, 80, 240);
node_type_exec(&ntype, node_shader_exec_texture);
diff --git a/source/blender/nodes/shader/nodes/node_shader_valToRgb.c b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c
index bc418a7c416..4d41e62b242 100644
--- a/source/blender/nodes/shader/nodes/node_shader_valToRgb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_valToRgb.c
@@ -76,6 +76,7 @@ void register_node_type_sh_valtorgb(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_VALTORGB, "ColorRamp", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_valtorgb_in, sh_node_valtorgb_out);
node_type_size(&ntype, 240, 200, 300);
node_type_init(&ntype, node_shader_init_valtorgb);
@@ -116,6 +117,7 @@ void register_node_type_sh_rgbtobw(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_RGBTOBW, "RGB to BW", NODE_CLASS_CONVERTOR, 0);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_rgbtobw_in, sh_node_rgbtobw_out);
node_type_size(&ntype, 80, 40, 120);
node_type_exec(&ntype, node_shader_exec_rgbtobw);
diff --git a/source/blender/nodes/shader/nodes/node_shader_value.c b/source/blender/nodes/shader/nodes/node_shader_value.c
index 95ee54e225d..4a8aa6c9cf4 100644
--- a/source/blender/nodes/shader/nodes/node_shader_value.c
+++ b/source/blender/nodes/shader/nodes/node_shader_value.c
@@ -71,6 +71,7 @@ void register_node_type_sh_value(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_VALUE, "Value", NODE_CLASS_INPUT, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, NULL, sh_node_value_out);
node_type_init(&ntype, node_shader_init_value);
node_type_size(&ntype, 80, 50, 120);
diff --git a/source/blender/nodes/shader/nodes/node_shader_vectMath.c b/source/blender/nodes/shader/nodes/node_shader_vectMath.c
index 4282b40cb4d..b3f995dcdce 100644
--- a/source/blender/nodes/shader/nodes/node_shader_vectMath.c
+++ b/source/blender/nodes/shader/nodes/node_shader_vectMath.c
@@ -135,6 +135,7 @@ void register_node_type_sh_vect_math(ListBase *lb)
static bNodeType ntype;
node_type_base(&ntype, SH_NODE_VECT_MATH, "Vector Math", NODE_CLASS_CONVERTOR, NODE_OPTIONS);
+ node_type_compatibility(&ntype, NODE_OLD_SHADING);
node_type_socket_templates(&ntype, sh_node_vect_math_in, sh_node_vect_math_out);
node_type_size(&ntype, 80, 75, 140);
node_type_label(&ntype, node_vect_math_label);
diff --git a/source/blender/nodes/texture/node_texture_tree.c b/source/blender/nodes/texture/node_texture_tree.c
index 78792956684..5e5d44540dc 100644
--- a/source/blender/nodes/texture/node_texture_tree.c
+++ b/source/blender/nodes/texture/node_texture_tree.c
@@ -232,8 +232,15 @@ int ntreeTexExecTree(
data.mtex= mtex;
data.shi= shi;
- if (!exec)
- exec = ntreeTexBeginExecTree(nodes, 1);
+ /* ensure execdata is only initialized once */
+ if (!exec) {
+ BLI_lock_thread(LOCK_NODES);
+ if(!nodes->execdata)
+ ntreeTexBeginExecTree(nodes, 1);
+ BLI_unlock_thread(LOCK_NODES);
+
+ exec= nodes->execdata;
+ }
nts= ntreeGetThreadStack(exec, thread);
ntreeExecThreadNodes(exec, nts, &data, thread);
diff --git a/source/blender/nodes/texture/nodes/node_texture_scale.c b/source/blender/nodes/texture/nodes/node_texture_scale.c
index fbca9be068c..f42b3addc91 100644
--- a/source/blender/nodes/texture/nodes/node_texture_scale.c
+++ b/source/blender/nodes/texture/nodes/node_texture_scale.c
@@ -35,7 +35,7 @@
static bNodeSocketTemplate inputs[]= {
{ SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f },
- { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 0.0f, -10.0f, 10.0f, PROP_FACTOR },
+ { SOCK_VECTOR, 1, "Scale", 1.0f, 1.0f, 1.0f, 0.0f, -10.0f, 10.0f, PROP_XYZ },
{ -1, 0, "" }
};
diff --git a/source/blender/nodes/texture/nodes/node_texture_texture.c b/source/blender/nodes/texture/nodes/node_texture_texture.c
index 2d543470342..1b8eb3aabc6 100644
--- a/source/blender/nodes/texture/nodes/node_texture_texture.c
+++ b/source/blender/nodes/texture/nodes/node_texture_texture.c
@@ -54,8 +54,14 @@ static void colorfn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
float co[3], dxt[3], dyt[3];
copy_v3_v3(co, p->co);
- copy_v3_v3(dxt, p->dxt);
- copy_v3_v3(dyt, p->dyt);
+ if (p->osatex) {
+ copy_v3_v3(dxt, p->dxt);
+ copy_v3_v3(dyt, p->dyt);
+ }
+ else {
+ zero_v3(dxt);
+ zero_v3(dyt);
+ }
if(node->custom2 || node->need_exec==0) {
/* this node refers to its own texture tree! */
diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h
index d8ddcd593a8..29e0185c2f2 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -71,7 +71,7 @@ void BPY_text_free_code(struct Text *text);
void BPY_modules_update(struct bContext *C); // XXX - annoying, need this for pointers that get out of date
void BPY_modules_load_user(struct bContext *C);
-void BPY_app_handlers_reset(void);
+void BPY_app_handlers_reset(const short do_all);
void BPY_driver_reset(void);
float BPY_driver_exec(struct ChannelDriver *driver);
diff --git a/source/blender/python/generic/IDProp.c b/source/blender/python/generic/IDProp.c
index 076b4811d07..6d869a7eb1f 100644
--- a/source/blender/python/generic/IDProp.c
+++ b/source/blender/python/generic/IDProp.c
@@ -195,19 +195,22 @@ static PyObject *BPy_IDGroup_GetName(BPy_IDProperty *self, void *UNUSED(closure)
static int BPy_IDGroup_SetName(BPy_IDProperty *self, PyObject *value, void *UNUSED(closure))
{
- char *st;
+ const char *name;
+ Py_ssize_t name_size;
+
if (!PyUnicode_Check(value)) {
PyErr_SetString(PyExc_TypeError, "expected a string!");
return -1;
}
- st = _PyUnicode_AsString(value);
- if (BLI_strnlen(st, MAX_IDPROP_NAME) == MAX_IDPROP_NAME) {
+ name = _PyUnicode_AsStringAndSize(value, &name_size);
+
+ if (name_size > MAX_IDPROP_NAME) {
PyErr_SetString(PyExc_TypeError, "string length cannot exceed 31 characters!");
return -1;
}
- BLI_strncpy(self->prop->name, st, sizeof(self->prop->name));
+ memcpy(self->prop->name, name, name_size);
return 0;
}
@@ -236,7 +239,7 @@ static Py_ssize_t BPy_IDGroup_Map_Len(BPy_IDProperty *self)
static PyObject *BPy_IDGroup_Map_GetItem(BPy_IDProperty *self, PyObject *item)
{
IDProperty *idprop;
- char *name;
+ const char *name;
if (self->prop->type != IDP_GROUP) {
PyErr_SetString(PyExc_TypeError, "unsubscriptable object");
@@ -301,14 +304,22 @@ static int idp_sequence_type(PyObject *seq)
return type;
}
-/* note: group can be a pointer array or a group */
-const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, IDProperty *group, PyObject *ob)
+/* note: group can be a pointer array or a group.
+ * assume we already checked key is a string. */
+const char *BPy_IDProperty_Map_ValidateAndCreate(PyObject *name_obj, IDProperty *group, PyObject *ob)
{
IDProperty *prop = NULL;
IDPropertyTemplate val = {0};
- if (strlen(name) >= sizeof(group->name))
- return "the length of IDProperty names is limited to 31 characters";
+ const char *name= "";
+
+ if (name_obj) {
+ Py_ssize_t name_size;
+ name = _PyUnicode_AsStringAndSize(name_obj, &name_size);
+ if (name_size > MAX_IDPROP_NAME) {
+ return "the length of IDProperty names is limited to 31 characters";
+ }
+ }
if (PyFloat_Check(ob)) {
val.d = PyFloat_AsDouble(ob);
@@ -364,7 +375,7 @@ const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, IDProperty *g
for (i=0; i<val.array.len; i++) {
const char *error;
item = PySequence_GetItem(ob, i);
- error= BPy_IDProperty_Map_ValidateAndCreate("", prop, item);
+ error= BPy_IDProperty_Map_ValidateAndCreate(NULL, prop, item);
Py_DECREF(item);
if (error)
@@ -396,7 +407,7 @@ const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, IDProperty *g
Py_XDECREF(pval);
return "invalid element in subgroup dict template!";
}
- if (BPy_IDProperty_Map_ValidateAndCreate(_PyUnicode_AsString(key), prop, pval)) {
+ if (BPy_IDProperty_Map_ValidateAndCreate(key, prop, pval)) {
IDP_FreeProperty(prop);
MEM_freeN(prop);
Py_XDECREF(keys);
@@ -453,7 +464,7 @@ int BPy_Wrap_SetMapItem(IDProperty *prop, PyObject *key, PyObject *val)
return -1;
}
- err = BPy_IDProperty_Map_ValidateAndCreate(_PyUnicode_AsString(key), prop, val);
+ err = BPy_IDProperty_Map_ValidateAndCreate(key, prop, val);
if (err) {
PyErr_SetString(PyExc_KeyError, err );
return -1;
@@ -587,7 +598,7 @@ static PyObject *BPy_IDGroup_Pop(BPy_IDProperty *self, PyObject *value)
{
IDProperty *idprop;
PyObject *pyform;
- char *name = _PyUnicode_AsString(value);
+ const char *name = _PyUnicode_AsString(value);
if (!name) {
PyErr_SetString(PyExc_TypeError, "pop expected at least 1 argument, got 0");
@@ -724,7 +735,7 @@ static PyObject *BPy_IDGroup_GetItems(BPy_IDProperty *self)
static int BPy_IDGroup_Contains(BPy_IDProperty *self, PyObject *value)
{
- char *name = _PyUnicode_AsString(value);
+ const char *name = _PyUnicode_AsString(value);
if (!name) {
PyErr_SetString(PyExc_TypeError, "expected a string");
diff --git a/source/blender/python/generic/IDProp.h b/source/blender/python/generic/IDProp.h
index f71514f9df0..36cb4c76a5c 100644
--- a/source/blender/python/generic/IDProp.h
+++ b/source/blender/python/generic/IDProp.h
@@ -61,7 +61,7 @@ int BPy_Wrap_SetMapItem(struct IDProperty *prop, PyObject *key, PyObject *val);
PyObject *BPy_IDGroup_WrapData(struct ID *id, struct IDProperty *prop );
-const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, struct IDProperty *group, PyObject *ob);
+const char *BPy_IDProperty_Map_ValidateAndCreate(PyObject *key, struct IDProperty *group, PyObject *ob);
void IDProp_Init_Types(void);
diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c
index 24d963243f6..441c4b6438a 100644
--- a/source/blender/python/generic/bgl.c
+++ b/source/blender/python/generic/bgl.c
@@ -205,29 +205,36 @@ PyTypeObject BGL_bufferType = {
NULL /*tp_del*/
};
-
-/* #ifndef __APPLE__ */
-
-#define BGL_Wrap(nargs, funcname, ret, arg_list) \
-static PyObject *Method_##funcname (PyObject *UNUSED(self), PyObject *args) {\
- arg_def##nargs arg_list; \
- ret_def_##ret; \
- if (!PyArg_ParseTuple(args, arg_str##nargs arg_list, arg_ref##nargs arg_list)) return NULL;\
- ret_set_##ret gl##funcname (arg_var##nargs arg_list);\
- ret_ret_##ret; \
+#define BGL_Wrap(nargs, funcname, ret, arg_list) \
+static PyObject *Method_##funcname (PyObject *UNUSED(self), PyObject *args) \
+{ \
+ arg_def##nargs arg_list; \
+ ret_def_##ret; \
+ if (!PyArg_ParseTuple(args, \
+ arg_str##nargs arg_list, \
+ arg_ref##nargs arg_list)) \
+ { \
+ return NULL; \
+ } \
+ ret_set_##ret gl##funcname (arg_var##nargs arg_list); \
+ ret_ret_##ret; \
}
-#define BGLU_Wrap(nargs, funcname, ret, arg_list) \
-static PyObject *Method_##funcname (PyObject *UNUSED(self), PyObject *args) {\
- arg_def##nargs arg_list; \
- ret_def_##ret; \
- if (!PyArg_ParseTuple(args, arg_str##nargs arg_list, arg_ref##nargs arg_list)) return NULL;\
- ret_set_##ret glu##funcname (arg_var##nargs arg_list);\
- ret_ret_##ret; \
+#define BGLU_Wrap(nargs, funcname, ret, arg_list) \
+static PyObject *Method_##funcname (PyObject *UNUSED(self), PyObject *args) \
+{ \
+ arg_def##nargs arg_list; \
+ ret_def_##ret; \
+ if (!PyArg_ParseTuple(args, \
+ arg_str##nargs arg_list, \
+ arg_ref##nargs arg_list)) \
+ { \
+ return NULL; \
+ } \
+ ret_set_##ret glu##funcname (arg_var##nargs arg_list); \
+ ret_ret_##ret; \
}
-/* #endif */
-
/********/
int BGL_typeSize(int type)
{
@@ -267,7 +274,7 @@ Buffer *BGL_MakeBuffer(int type, int ndimensions, int *dimensions, void *initbuf
memcpy(buffer->dimensions, dimensions, ndimensions*sizeof(int));
buffer->type= type;
buffer->buf.asvoid= buf;
-
+
if (initbuffer) {
memcpy(buffer->buf.asvoid, initbuffer, length*size);
}
diff --git a/source/blender/python/generic/bgl.h b/source/blender/python/generic/bgl.h
index 5cf9eac8289..6df534a3940 100644
--- a/source/blender/python/generic/bgl.h
+++ b/source/blender/python/generic/bgl.h
@@ -331,12 +331,13 @@ extern PyTypeObject BGL_bufferType;
#define ret_def_GLstring const unsigned char *ret_str;
#define ret_set_GLstring ret_str=
-#define ret_ret_GLstring \
- if (ret_str) {\
- return PyUnicode_FromString((const char *)ret_str);\
- } else {\
- PyErr_SetString(PyExc_AttributeError, "could not get opengl string");\
- return NULL;\
- }
+#define ret_ret_GLstring \
+ if (ret_str) { \
+ return PyUnicode_FromString((const char *)ret_str); \
+ } \
+ else { \
+ PyErr_SetString(PyExc_AttributeError, "could not get opengl string"); \
+ return NULL; \
+ } \
#endif /* BGL_H */
diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c
index 293ade35584..acfe6ee80bf 100644
--- a/source/blender/python/generic/bpy_internal_import.c
+++ b/source/blender/python/generic/bpy_internal_import.c
@@ -15,12 +15,10 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
* This is a new part of Blender.
*
- * Contributor(s): Willian P. Germano
+ * Contributor(s): Willian P. Germano,
+ * Campbell Barton
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -308,77 +306,3 @@ static PyObject *blender_reload(PyObject *UNUSED(self), PyObject *module)
PyMethodDef bpy_import_meth= {"bpy_import_meth", (PyCFunction)blender_import, METH_VARARGS | METH_KEYWORDS, "blenders import"};
PyMethodDef bpy_reload_meth= {"bpy_reload_meth", (PyCFunction)blender_reload, METH_O, "blenders reload"};
-
-
-/* Clear user modules.
- * This is to clear any modules that could be defined from running scripts in blender.
- *
- * Its also needed for the BGE Python api so imported scripts are not used between levels
- *
- * This clears every modules that has a __file__ attribute (is not a builtin)
- *
- * Note that clearing external python modules is important for the BGE otherwise
- * it wont reload scripts between loading different blend files or while making the game.
- * - use 'clear_all' arg in this case.
- *
- * Since pythons built-ins include a full path even for win32.
- * even if we remove a python module a re-import will bring it back again.
- */
-
-#if 0 // not used anymore but may still come in handy later
-
-#if defined(WIN32) || defined(WIN64)
-#define SEPSTR "\\"
-#else
-#define SEPSTR "/"
-#endif
-
-
-void bpy_text_clear_modules(int clear_all)
-{
- PyObject *modules= PyImport_GetModuleDict();
-
- char *fname;
- char *file_extension;
-
- /* looping over the dict */
- PyObject *key, *value;
- Py_ssize_t pos= 0;
-
- /* new list */
- PyObject *list;
-
- if (modules==NULL)
- return; /* should never happen but just incase */
-
- list= PyList_New(0);
-
- /* go over sys.modules and remove anything with a
- * sys.modukes[x].__file__ thats ends with a .py and has no path
- */
- while (PyDict_Next(modules, &pos, &key, &value)) {
- fname= PyModule_GetFilename(value);
- if (fname) {
- if (clear_all || ((strstr(fname, SEPSTR))==0)) { /* no path ? */
- file_extension= strstr(fname, ".py");
- if (file_extension && (*(file_extension + 3) == '\0' || *(file_extension + 4) == '\0')) { /* .py or pyc extension? */
- /* now we can be fairly sure its a python import from the blendfile */
- PyList_Append(list, key); /* free'd with the list */
- }
- }
- }
- else {
- PyErr_Clear();
- }
- }
-
- /* remove all our modules */
- for (pos=0; pos < PyList_GET_SIZE(list); pos++) {
- /* PyObject_Print(key, stderr, 0); */
- key= PyList_GET_ITEM(list, pos);
- PyDict_DelItem(modules, key);
- }
-
- Py_DECREF(list); /* removes all references from append */
-}
-#endif
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index c6fb5133e33..eb4ecf79941 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -363,7 +363,7 @@ error_cleanup:
/* string conversion, escape non-unicode chars, coerce must be set to NULL */
const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
{
- char *result;
+ const char *result;
result= _PyUnicode_AsString(py_str);
diff --git a/source/blender/python/intern/bpy_app_handlers.c b/source/blender/python/intern/bpy_app_handlers.c
index 7008aeda074..f130a4bcc5c 100644
--- a/source/blender/python/intern/bpy_app_handlers.c
+++ b/source/blender/python/intern/bpy_app_handlers.c
@@ -38,15 +38,22 @@ void bpy_app_generic_callback(struct Main *main, struct ID *id, void *arg);
static PyTypeObject BlenderAppCbType;
static PyStructSequence_Field app_cb_info_fields[]= {
- {(char *)"frame_change_pre", NULL},
- {(char *)"frame_change_post", NULL},
- {(char *)"render_pre", NULL},
- {(char *)"render_post", NULL},
- {(char *)"render_stats", NULL},
- {(char *)"load_pre", NULL},
- {(char *)"load_post", NULL},
- {(char *)"save_pre", NULL},
- {(char *)"save_post", NULL},
+ {(char *)"frame_change_pre", (char *)"Callback list - on frame change for playback and rendering (before)"},
+ {(char *)"frame_change_post", (char *)"Callback list - on frame change for playback and rendering (after)"},
+ {(char *)"render_pre", (char *)"Callback list - on render (before)"},
+ {(char *)"render_post", (char *)"Callback list - on render (after)"},
+ {(char *)"render_stats", (char *)"Callback list - on printing render statistics"},
+ {(char *)"load_pre", (char *)"Callback list - on loading a new blend file (before)"},
+ {(char *)"load_post", (char *)"Callback list - on loading a new blend file (after)"},
+ {(char *)"save_pre", (char *)"Callback list - on saving a blend file (before)"},
+ {(char *)"save_post", (char *)"Callback list - on saving a blend file (after)"},
+ {(char *)"scene_update_pre", (char *)"Callback list - on updating the scenes data (before)"},
+ {(char *)"scene_update_post", (char *)"Callback list - on updating the scenes data (after)"},
+
+ /* sets the permanent tag */
+# define APP_CB_OTHER_FIELDS 1
+ {(char *)"persistent", (char *)"Function decorator for callback functions not to be removed when loading new files"},
+
{NULL}
};
@@ -63,6 +70,95 @@ static PyStructSequence_Desc app_cb_info_desc= {
#endif
*/
+/* --------------------------------------------------------------------------*/
+/* permanent tagging code */
+#define PERMINENT_CB_ID "_bpy_persistent"
+
+static PyObject *bpy_app_handlers_persistent_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *UNUSED(kwds))
+{
+ PyObject *value;
+
+ if(!PyArg_ParseTuple(args, "O:bpy.app.handlers.persistent", &value))
+ return NULL;
+
+ if (PyFunction_Check(value)) {
+ PyObject **dict_ptr= _PyObject_GetDictPtr(value);
+ if (dict_ptr == NULL) {
+ PyErr_SetString(PyExc_ValueError,
+ "bpy.app.handlers.persistent wasn't able to "
+ "get the dictionary from the function passed");
+ return NULL;
+ }
+ else {
+ /* set id */
+ if (*dict_ptr == NULL) {
+ *dict_ptr= PyDict_New();
+ }
+
+ PyDict_SetItemString(*dict_ptr, PERMINENT_CB_ID, Py_None);
+ }
+
+ Py_INCREF(value);
+ return value;
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError,
+ "bpy.app.handlers.persistent expected a function");
+ return NULL;
+ }
+}
+
+/* dummy type because decorators can't be PyCFunctions */
+static PyTypeObject BPyPersistent_Type = {
+
+#if defined(_MSC_VER) || defined(FREE_WINDOWS)
+ PyVarObject_HEAD_INIT(NULL, 0)
+#else
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+#endif
+
+ "persistent", /* tp_name */
+ 0, /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ 0, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_reserved */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
+ Py_TPFLAGS_BASETYPE, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ bpy_app_handlers_persistent_new, /* tp_new */
+ 0, /* tp_free */
+};
+
static PyObject *py_cb_array[BLI_CB_EVT_TOT]= {NULL};
static PyObject *make_app_cb_info(void)
@@ -81,10 +177,13 @@ static PyObject *make_app_cb_info(void)
}
PyStructSequence_SET_ITEM(app_cb_info, pos, (py_cb_array[pos]= PyList_New(0)));
}
- if (app_cb_info_fields[pos].name != NULL) {
+ if (app_cb_info_fields[pos + APP_CB_OTHER_FIELDS].name != NULL) {
Py_FatalError("invalid callback slots 2");
}
+ /* custom function */
+ PyStructSequence_SET_ITEM(app_cb_info, pos++, (PyObject *)&BPyPersistent_Type);
+
return app_cb_info;
}
@@ -92,6 +191,14 @@ PyObject *BPY_app_handlers_struct(void)
{
PyObject *ret;
+#if defined(_MSC_VER) || defined(FREE_WINDOWS)
+ BPyPersistent_Type.ob_base.ob_base.ob_type= &PyType_Type;
+#endif
+
+ if (PyType_Ready(&BPyPersistent_Type) < 0) {
+ BLI_assert(!"error initializing 'bpy.app.handlers.persistent'");
+ }
+
PyStructSequence_InitType(&BlenderAppCbType, &app_cb_info_desc);
ret= make_app_cb_info();
@@ -118,12 +225,46 @@ PyObject *BPY_app_handlers_struct(void)
return ret;
}
-void BPY_app_handlers_reset(void)
+void BPY_app_handlers_reset(const short do_all)
{
int pos= 0;
+ if (do_all) {
for (pos= 0; pos < BLI_CB_EVT_TOT; pos++) {
- PyList_SetSlice(py_cb_array[pos], 0, PY_SSIZE_T_MAX, NULL);
+ /* clear list */
+ PyList_SetSlice(py_cb_array[pos], 0, PY_SSIZE_T_MAX, NULL);
+ }
+ }
+ else {
+ /* save string conversion thrashing */
+ PyObject *perm_id_str= PyUnicode_FromString(PERMINENT_CB_ID);
+
+ for (pos= 0; pos < BLI_CB_EVT_TOT; pos++) {
+ /* clear only items without PERMINENT_CB_ID */
+ PyObject *ls= py_cb_array[pos];
+ Py_ssize_t i;
+
+ PyObject *item;
+ PyObject **dict_ptr;
+
+ for(i= PyList_GET_SIZE(ls) - 1; i >= 0; i--) {
+
+ if ( (PyFunction_Check((item= PyList_GET_ITEM(ls, i)))) &&
+ (dict_ptr= _PyObject_GetDictPtr(item)) &&
+ (*dict_ptr) &&
+ (PyDict_GetItem(*dict_ptr, perm_id_str) != NULL))
+ {
+ /* keep */
+ }
+ else {
+ /* remove */
+ /* PySequence_DelItem(ls, i); */ /* more obvious buw slower */
+ PyList_SetSlice(ls, i, i + 1, NULL);
+ }
+ }
+ }
+
+ Py_DECREF(perm_id_str);
}
}
diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c
index 6f23c1e604f..70a5d79e9ac 100644
--- a/source/blender/python/intern/bpy_operator.c
+++ b/source/blender/python/intern/bpy_operator.c
@@ -380,7 +380,7 @@ static PyObject *pyop_getrna(PyObject *UNUSED(self), PyObject *value)
{
wmOperatorType *ot;
PointerRNA ptr;
- char *opname= _PyUnicode_AsString(value);
+ const char *opname= _PyUnicode_AsString(value);
BPy_StructRNA *pyrna= NULL;
if (opname==NULL) {
@@ -413,7 +413,7 @@ static PyObject *pyop_getinstance(PyObject *UNUSED(self), PyObject *value)
wmOperatorType *ot;
wmOperator *op;
PointerRNA ptr;
- char *opname= _PyUnicode_AsString(value);
+ const char *opname= _PyUnicode_AsString(value);
BPy_StructRNA *pyrna= NULL;
if (opname==NULL) {
diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c
index 4b30b4705f4..cfd2e5556a1 100644
--- a/source/blender/python/intern/bpy_props.c
+++ b/source/blender/python/intern/bpy_props.c
@@ -279,52 +279,60 @@ static int py_long_as_int(PyObject *py_long, int *r_int)
/* this define runs at the start of each function and deals with
* returning a deferred property (to be registered later) */
-#define BPY_PROPDEF_HEAD(_func) \
- if (PyTuple_GET_SIZE(args) == 1) { \
- PyObject *ret; \
- self= PyTuple_GET_ITEM(args, 0); \
- args= PyTuple_New(0); \
- ret= BPy_##_func(self, args, kw); \
- Py_DECREF(args); \
- return ret; \
- } \
- else if (PyTuple_GET_SIZE(args) > 1) { \
- PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \
- return NULL; \
- } \
- srna= srna_from_self(self, #_func"(...):"); \
- if (srna==NULL) { \
- if (PyErr_Occurred()) \
- return NULL; \
- return bpy_prop_deferred_return((void *)pymeth_##_func, kw); \
- } \
+#define BPY_PROPDEF_HEAD(_func) \
+ if (PyTuple_GET_SIZE(args) == 1) { \
+ PyObject *ret; \
+ self= PyTuple_GET_ITEM(args, 0); \
+ args= PyTuple_New(0); \
+ ret= BPy_##_func(self, args, kw); \
+ Py_DECREF(args); \
+ return ret; \
+ } \
+ else if (PyTuple_GET_SIZE(args) > 1) { \
+ PyErr_SetString(PyExc_ValueError, "all args must be keywords"); \
+ return NULL; \
+ } \
+ srna= srna_from_self(self, #_func"(...):"); \
+ if (srna==NULL) { \
+ if (PyErr_Occurred()) \
+ return NULL; \
+ return bpy_prop_deferred_return((void *)pymeth_##_func, kw); \
+ } \
/* terse macros for error checks shared between all funcs cant use function
* calls because of static strins passed to pyrna_set_to_enum_bitfield */
-#define BPY_PROPDEF_CHECK(_func, _property_flag_items) \
- if (id_len >= MAX_IDPROP_NAME) { \
- PyErr_Format(PyExc_TypeError, \
- #_func"(): '%.200s' too long, max length is %d", \
- id, MAX_IDPROP_NAME-1); \
- return NULL; \
- } \
- if (RNA_def_property_free_identifier(srna, id) == -1) { \
- PyErr_Format(PyExc_TypeError, \
- #_func"(): '%s' is defined as a non-dynamic type", \
- id); \
- return NULL; \
- } \
- if (pyopts && pyrna_set_to_enum_bitfield(_property_flag_items, pyopts, &opts, #_func"(options={...}):")) \
- return NULL; \
-
-#define BPY_PROPDEF_SUBTYPE_CHECK(_func, _property_flag_items, _subtype) \
- BPY_PROPDEF_CHECK(_func, _property_flag_items) \
- if (pysubtype && RNA_enum_value_from_id(_subtype, pysubtype, &subtype)==0) { \
- PyErr_Format(PyExc_TypeError, \
- #_func"(subtype='%s'): invalid subtype", \
- pysubtype); \
- return NULL; \
- } \
+#define BPY_PROPDEF_CHECK(_func, _property_flag_items) \
+ if (id_len >= MAX_IDPROP_NAME) { \
+ PyErr_Format(PyExc_TypeError, \
+ #_func"(): '%.200s' too long, max length is %d", \
+ id, MAX_IDPROP_NAME-1); \
+ return NULL; \
+ } \
+ if (RNA_def_property_free_identifier(srna, id) == -1) { \
+ PyErr_Format(PyExc_TypeError, \
+ #_func"(): '%s' is defined as a non-dynamic type", \
+ id); \
+ return NULL; \
+ } \
+ if (pyopts && pyrna_set_to_enum_bitfield(_property_flag_items, \
+ pyopts, \
+ &opts, \
+ #_func"(options={...}):")) \
+ { \
+ return NULL; \
+ } \
+
+#define BPY_PROPDEF_SUBTYPE_CHECK(_func, _property_flag_items, _subtype) \
+ BPY_PROPDEF_CHECK(_func, _property_flag_items) \
+ if (pysubtype && RNA_enum_value_from_id(_subtype, \
+ pysubtype, \
+ &subtype)==0) \
+ { \
+ PyErr_Format(PyExc_TypeError, \
+ #_func"(subtype='%s'): invalid subtype", \
+ pysubtype); \
+ return NULL; \
+ } \
#define BPY_PROPDEF_NAME_DOC \
@@ -1211,7 +1219,7 @@ static StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix
if (!srna) {
if (PyErr_Occurred()) {
PyObject *msg= PyC_ExceptionBuffer();
- char *msg_char= _PyUnicode_AsString(msg);
+ const char *msg_char= _PyUnicode_AsString(msg);
PyErr_Format(PyExc_TypeError,
"%.200s expected an RNA type derived from PropertyGroup, failed with: %s",
error_prefix, msg_char);
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index 1ecbeb4d16a..3411bceda69 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -82,10 +82,10 @@
static PyObject* pyrna_struct_Subtype(PointerRNA *ptr);
static PyObject *pyrna_prop_collection_values(BPy_PropertyRNA *self);
-#define BPY_DOC_ID_PROP_TYPE_NOTE \
-" .. note::\n" \
-"\n" \
-" Only :class:`bpy.types.ID`, :class:`bpy.types.Bone` and \n" \
+#define BPY_DOC_ID_PROP_TYPE_NOTE \
+" .. note::\n" \
+"\n" \
+" Only :class:`bpy.types.ID`, :class:`bpy.types.Bone` and \n" \
" :class:`bpy.types.PoseBone` classes support custom properties.\n"
@@ -6404,17 +6404,19 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
if (item==NULL) {
/* Sneaky workaround to use the class name as the bl_idname */
-#define BPY_REPLACEMENT_STRING(rna_attr, py_attr) \
- if (strcmp(identifier, rna_attr) == 0) { \
- item= PyObject_GetAttrString(py_class, py_attr); \
- if (item && item != Py_None) { \
- if (pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class:") != 0) { \
- Py_DECREF(item); \
- return -1; \
- } \
- } \
- Py_XDECREF(item); \
- } \
+#define BPY_REPLACEMENT_STRING(rna_attr, py_attr) \
+ if (strcmp(identifier, rna_attr) == 0) { \
+ item= PyObject_GetAttrString(py_class, py_attr); \
+ if (item && item != Py_None) { \
+ if (pyrna_py_to_prop(dummyptr, prop, NULL, \
+ item, "validating class:") != 0) \
+ { \
+ Py_DECREF(item); \
+ return -1; \
+ } \
+ } \
+ Py_XDECREF(item); \
+ } \
BPY_REPLACEMENT_STRING("bl_idname", "__name__");
diff --git a/source/blender/python/mathutils/mathutils.c b/source/blender/python/mathutils/mathutils.c
index 770a743b733..41c1568dbde 100644
--- a/source/blender/python/mathutils/mathutils.c
+++ b/source/blender/python/mathutils/mathutils.c
@@ -25,8 +25,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/python/generic/mathutils.c
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils.c
+ * \ingroup pymathutils
*/
#include <Python.h>
diff --git a/source/blender/python/mathutils/mathutils.h b/source/blender/python/mathutils/mathutils.h
index bcea62c8f1c..70b0ef93ebd 100644
--- a/source/blender/python/mathutils/mathutils.h
+++ b/source/blender/python/mathutils/mathutils.h
@@ -26,8 +26,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/python/generic/mathutils.h
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils.h
+ * \ingroup pymathutils
*/
//Include this file for access to vector, quat, matrix, euler, etc...
diff --git a/source/blender/python/mathutils/mathutils_Color.c b/source/blender/python/mathutils/mathutils_Color.c
index a0035e5f34d..c374d0eb73d 100644
--- a/source/blender/python/mathutils/mathutils_Color.c
+++ b/source/blender/python/mathutils/mathutils_Color.c
@@ -21,8 +21,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/python/generic/mathutils_Color.c
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils_Color.c
+ * \ingroup pymathutils
*/
diff --git a/source/blender/python/mathutils/mathutils_Color.h b/source/blender/python/mathutils/mathutils_Color.h
index 231fab511c8..6c84b5f596d 100644
--- a/source/blender/python/mathutils/mathutils_Color.h
+++ b/source/blender/python/mathutils/mathutils_Color.h
@@ -27,8 +27,8 @@
*
*/
-/** \file blender/python/generic/mathutils_Color.h
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils_Color.h
+ * \ingroup pymathutils
*/
diff --git a/source/blender/python/mathutils/mathutils_Euler.c b/source/blender/python/mathutils/mathutils_Euler.c
index 4d44ec8b1e9..ce9ac5fbbb5 100644
--- a/source/blender/python/mathutils/mathutils_Euler.c
+++ b/source/blender/python/mathutils/mathutils_Euler.c
@@ -25,8 +25,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/python/generic/mathutils_Euler.c
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils_Euler.c
+ * \ingroup pymathutils
*/
diff --git a/source/blender/python/mathutils/mathutils_Euler.h b/source/blender/python/mathutils/mathutils_Euler.h
index 0c51a2a1dd8..46f5910f31f 100644
--- a/source/blender/python/mathutils/mathutils_Euler.h
+++ b/source/blender/python/mathutils/mathutils_Euler.h
@@ -27,8 +27,8 @@
*
*/
-/** \file blender/python/generic/mathutils_Euler.h
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils_Euler.h
+ * \ingroup pymathutils
*/
diff --git a/source/blender/python/mathutils/mathutils_Matrix.c b/source/blender/python/mathutils/mathutils_Matrix.c
index 2a5d45bdff0..980dbd17a96 100644
--- a/source/blender/python/mathutils/mathutils_Matrix.c
+++ b/source/blender/python/mathutils/mathutils_Matrix.c
@@ -24,8 +24,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/python/generic/mathutils_Matrix.c
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils_Matrix.c
+ * \ingroup pymathutils
*/
diff --git a/source/blender/python/mathutils/mathutils_Matrix.h b/source/blender/python/mathutils/mathutils_Matrix.h
index 01fae91b1a4..275f4270787 100644
--- a/source/blender/python/mathutils/mathutils_Matrix.h
+++ b/source/blender/python/mathutils/mathutils_Matrix.h
@@ -26,8 +26,8 @@
*
*/
-/** \file blender/python/generic/mathutils_Matrix.h
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils_Matrix.h
+ * \ingroup pymathutils
*/
diff --git a/source/blender/python/mathutils/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c
index 7eb39509e6b..3f0a5d55ec2 100644
--- a/source/blender/python/mathutils/mathutils_Quaternion.c
+++ b/source/blender/python/mathutils/mathutils_Quaternion.c
@@ -24,8 +24,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/python/generic/mathutils_Quaternion.c
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils_Quaternion.c
+ * \ingroup pymathutils
*/
@@ -39,6 +39,7 @@
#define QUAT_SIZE 4
static PyObject *quat__apply_to_copy(PyNoArgsFunction quat_func, QuaternionObject *self);
+static void quat__axis_angle_sanitize(float axis[3], float *angle);
static PyObject *Quaternion_copy(QuaternionObject *self);
//-----------------------------METHODS------------------------------
@@ -141,6 +142,39 @@ static PyObject *Quaternion_to_matrix(QuaternionObject *self)
return newMatrixObject(mat, 3, 3, Py_NEW, NULL);
}
+//----------------------------Quaternion.toMatrix()------------------
+PyDoc_STRVAR(Quaternion_to_axis_angle_doc,
+".. method:: to_axis_angle()\n"
+"\n"
+" Return the axis, angle representation of the quaternion.\n"
+"\n"
+" :return: axis, angle.\n"
+" :rtype: (:class:`Vector`, float) pair\n"
+);
+static PyObject *Quaternion_to_axis_angle(QuaternionObject *self)
+{
+ PyObject *ret;
+
+ float tquat[4];
+
+ float axis[3];
+ float angle;
+
+ if (BaseMath_ReadCallback(self) == -1)
+ return NULL;
+
+ normalize_qt_qt(tquat, self->quat);
+ quat_to_axis_angle(axis, &angle, tquat);
+
+ quat__axis_angle_sanitize(axis, &angle);
+
+ ret= PyTuple_New(2);
+ PyTuple_SET_ITEM(ret, 0, newVectorObject(axis, 3, Py_NEW, NULL));
+ PyTuple_SET_ITEM(ret, 1, PyFloat_FromDouble(angle));
+ return ret;
+}
+
+
//----------------------------Quaternion.cross(other)------------------
PyDoc_STRVAR(Quaternion_cross_doc,
".. method:: cross(other)\n"
@@ -881,12 +915,18 @@ static PyObject *Quaternion_getMagnitude(QuaternionObject *self, void *UNUSED(cl
static PyObject *Quaternion_getAngle(QuaternionObject *self, void *UNUSED(closure))
{
float tquat[4];
+ float angle;
if (BaseMath_ReadCallback(self) == -1)
return NULL;
normalize_qt_qt(tquat, self->quat);
- return PyFloat_FromDouble(2.0f * (saacos(tquat[0])));
+
+ angle= 2.0f * saacos(tquat[0]);
+
+ quat__axis_angle_sanitize(NULL, &angle);
+
+ return PyFloat_FromDouble(angle);
}
static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UNUSED(closure))
@@ -895,7 +935,7 @@ static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UN
float len;
float axis[3], angle_dummy;
- double angle;
+ float angle;
if (BaseMath_ReadCallback(self) == -1)
return -1;
@@ -913,13 +953,7 @@ static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UN
angle= angle_wrap_rad(angle);
- /* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */
- if ( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
- EXPP_FloatsAreEqual(axis[1], 0.0f, 10) &&
- EXPP_FloatsAreEqual(axis[2], 0.0f, 10)
- ) {
- axis[0] = 1.0f;
- }
+ quat__axis_angle_sanitize(axis, &angle);
axis_angle_to_quat(self->quat, axis, angle);
mul_qt_fl(self->quat, len);
@@ -935,21 +969,15 @@ static PyObject *Quaternion_getAxisVec(QuaternionObject *self, void *UNUSED(clos
float tquat[4];
float axis[3];
- float angle;
+ float angle_dummy;
if (BaseMath_ReadCallback(self) == -1)
return NULL;
normalize_qt_qt(tquat, self->quat);
- quat_to_axis_angle(axis, &angle, tquat);
+ quat_to_axis_angle(axis, &angle_dummy, tquat);
- /* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */
- if ( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
- EXPP_FloatsAreEqual(axis[1], 0.0f, 10) &&
- EXPP_FloatsAreEqual(axis[2], 0.0f, 10)
- ) {
- axis[0] = 1.0f;
- }
+ quat__axis_angle_sanitize(axis, NULL);
return (PyObject *) newVectorObject(axis, 3, Py_NEW, NULL);
}
@@ -971,6 +999,8 @@ static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *
if (mathutils_array_parse(axis, 3, 3, value, "quat.axis = other") == -1)
return -1;
+ quat__axis_angle_sanitize(axis, &angle);
+
axis_angle_to_quat(self->quat, axis, angle);
mul_qt_fl(self->quat, len);
@@ -1029,6 +1059,33 @@ static PyObject *quat__apply_to_copy(PyNoArgsFunction quat_func, QuaternionObjec
}
}
+/* axis vector suffers from precission errors, use this function to ensure */
+static void quat__axis_angle_sanitize(float axis[3], float *angle)
+{
+ if (axis) {
+ if ( !finite(axis[0]) ||
+ !finite(axis[1]) ||
+ !finite(axis[2]))
+ {
+ axis[0]= 1.0f;
+ axis[1]= 0.0f;
+ axis[2]= 0.0f;
+ }
+ else if ( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
+ EXPP_FloatsAreEqual(axis[1], 0.0f, 10) &&
+ EXPP_FloatsAreEqual(axis[2], 0.0f, 10)
+ ) {
+ axis[0] = 1.0f;
+ }
+ }
+
+ if (angle) {
+ if (!finite(*angle)) {
+ *angle= 0.0f;
+ }
+ }
+}
+
//-----------------------METHOD DEFINITIONS ----------------------
static struct PyMethodDef Quaternion_methods[] = {
/* in place only */
@@ -1048,6 +1105,7 @@ static struct PyMethodDef Quaternion_methods[] = {
/* return converted representation */
{"to_euler", (PyCFunction) Quaternion_to_euler, METH_VARARGS, Quaternion_to_euler_doc},
{"to_matrix", (PyCFunction) Quaternion_to_matrix, METH_NOARGS, Quaternion_to_matrix_doc},
+ {"to_axis_angle", (PyCFunction) Quaternion_to_axis_angle, METH_NOARGS, Quaternion_to_axis_angle_doc},
/* operation between 2 or more types */
{"cross", (PyCFunction) Quaternion_cross, METH_O, Quaternion_cross_doc},
diff --git a/source/blender/python/mathutils/mathutils_Quaternion.h b/source/blender/python/mathutils/mathutils_Quaternion.h
index c8029d61679..13060ed9ff9 100644
--- a/source/blender/python/mathutils/mathutils_Quaternion.h
+++ b/source/blender/python/mathutils/mathutils_Quaternion.h
@@ -27,8 +27,8 @@
*
*/
-/** \file blender/python/generic/mathutils_Quaternion.h
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils_Quaternion.h
+ * \ingroup pymathutils
*/
diff --git a/source/blender/python/mathutils/mathutils_Vector.c b/source/blender/python/mathutils/mathutils_Vector.c
index a932d8d6b01..ba7cf604c42 100644
--- a/source/blender/python/mathutils/mathutils_Vector.c
+++ b/source/blender/python/mathutils/mathutils_Vector.c
@@ -24,8 +24,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/python/generic/mathutils_Vector.c
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils_Vector.c
+ * \ingroup pymathutils
*/
diff --git a/source/blender/python/mathutils/mathutils_Vector.h b/source/blender/python/mathutils/mathutils_Vector.h
index bd4cd5f5be7..610805fcee0 100644
--- a/source/blender/python/mathutils/mathutils_Vector.h
+++ b/source/blender/python/mathutils/mathutils_Vector.h
@@ -27,8 +27,8 @@
*
*/
-/** \file blender/python/generic/mathutils_Vector.h
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils_Vector.h
+ * \ingroup pymathutils
*/
diff --git a/source/blender/python/mathutils/mathutils_geometry.c b/source/blender/python/mathutils/mathutils_geometry.c
index 6e8624721b7..e8721a3a91d 100644
--- a/source/blender/python/mathutils/mathutils_geometry.c
+++ b/source/blender/python/mathutils/mathutils_geometry.c
@@ -26,8 +26,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/python/generic/mathutils_geometry.c
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils_geometry.c
+ * \ingroup pymathutils
*/
diff --git a/source/blender/python/mathutils/mathutils_geometry.h b/source/blender/python/mathutils/mathutils_geometry.h
index 58a2bf9142f..1b339bdaf00 100644
--- a/source/blender/python/mathutils/mathutils_geometry.h
+++ b/source/blender/python/mathutils/mathutils_geometry.h
@@ -26,8 +26,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/python/generic/mathutils_geometry.h
- * \ingroup pygen
+/** \file blender/python/mathutils/mathutils_geometry.h
+ * \ingroup pymathutils
*/
/*Include this file for access to vector, quat, matrix, euler, etc...*/
diff --git a/source/blender/python/simple_enum_gen.py b/source/blender/python/simple_enum_gen.py
index bc7a2df9fb6..ec2eead522c 100644
--- a/source/blender/python/simple_enum_gen.py
+++ b/source/blender/python/simple_enum_gen.py
@@ -29,11 +29,11 @@ defs = """
SPACE_INFO,
SPACE_SEQ,
SPACE_TEXT,
- SPACE_IMASEL,
- SPACE_SOUND,
+ SPACE_IMASEL, #Deprecated
+ SPACE_SOUND, #Deprecated
SPACE_ACTION,
SPACE_NLA,
- SPACE_SCRIPT,
+ SPACE_SCRIPT, #Deprecated
SPACE_TIME,
SPACE_NODE,
SPACEICONMAX
diff --git a/source/blender/quicktime/apple/qtkit_import.m b/source/blender/quicktime/apple/qtkit_import.m
index 979dd1e3c60..279192e9692 100644
--- a/source/blender/quicktime/apple/qtkit_import.m
+++ b/source/blender/quicktime/apple/qtkit_import.m
@@ -31,7 +31,9 @@
#include "IMB_anim.h"
#include "BLO_sys_types.h"
#include "BKE_global.h"
+
#include "BLI_dynstr.h"
+#include "BLI_path_util.h"
#import <Cocoa/Cocoa.h>
#import <QTKit/QTKit.h>
diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h
index 1326ed495ec..e521479bbcd 100644
--- a/source/blender/render/extern/include/RE_engine.h
+++ b/source/blender/render/extern/include/RE_engine.h
@@ -46,10 +46,18 @@ struct Scene;
/* External Engine */
+/* RenderEngineType.flag */
#define RE_INTERNAL 1
#define RE_GAME 2
#define RE_USE_PREVIEW 4
#define RE_USE_POSTPROCESS 8
+#define RE_USE_SHADING_NODES 16
+
+/* RenderEngine.flag */
+#define RE_ENGINE_ANIMATION 1
+#define RE_ENGINE_PREVIEW 2
+#define RE_ENGINE_DO_DRAW 4
+#define RE_ENGINE_DO_UPDATE 8
extern ListBase R_engines;
@@ -61,17 +69,25 @@ typedef struct RenderEngineType {
char name[64];
int flag;
+ void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Scene *scene);
void (*render)(struct RenderEngine *engine, struct Scene *scene);
+ void (*view_update)(struct RenderEngine *engine, const struct bContext *context);
+ void (*view_draw)(struct RenderEngine *engine, const struct bContext *context);
+
/* RNA integration */
ExtensionRNA ext;
} RenderEngineType;
typedef struct RenderEngine {
RenderEngineType *type;
+ void *py_instance;
+
+ int flag;
struct Render *re;
ListBase fullresult;
+ char *text;
} RenderEngine;
RenderEngine *RE_engine_create(RenderEngineType *type);
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index cbb2f17043c..fac3329bae0 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -249,6 +249,8 @@ float RE_filter_value(int type, float x);
/* vector blur zbuffer method */
void RE_zbuf_accumulate_vecblur(struct NodeBlurData *nbd, int xsize, int ysize, float *newrect, float *imgrect, float *vecbufrect, float *zbufrect);
+int RE_seq_render_active(struct Scene *scene, struct RenderData *rd);
+
/* shaded view or baking options */
#define RE_BAKE_LIGHT 0 /* not listed in rna_scene.c -> can't be enabled! */
#define RE_BAKE_ALL 1
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index aa2dd29814e..7cad8c36df4 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -153,7 +153,9 @@ struct Render
/* values for viewing */
float lens;
+ float sensor_x, sensor_y; /* image sensor size, same variable in camera */
float ycor; /* (scene->xasp / scene->yasp), multiplied with 'winy' */
+ short sensor_fit;
float panophi, panosi, panoco, panodxp, panodxv;
@@ -601,6 +603,7 @@ typedef struct LampRen {
#define R_NEED_TANGENT 16
#define R_BAKE_TRACE 32
#define R_BAKING 64
+#define R_ANIMATION 128
/* vlakren->flag (vlak = face in dutch) char!!! */
#define R_SMOOTH 1
diff --git a/source/blender/render/intern/include/texture.h b/source/blender/render/intern/include/texture.h
index d7d0a7e086d..a8d13077680 100644
--- a/source/blender/render/intern/include/texture.h
+++ b/source/blender/render/intern/include/texture.h
@@ -36,21 +36,26 @@
#ifndef TEXTURE_EXT_H
#define TEXTURE_EXT_H
-#define BRICONT texres->tin= (texres->tin-0.5f)*tex->contrast+tex->bright-0.5f; \
-if(texres->tin<0.0f) texres->tin= 0.0f; else if(texres->tin>1.0f) texres->tin= 1.0f;
+#define BRICONT \
+ texres->tin= (texres->tin-0.5f) * tex->contrast+tex->bright-0.5f; \
+ if(texres->tin < 0.0f) texres->tin= 0.0f; \
+ else if(texres->tin > 1.0f) texres->tin= 1.0f; \
-#define BRICONTRGB texres->tr= tex->rfac*((texres->tr-0.5f)*tex->contrast+tex->bright-0.5f); \
-if(texres->tr<0.0f) texres->tr= 0.0f; \
-texres->tg= tex->gfac*((texres->tg-0.5f)*tex->contrast+tex->bright-0.5f); \
-if(texres->tg<0.0f) texres->tg= 0.0f; \
-texres->tb= tex->bfac*((texres->tb-0.5f)*tex->contrast+tex->bright-0.5f); \
-if(texres->tb<0.0f) texres->tb= 0.0f; \
-if(tex->saturation != 1.0f) { \
- float _hsv[3]; \
- rgb_to_hsv(texres->tr, texres->tg, texres->tb, _hsv, _hsv+1, _hsv+2); \
- _hsv[1] *= tex->saturation; \
- hsv_to_rgb(_hsv[0], _hsv[1], _hsv[2], &texres->tr, &texres->tg, &texres->tb); \
-} \
+#define BRICONTRGB \
+ texres->tr= tex->rfac*((texres->tr-0.5f)*tex->contrast+tex->bright-0.5f); \
+ if(texres->tr<0.0f) texres->tr= 0.0f; \
+ texres->tg= tex->gfac*((texres->tg-0.5f)*tex->contrast+tex->bright-0.5f); \
+ if(texres->tg<0.0f) texres->tg= 0.0f; \
+ texres->tb= tex->bfac*((texres->tb-0.5f)*tex->contrast+tex->bright-0.5f); \
+ if(texres->tb<0.0f) texres->tb= 0.0f; \
+ if(tex->saturation != 1.0f) { \
+ float _hsv[3]; \
+ rgb_to_hsv(texres->tr, texres->tg, texres->tb, \
+ _hsv, _hsv+1, _hsv+2); \
+ _hsv[1] *= tex->saturation; \
+ hsv_to_rgb(_hsv[0], _hsv[1], _hsv[2], \
+ &texres->tr, &texres->tg, &texres->tb); \
+ } \
#define RGBTOBW(r,g,b) ( r*0.35f + g*0.45f + b*0.2f ) /* keep this in sync with gpu_shader_material.glsl:rgbtobw */
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index e6ecfa0b9e2..4c210d34284 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -2391,7 +2391,7 @@ static void do_displacement(Render *re, ObjectRen *obr, float mat[][4], float im
/* Object Size with parenting */
obt=obr->ob;
while(obt){
- add_v3_v3v3(temp, obt->size, obt->dsize);
+ mul_v3_v3v3(temp, obt->size, obt->dsize);
scale[0]*=temp[0]; scale[1]*=temp[1]; scale[2]*=temp[2];
obt=obt->parent;
}
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index e285b9b1ed9..2f20c328405 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -157,6 +157,7 @@ static Render *envmap_render_copy(Render *re, EnvMap *env)
/* view stuff in env render */
envre->lens= 16.0f;
+ envre->sensor_x= 32.0f;
if(env->type==ENV_PLANE)
envre->lens*= env->viewscale;
envre->ycor= 1.0f;
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index a4d1e502f13..b7f89e260a8 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -26,7 +26,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/render/intern/pipeline/engine.c
+/** \file blender/render/intern/source/external_engine.c
* \ingroup render
*/
@@ -61,7 +61,7 @@
static RenderEngineType internal_render_type = {
NULL, NULL,
"BLENDER_RENDER", "Blender Render", RE_INTERNAL,
- NULL,
+ NULL, NULL, NULL, NULL,
{NULL, NULL, NULL}};
#ifdef WITH_GAMEENGINE
@@ -69,7 +69,7 @@ static RenderEngineType internal_render_type = {
static RenderEngineType internal_game_type = {
NULL, NULL,
"BLENDER_GAME", "Blender Game", RE_INTERNAL|RE_GAME,
- NULL,
+ NULL, NULL, NULL, NULL,
{NULL, NULL, NULL}};
#endif
@@ -125,6 +125,15 @@ RenderEngine *RE_engine_create(RenderEngineType *type)
void RE_engine_free(RenderEngine *engine)
{
+#ifdef WITH_PYTHON
+ if(engine->py_instance) {
+ BPY_DECREF(engine->py_instance);
+ }
+#endif
+
+ if(engine->text)
+ MEM_freeN(engine->text);
+
MEM_freeN(engine);
}
@@ -216,6 +225,19 @@ void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char
re->i.infostr= NULL;
re->i.statstr= NULL;
}
+
+ /* set engine text */
+ if(engine->text) {
+ MEM_freeN(engine->text);
+ engine->text= NULL;
+ }
+
+ if(stats && stats[0] && info && info[0])
+ engine->text= BLI_sprintfN("%s | %s", stats, info);
+ else if(info && info[0])
+ engine->text= BLI_strdup(info);
+ else if(stats && stats[0])
+ engine->text= BLI_strdup(stats);
}
void RE_engine_update_progress(RenderEngine *engine, float progress)
@@ -265,11 +287,18 @@ int RE_engine_render(Render *re, int do_all)
engine = RE_engine_create(type);
engine->re= re;
+ if(re->flag & R_ANIMATION)
+ engine->flag |= RE_ENGINE_ANIMATION;
+ if(re->r.scemode & R_PREVIEWBUTS)
+ engine->flag |= RE_ENGINE_PREVIEW;
+
if((re->r.scemode & (R_NO_FRAME_UPDATE|R_PREVIEWBUTS))==0)
scene_update_for_newframe(re->main, re->scene, re->lay);
- type->render(engine, re->scene);
-
+ if(type->update)
+ type->update(engine, re->main, re->scene);
+ if(type->render)
+ type->render(engine, re->scene);
free_render_result(&engine->fullresult, engine->fullresult.first);
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c
index da935d0415d..f8e4ee8f6a7 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -451,14 +451,14 @@ struct Object *RE_GetCamera(Render *re)
}
/* call this after InitState() */
-/* per render, there's one persistant viewplane. Parts will set their own viewplanes */
+/* per render, there's one persistent viewplane. Parts will set their own viewplanes */
void RE_SetCamera(Render *re, Object *camera)
{
object_camera_mode(&re->r, camera);
object_camera_matrix(&re->r, camera, re->winx, re->winy, re->flag & R_SEC_FIELD,
re->winmat, &re->viewplane, &re->clipsta, &re->clipend,
- &re->lens, &re->ycor, &re->viewdx, &re->viewdy);
+ &re->lens, &re->sensor_x, &re->sensor_y, &re->sensor_fit, &re->ycor, &re->viewdx, &re->viewdy);
}
void RE_SetPixelSize(Render *re, float pixsize)
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 64b36c1fd12..de5d037675e 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -2517,14 +2517,14 @@ static void renderresult_stampinfo(Render *re)
RE_ReleaseResultImage(re);
}
-static int seq_render_active(Render *re)
+int RE_seq_render_active(Scene *scene, RenderData *rd)
{
Editing *ed;
Sequence *seq;
- ed = re->scene->ed;
+ ed = scene->ed;
- if (!(re->r.scemode & R_DOSEQ) || !ed || !ed->seqbase.first)
+ if (!(rd->scemode & R_DOSEQ) || !ed || !ed->seqbase.first)
return 0;
for (seq= ed->seqbase.first; seq; seq= seq->next) {
@@ -2632,6 +2632,12 @@ static void do_render_seq(Render * re)
/* just in case this flag went missing at some point */
re->r.scemode |= R_DOSEQ;
+
+ /* set overall progress of sequence rendering */
+ if(re->r.efra!=re->r.sfra)
+ re->progress(re->prh, (float)(cfra-re->r.sfra) / (re->r.efra-re->r.sfra));
+ else
+ re->progress(re->prh, 1.0f);
}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -2649,7 +2655,7 @@ static void do_render_all_options(Render *re)
if(RE_engine_render(re, 1)) {
/* in this case external render overrides all */
}
- else if(seq_render_active(re)) {
+ else if(RE_seq_render_active(re->scene, &re->r)) {
/* note: do_render_seq() frees rect32 when sequencer returns float images */
if(!re->test_break(re->tbh))
do_render_seq(re);
@@ -3085,6 +3091,8 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
/* is also set by caller renderwin.c */
G.rendering= 1;
+ re->flag |= R_ANIMATION;
+
if(BKE_imtype_is_movie(scene->r.imtype))
if(!mh->start_movie(scene, &re->r, re->rectx, re->recty, re->reports))
G.afbreek= 1;
@@ -3193,6 +3201,8 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri
scene->r.cfra= cfrao;
+ re->flag &= ~R_ANIMATION;
+
/* UGLY WARNING */
G.rendering= 0;
}
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index a4bf6c6b5e1..274fa4469e0 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -2156,7 +2156,7 @@ static int isb_add_samples(RenderPart *pa, ISBBranch *root, MemArena *memarena,
int xi, yi, *xcos, *ycos;
int sample, bsp_err= 0;
- /* bsp split doesn't like to handle regular sequenes */
+ /* bsp split doesn't like to handle regular sequences */
xcos= MEM_mallocN( pa->rectx*sizeof(int), "xcos");
ycos= MEM_mallocN( pa->recty*sizeof(int), "ycos");
for(xi=0; xi<pa->rectx; xi++)
@@ -2301,7 +2301,7 @@ static void isb_make_buffer(RenderPart *pa, LampRen *lar)
isb_bsp_fillfaces(&R, lar, &root); /* shb->persmat should have been calculated */
- /* copy shadow samples to persistant buffer, reduce memory overhead */
+ /* copy shadow samples to persistent buffer, reduce memory overhead */
if(R.osa) {
ISBShadfacA **isbsa= isbdata->shadfaca= MEM_callocN(pa->rectx*pa->recty*sizeof(void *), "isb shadfacs");
@@ -2360,7 +2360,7 @@ static int isb_add_samples_transp(RenderPart *pa, ISBBranch *root, MemArena *mem
int xi, yi, *xcos, *ycos;
int sample, bsp_err= 0;
- /* bsp split doesn't like to handle regular sequenes */
+ /* bsp split doesn't like to handle regular sequences */
xcos= MEM_mallocN( pa->rectx*sizeof(int), "xcos");
ycos= MEM_mallocN( pa->recty*sizeof(int), "ycos");
for(xi=0; xi<pa->rectx; xi++)
@@ -2505,7 +2505,7 @@ static void isb_make_buffer_transp(RenderPart *pa, APixstr *apixbuf, LampRen *la
/* go over all faces and fill in shadow values */
isb_bsp_fillfaces(&R, lar, &root); /* shb->persmat should have been calculated */
- /* copy shadow samples to persistant buffer, reduce memory overhead */
+ /* copy shadow samples to persistent buffer, reduce memory overhead */
isbsa= isbdata->shadfaca= MEM_callocN(pa->rectx*pa->recty*sizeof(void *), "isb shadfacs");
isbdata->memarena = BLI_memarena_new(0x8000 * sizeof(ISBSampleA), "isb arena");
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index 8261198ef78..389049d9e59 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -55,6 +55,8 @@
#include "GPU_draw.h"
#include "GPU_extensions.h"
+#include "RE_engine.h"
+
#include "WM_api.h"
#include "WM_types.h"
#include "wm.h"
@@ -113,6 +115,19 @@ static int wm_area_test_invalid_backbuf(ScrArea *sa)
return 1;
}
+static void wm_region_test_render_do_draw(ScrArea *sa, ARegion *ar)
+{
+ if(sa->spacetype == SPACE_VIEW3D) {
+ RegionView3D *rv3d = ar->regiondata;
+ RenderEngine *engine = (rv3d)? rv3d->render_engine: NULL;
+
+ if(engine && (engine->flag & RE_ENGINE_DO_DRAW)) {
+ ar->do_draw = 1;
+ engine->flag &= ~RE_ENGINE_DO_DRAW;
+ }
+ }
+}
+
/********************** draw all **************************/
/* - reference method, draw all each time */
@@ -205,7 +220,7 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange)
for(sa= screen->areabase.first; sa; sa= sa->next)
for(ar= sa->regionbase.first; ar; ar= ar->next)
if(ar->swinid && !wm_area_test_invalid_backbuf(sa))
- ED_region_tag_redraw(ar);
+ ED_region_tag_redraw(ar);
/* flush overlapping regions */
if(screen->regionbase.first) {
@@ -662,13 +677,28 @@ static int wm_draw_update_test_window(wmWindow *win)
{
ScrArea *sa;
ARegion *ar;
+ int do_draw= 0;
for(ar= win->screen->regionbase.first; ar; ar= ar->next) {
if(ar->do_draw_overlay) {
wm_tag_redraw_overlay(win, ar);
ar->do_draw_overlay= 0;
}
+ if(ar->swinid && ar->do_draw)
+ do_draw= 1;
+ }
+
+ for(sa= win->screen->areabase.first; sa; sa= sa->next) {
+ for(ar=sa->regionbase.first; ar; ar= ar->next) {
+ wm_region_test_render_do_draw(sa, ar);
+
+ if(ar->swinid && ar->do_draw)
+ do_draw = 1;
+ }
}
+
+ if(do_draw)
+ return 1;
if(win->screen->do_refresh)
return 1;
@@ -681,15 +711,6 @@ static int wm_draw_update_test_window(wmWindow *win)
if(win->screen->do_draw_drag)
return 1;
- for(ar= win->screen->regionbase.first; ar; ar= ar->next)
- if(ar->swinid && ar->do_draw)
- return 1;
-
- for(sa= win->screen->areabase.first; sa; sa= sa->next)
- for(ar=sa->regionbase.first; ar; ar= ar->next)
- if(ar->swinid && ar->do_draw)
- return 1;
-
return 0;
}
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 65e65450167..03b0d637de1 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -59,6 +59,7 @@
#include "ED_fileselect.h"
#include "ED_info.h"
+#include "ED_render.h"
#include "ED_screen.h"
#include "ED_view3d.h"
#include "ED_util.h"
@@ -311,6 +312,7 @@ void wm_event_do_notifiers(bContext *C)
/* XXX make lock in future, or separated derivedmesh users in scene */
if(!G.rendering) {
/* depsgraph & animation: update tagged datablocks */
+ Main *bmain = CTX_data_main(C);
/* copied to set's in scene_update_tagged_recursive() */
win->screen->scene->customdata_mask= win_combine_v3d_datamask;
@@ -318,7 +320,11 @@ void wm_event_do_notifiers(bContext *C)
/* XXX, hack so operators can enforce datamasks [#26482], gl render */
win->screen->scene->customdata_mask |= win->screen->scene->customdata_mask_modal;
- scene_update_tagged(CTX_data_main(C), win->screen->scene);
+ scene_update_tagged(bmain, win->screen->scene);
+
+ ED_render_engine_update_tagged(C, bmain);
+
+ scene_clear_tagged(bmain, win->screen->scene);
}
}
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index 2bd3ed34b69..83e4681251f 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -359,7 +359,7 @@ void WM_read_file(bContext *C, const char *filepath, ReportList *reports)
BLI_exec_cb(CTX_data_main(C), NULL, BLI_CB_EVT_LOAD_PRE);
/* first try to append data from exotic file formats... */
- /* it throws error box when file doesnt exist and returns -1 */
+ /* it throws error box when file doesn't exist and returns -1 */
/* note; it should set some error message somewhere... (ton) */
retval= wm_read_exotic(CTX_data_scene(C), filepath);
@@ -368,7 +368,7 @@ void WM_read_file(bContext *C, const char *filepath, ReportList *reports)
int G_f= G.f;
ListBase wmbase;
- /* put aside screens to match with persistant windows later */
+ /* put aside screens to match with persistent windows later */
/* also exit screens and editors */
wm_window_match_init(C, &wmbase);
@@ -408,7 +408,7 @@ void WM_read_file(bContext *C, const char *filepath, ReportList *reports)
#ifdef WITH_PYTHON
/* run any texts that were loaded in and flagged as modules */
BPY_driver_reset();
- BPY_app_handlers_reset();
+ BPY_app_handlers_reset(FALSE);
BPY_modules_load_user(C);
#endif
@@ -480,7 +480,7 @@ int WM_read_homefile(bContext *C, ReportList *UNUSED(reports), short from_memory
/* prevent loading no UI */
G.fileflags &= ~G_FILE_NO_UI;
- /* put aside screens to match with persistant windows later */
+ /* put aside screens to match with persistent windows later */
wm_window_match_init(C, &wmbase);
if (!from_memory && BLI_exists(tstr)) {
@@ -538,7 +538,7 @@ int WM_read_homefile(bContext *C, ReportList *UNUSED(reports), short from_memory
BPY_string_exec(C, "__import__('addon_utils').reset_all()");
BPY_driver_reset();
- BPY_app_handlers_reset();
+ BPY_app_handlers_reset(FALSE);
BPY_modules_load_user(C);
}
#endif
@@ -576,7 +576,7 @@ void WM_read_history(void)
G.recent_files.first = G.recent_files.last = NULL;
- /* read list of recent opend files from recent-files.txt to memory */
+ /* read list of recent opened files from recent-files.txt to memory */
for (l= lines, num= 0; l && (num<U.recent_files); l= l->next) {
line = l->link;
if (line[0] && BLI_exists(line)) {
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index b0be4bb9720..0795bc8deee 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -61,8 +61,9 @@
#include "BKE_sequencer.h" /* free seq clipboard */
#include "BKE_material.h" /* clear_matcopybuf */
-#include "BLI_blenlib.h"
-#include "BLI_winstuff.h"
+#include "BLI_listbase.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
#include "RE_engine.h"
#include "RE_pipeline.h" /* RE_ free stuff */
@@ -158,7 +159,7 @@ void WM_init(bContext *C, int argc, const char **argv)
BPY_python_start(argc, argv);
BPY_driver_reset();
- BPY_app_handlers_reset(); /* causes addon callbacks to be freed [#28068],
+ BPY_app_handlers_reset(FALSE); /* causes addon callbacks to be freed [#28068],
* but this is actually what we want. */
BPY_modules_load_user(C);
#else
@@ -211,24 +212,6 @@ void WM_init_splash(bContext *C)
}
}
-static ScrArea *biggest_view3d(bContext *C)
-{
- bScreen *sc= CTX_wm_screen(C);
- ScrArea *sa, *big= NULL;
- int size, maxsize= 0;
-
- for(sa= sc->areabase.first; sa; sa= sa->next) {
- if(sa->spacetype==SPACE_VIEW3D) {
- size= sa->winx * sa->winy;
- if(size > maxsize) {
- maxsize= size;
- big= sa;
- }
- }
- }
- return big;
-}
-
int WM_init_game(bContext *C)
{
wmWindowManager *wm= CTX_wm_manager(C);
@@ -251,7 +234,7 @@ int WM_init_game(bContext *C)
if(win)
CTX_wm_window_set(C, win);
- sa = biggest_view3d(C);
+ sa = BKE_screen_find_big_area(CTX_wm_screen(C), SPACE_VIEW3D, 0);
ar= BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
// if we have a valid 3D view
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index acd5df79982..933066513e2 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -3450,6 +3450,28 @@ static void WM_OT_memory_statistics(wmOperatorType *ot)
ot->exec= memory_statistics_exec;
}
+/* ************************** memory statistics for testing ***************** */
+
+static int dependency_relations_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+ Object *ob= CTX_data_active_object(C);
+
+ DAG_print_dependencies(bmain, scene, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+static void WM_OT_dependency_relations(wmOperatorType *ot)
+{
+ ot->name= "Dependency Relations";
+ ot->idname= "WM_OT_dependency_relations";
+ ot->description= "Print dependency graph relations to the console";
+
+ ot->exec= dependency_relations_exec;
+}
+
/* ******************************************************* */
static int wm_ndof_sensitivity_exec(bContext *UNUSED(C), wmOperator *op)
@@ -3532,6 +3554,7 @@ void wm_operatortype_init(void)
WM_operatortype_append(WM_OT_save_mainfile);
WM_operatortype_append(WM_OT_redraw_timer);
WM_operatortype_append(WM_OT_memory_statistics);
+ WM_operatortype_append(WM_OT_dependency_relations);
WM_operatortype_append(WM_OT_debug_menu);
WM_operatortype_append(WM_OT_splash);
WM_operatortype_append(WM_OT_search_menu);
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index d9a3fcc77c3..174c24b819e 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -72,6 +72,7 @@ struct Object;
struct PBVHNode;
struct Render;
struct RenderEngine;
+struct RenderEngineType;
struct RenderLayer;
struct RenderResult;
struct ScrArea;
@@ -199,6 +200,7 @@ struct ImBuf *ED_space_image_buffer(struct SpaceImage *sima){return (struct ImBu
void ED_screen_set_scene(struct bContext *C, struct Scene *scene){}
void ED_area_tag_redraw_regiontype(struct ScrArea *sa, int regiontype){}
+void ED_render_engine_changed(struct Main *bmain) {}
struct PTCacheEdit *PE_get_current(struct Scene *scene, struct Object *ob){return (struct PTCacheEdit *) NULL;}
void PE_current_changed(struct Scene *scene, struct Object *ob){}
@@ -392,6 +394,7 @@ void RE_engines_exit() {}
void RE_engine_report(struct RenderEngine *engine, int type, const char *msg) {}
ListBase R_engines = {NULL, NULL};
void RE_engine_free(struct RenderEngine *engine) {}
+struct RenderEngineType *RE_engines_find(const char *idname) { return NULL; }
/* python */
struct wmOperatorType *WM_operatortype_find(const char *idname, int quiet){return (struct wmOperatorType *) NULL;}
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 1d083af7d07..39ea82f141f 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -141,7 +141,9 @@ static int print_version(int argc, const char **argv, void *data);
extern int pluginapi_force_ref(void); /* from blenpluginapi:pluginapi.c */
-#define BLEND_VERSION_STRING_FMT "Blender %d.%02d (sub %d)\n", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION
+#define BLEND_VERSION_STRING_FMT \
+ "Blender %d.%02d (sub %d)\n", \
+ BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION \
/* Initialize callbacks for the modules that need them */
static void setCallbacks(void);
@@ -850,22 +852,23 @@ static int set_skip_frame(int argc, const char **argv, void *data)
/* macro for ugly context setup/reset */
#ifdef WITH_PYTHON
-#define BPY_CTX_SETUP(_cmd) \
-{ \
- wmWindowManager *wm= CTX_wm_manager(C); \
- wmWindow *prevwin= CTX_wm_window(C); \
- Scene *prevscene= CTX_data_scene(C); \
- if(wm->windows.first) { \
- CTX_wm_window_set(C, wm->windows.first); \
- _cmd; \
- CTX_wm_window_set(C, prevwin); \
- } \
- else { \
- fprintf(stderr, "Python script \"%s\" running with missing context data.\n", argv[1]); \
- _cmd; \
- } \
- CTX_data_scene_set(C, prevscene); \
-} \
+#define BPY_CTX_SETUP(_cmd) \
+{ \
+ wmWindowManager *wm= CTX_wm_manager(C); \
+ wmWindow *prevwin= CTX_wm_window(C); \
+ Scene *prevscene= CTX_data_scene(C); \
+ if(wm->windows.first) { \
+ CTX_wm_window_set(C, wm->windows.first); \
+ _cmd; \
+ CTX_wm_window_set(C, prevwin); \
+ } \
+ else { \
+ fprintf(stderr, "Python script \"%s\" " \
+ "running with missing context data.\n", argv[1]); \
+ _cmd; \
+ } \
+ CTX_data_scene_set(C, prevscene); \
+} \
#endif /* WITH_PYTHON */
@@ -971,7 +974,7 @@ static int load_file(int UNUSED(argc), const char **argv, void *data)
#ifdef WITH_PYTHON
/* run any texts that were loaded in and flagged as modules */
BPY_driver_reset();
- BPY_app_handlers_reset();
+ BPY_app_handlers_reset(FALSE);
BPY_modules_load_user(C);
#endif
diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp
index 6f2ca28c135..a6d02db8cea 100644
--- a/source/gameengine/Converter/BL_ActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ActionActuator.cpp
@@ -344,8 +344,9 @@ bool BL_ActionActuator::Update(double curtime, bool frame)
/* Python functions */
/* ------------------------------------------------------------------------- */
-PyObject* BL_ActionActuator::PyGetChannel(PyObject* value) {
- char *string= _PyUnicode_AsString(value);
+PyObject* BL_ActionActuator::PyGetChannel(PyObject* value)
+{
+ const char *string= _PyUnicode_AsString(value);
if (!string) {
PyErr_SetString(PyExc_TypeError, "expected a single string");
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index 77bd6e0f374..57611d65e14 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -1579,7 +1579,7 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
my_get_local_bounds(blenderobject,dm,objprop.m_boundobject.box.m_center,bb.m_extends);
if (blenderobject->gameflag & OB_BOUNDS)
{
- switch (blenderobject->boundtype)
+ switch (blenderobject->collision_boundtype)
{
case OB_BOUND_BOX:
objprop.m_boundclass = KX_BOUNDBOX;
@@ -1648,7 +1648,7 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
}
- objprop.m_concave = (blenderobject->boundtype & 4) != 0;
+ objprop.m_concave = (blenderobject->collision_boundtype == OB_BOUND_TRIANGLE_MESH);
switch (physics_engine)
{
@@ -1724,7 +1724,7 @@ static KX_LightObject *gamelight_from_blamp(Object *ob, Lamp *la, unsigned int l
static KX_Camera *gamecamera_from_bcamera(Object *ob, KX_Scene *kxscene, KX_BlenderSceneConverter *converter) {
Camera* ca = static_cast<Camera*>(ob->data);
- RAS_CameraData camdata(ca->lens, ca->ortho_scale, ca->clipsta, ca->clipend, ca->type == CAM_PERSP, ca->YF_dofdist);
+ RAS_CameraData camdata(ca->lens, ca->ortho_scale, ca->sensor_x, ca->sensor_y, ca->sensor_fit, ca->clipsta, ca->clipend, ca->type == CAM_PERSP, ca->YF_dofdist);
KX_Camera *gamecamera;
gamecamera= new KX_Camera(kxscene, KX_Scene::m_callbacks, camdata);
diff --git a/source/gameengine/Expressions/ListValue.cpp b/source/gameengine/Expressions/ListValue.cpp
index ade54f6d924..cdd87235fd2 100644
--- a/source/gameengine/Expressions/ListValue.cpp
+++ b/source/gameengine/Expressions/ListValue.cpp
@@ -339,10 +339,9 @@ PyObject* listvalue_mapping_subscript(PyObject* self, PyObject* pyindex)
int index = PyLong_AsSsize_t(pyindex);
return listvalue_buffer_item(self, index); /* wont add a ref */
}
-
- PyObject *pyindex_str = PyObject_Repr(pyindex); /* new ref */
- PyErr_Format(PyExc_KeyError, "CList[key]: '%s' key not in list", _PyUnicode_AsString(pyindex_str));
- Py_DECREF(pyindex_str);
+
+ PyErr_Format(PyExc_KeyError,
+ "CList[key]: '%R' key not in list", pyindex);
return NULL;
}
diff --git a/source/gameengine/Expressions/PyObjectPlus.cpp b/source/gameengine/Expressions/PyObjectPlus.cpp
index 33aa6b8d177..87f776a726e 100644
--- a/source/gameengine/Expressions/PyObjectPlus.cpp
+++ b/source/gameengine/Expressions/PyObjectPlus.cpp
@@ -1012,8 +1012,8 @@ int PyObjectPlus::py_set_attrdef(PyObject *self_py, PyObject *value, const PyAtt
{
if (PyUnicode_Check(value))
{
- Py_ssize_t val_len;
- char *val = _PyUnicode_AsStringAndSize(value, &val_len);
+ Py_ssize_t val_size;
+ const char *val = _PyUnicode_AsStringAndSize(value, &val_size);
strncpy(ptr, val, attrdef->m_size);
ptr[attrdef->m_size-1] = 0;
}
@@ -1030,7 +1030,7 @@ int PyObjectPlus::py_set_attrdef(PyObject *self_py, PyObject *value, const PyAtt
if (PyUnicode_Check(value))
{
Py_ssize_t val_len;
- char *val = _PyUnicode_AsStringAndSize(value, &val_len);
+ const char *val = _PyUnicode_AsStringAndSize(value, &val_len); /* XXX, should be 'const' but we do a silly trick to have a shorter string */
if (attrdef->m_clamp)
{
if (val_len < attrdef->m_imin)
@@ -1042,10 +1042,8 @@ int PyObjectPlus::py_set_attrdef(PyObject *self_py, PyObject *value, const PyAtt
else if (val_len > attrdef->m_imax)
{
// trim the string
- char c = val[attrdef->m_imax];
- val[attrdef->m_imax] = 0;
- *var = val;
- val[attrdef->m_imax] = c;
+ var->SetLength(attrdef->m_imax);
+ memcpy(var->Ptr(), val, attrdef->m_imax - 1);
break;
}
} else if (val_len < attrdef->m_imin || val_len > attrdef->m_imax)
diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h
index 7ee4760c48d..f7bd1b91466 100644
--- a/source/gameengine/Expressions/PyObjectPlus.h
+++ b/source/gameengine/Expressions/PyObjectPlus.h
@@ -69,26 +69,27 @@ typedef struct {
void *link;
} WarnLink;
-#define ShowDeprecationWarning(old_way, new_way) \
-{ \
- static WarnLink wlink = {false, NULL}; \
- if ((m_ignore_deprecation_warnings || wlink.warn_done)==0) \
- { \
- ShowDeprecationWarning_func(old_way, new_way); \
- \
- WarnLink *wlink_last= GetDeprecationWarningLinkLast(); \
- wlink.warn_done = true; \
- wlink.link = NULL; \
- \
- if(wlink_last) { \
- wlink_last->link= (void *)&(wlink); \
- SetDeprecationWarningLinkLast(&(wlink)); \
- } else { \
- SetDeprecationWarningFirst(&(wlink)); \
- SetDeprecationWarningLinkLast(&(wlink)); \
- } \
- } \
-} \
+#define ShowDeprecationWarning(old_way, new_way) \
+{ \
+ static WarnLink wlink = {false, NULL}; \
+ if ((m_ignore_deprecation_warnings || wlink.warn_done)==0) \
+ { \
+ ShowDeprecationWarning_func(old_way, new_way); \
+ \
+ WarnLink *wlink_last= GetDeprecationWarningLinkLast(); \
+ wlink.warn_done = true; \
+ wlink.link = NULL; \
+ \
+ if(wlink_last) { \
+ wlink_last->link= (void *)&(wlink); \
+ SetDeprecationWarningLinkLast(&(wlink)); \
+ } \
+ else { \
+ SetDeprecationWarningFirst(&(wlink)); \
+ SetDeprecationWarningLinkLast(&(wlink)); \
+ } \
+ } \
+} \
diff --git a/source/gameengine/Expressions/StringValue.h b/source/gameengine/Expressions/StringValue.h
index d0f74a6eed8..e5a892ff82d 100644
--- a/source/gameengine/Expressions/StringValue.h
+++ b/source/gameengine/Expressions/StringValue.h
@@ -31,8 +31,7 @@ public:
CStringValue();
CStringValue (const char *txt, const char *name , AllocationTYPE alloctype = CValue::HEAPVALUE);
- virtual ~CStringValue() {
- };
+ virtual ~CStringValue() {}
/// CValue implementation
virtual bool IsEqual(const STR_String & other);
virtual const STR_String & GetText();
@@ -40,7 +39,7 @@ public:
virtual CValue* Calc(VALUE_OPERATOR op, CValue *val);
virtual CValue* CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val);
- virtual void SetValue(CValue* newval) { m_strString = newval->GetText(); SetModified(true); };
+ virtual void SetValue(CValue* newval) { m_strString = newval->GetText(); SetModified(true); }
virtual CValue* GetReplica();
#ifdef WITH_PYTHON
virtual PyObject* ConvertValueToPython() {
diff --git a/source/gameengine/GameLogic/SCA_PythonController.cpp b/source/gameengine/GameLogic/SCA_PythonController.cpp
index 303b3e9529e..d69358928e6 100644
--- a/source/gameengine/GameLogic/SCA_PythonController.cpp
+++ b/source/gameengine/GameLogic/SCA_PythonController.cpp
@@ -199,7 +199,7 @@ SCA_IActuator* SCA_PythonController::LinkedActuatorFromPy(PyObject *value)
if (PyUnicode_Check(value)) {
/* get the actuator from the name */
- char *name= _PyUnicode_AsString(value);
+ const char *name= _PyUnicode_AsString(value);
for(it = lacts.begin(); it!= lacts.end(); ++it) {
if( name == (*it)->GetName() ) {
return *it;
@@ -214,12 +214,11 @@ SCA_IActuator* SCA_PythonController::LinkedActuatorFromPy(PyObject *value)
}
}
}
-
+
/* set the exception */
- PyObject *value_str = PyObject_Repr(value); /* new ref */
- PyErr_Format(PyExc_ValueError, "'%s' not in this python controllers actuator list", _PyUnicode_AsString(value_str));
- Py_DECREF(value_str);
-
+ PyErr_Format(PyExc_ValueError,
+ "%R not in this python controllers actuator list", value);
+
return NULL;
}
@@ -500,7 +499,7 @@ int SCA_PythonController::pyattr_set_script(void *self_v, const KX_PYATTRIBUTE_D
{
SCA_PythonController* self= static_cast<SCA_PythonController*>(self_v);
- char *scriptArg = _PyUnicode_AsString(value);
+ const char *scriptArg = _PyUnicode_AsString(value);
if (scriptArg==NULL) {
PyErr_SetString(PyExc_TypeError, "controller.script = string: Python Controller, expected a string script text");
diff --git a/source/gameengine/Ketsji/KX_Camera.cpp b/source/gameengine/Ketsji/KX_Camera.cpp
index 3b777031831..14a307794db 100644
--- a/source/gameengine/Ketsji/KX_Camera.cpp
+++ b/source/gameengine/Ketsji/KX_Camera.cpp
@@ -200,7 +200,26 @@ float KX_Camera::GetScale() const
return m_camdata.m_scale;
}
+/*
+* Gets the horizontal size of the sensor - for camera matching.
+*/
+float KX_Camera::GetSensorWidth() const
+{
+ return m_camdata.m_sensor_x;
+}
+/*
+* Gets the vertical size of the sensor - for camera matching.
+*/
+float KX_Camera::GetSensorHeight() const
+{
+ return m_camdata.m_sensor_y;
+}
+/** Gets the mode FOV is calculating from sensor dimensions */
+short KX_Camera::GetSensorFit() const
+{
+ return m_camdata.m_sensor_fit;
+}
float KX_Camera::GetCameraNear() const
{
@@ -883,7 +902,9 @@ bool ConvertPythonToCamera(PyObject * value, KX_Camera **object, bool py_none_ok
if (*object) {
return true;
} else {
- PyErr_Format(PyExc_ValueError, "%s, requested name \"%s\" did not match any KX_Camera in this scene", error_prefix, _PyUnicode_AsString(value));
+ PyErr_Format(PyExc_ValueError,
+ "%s, requested name \"%s\" did not match any KX_Camera in this scene",
+ error_prefix, _PyUnicode_AsString(value));
return false;
}
}
diff --git a/source/gameengine/Ketsji/KX_Camera.h b/source/gameengine/Ketsji/KX_Camera.h
index 4c8cf21a7bf..236e914b9e5 100644
--- a/source/gameengine/Ketsji/KX_Camera.h
+++ b/source/gameengine/Ketsji/KX_Camera.h
@@ -199,6 +199,12 @@ public:
float GetLens() const;
/** Gets the ortho scale. */
float GetScale() const;
+ /** Gets the horizontal size of the sensor - for camera matching */
+ float GetSensorWidth() const;
+ /** Gets the vertical size of the sensor - for camera matching */
+ float GetSensorHeight() const;
+ /** Gets the mode FOV is calculating from sensor dimensions */
+ short GetSensorFit() const;
/** Gets the near clip distance. */
float GetCameraNear() const;
/** Gets the far clip distance. */
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index 5de6adc5af4..a9be588e6b2 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -1251,6 +1251,7 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
cam->GetScale(),
nearfrust,
farfrust,
+ cam->GetSensorFit(),
frustum
);
if (!cam->GetViewport()) {
@@ -1268,6 +1269,9 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
area,
viewport,
cam->GetLens(),
+ cam->GetSensorWidth(),
+ cam->GetSensorHeight(),
+ cam->GetSensorFit(),
nearfrust,
farfrust,
frustum
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h
index 40f157ef0a4..5a02da07e43 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.h
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h
@@ -387,8 +387,7 @@ public:
void SetUseOverrideFrameColor(bool overrideFrameColor);
/**
- * Enables/disables the use of the framing bar color of the Blender file's scenes.
- * @param useSceneFrameColor The new setting.
+ * Check if the frame color is being overridden.
*/
bool GetUseOverrideFrameColor(void) const;
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 25145e87b78..02e6ebea71b 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -705,7 +705,7 @@ static PyObject *gLibNew(PyObject*, PyObject* args)
KX_Scene *kx_scene= gp_KetsjiScene;
char *path;
char *group;
- char *name;
+ const char *name;
PyObject *names;
int idcode;
@@ -815,7 +815,7 @@ static struct PyMethodDef game_methods[] = {
{"getAverageFrameRate", (PyCFunction) gPyGetAverageFrameRate, METH_NOARGS, (const char *)"Gets the estimated average frame rate"},
{"getBlendFileList", (PyCFunction)gPyGetBlendFileList, METH_VARARGS, (const char *)"Gets a list of blend files in the same directory as the current blend file"},
{"PrintGLInfo", (PyCFunction)pyPrintExt, METH_NOARGS, (const char *)"Prints GL Extension Info"},
- {"PrintMemInfo", (PyCFunction)pyPrintStats, METH_NOARGS, (const char *)"Print engine stastics"},
+ {"PrintMemInfo", (PyCFunction)pyPrintStats, METH_NOARGS, (const char *)"Print engine statistics"},
/* library functions */
{"LibLoad", (PyCFunction)gLibLoad, METH_VARARGS|METH_KEYWORDS, (const char *)""},
diff --git a/source/gameengine/Ketsji/KX_PythonSeq.cpp b/source/gameengine/Ketsji/KX_PythonSeq.cpp
index 7d7dc39ba32..430dcdbd153 100644
--- a/source/gameengine/Ketsji/KX_PythonSeq.cpp
+++ b/source/gameengine/Ketsji/KX_PythonSeq.cpp
@@ -189,7 +189,7 @@ static PyObject *KX_PythonSeq_getIndex(PyObject* self, int index)
return NULL;
}
-static PyObjectPlus * KX_PythonSeq_subscript__internal(PyObject *self, char *key)
+static PyObjectPlus * KX_PythonSeq_subscript__internal(PyObject *self, const char *key)
{
PyObjectPlus *self_plus= BGE_PROXY_REF(((KX_PythonSeq *)self)->base);
@@ -277,7 +277,7 @@ static PyObject * KX_PythonSeq_subscript(PyObject * self, PyObject *key)
return KX_PythonSeq_getIndex(self, PyLong_AsSsize_t( key ));
}
else if ( PyUnicode_Check(key) ) {
- char *name = _PyUnicode_AsString(key);
+ const char *name = _PyUnicode_AsString(key);
PyObjectPlus *ret = KX_PythonSeq_subscript__internal(self, name);
if(ret) {
diff --git a/source/gameengine/Ketsji/KX_PythonSeq.h b/source/gameengine/Ketsji/KX_PythonSeq.h
index 6e9cf9a36aa..1c2d2869be0 100644
--- a/source/gameengine/Ketsji/KX_PythonSeq.h
+++ b/source/gameengine/Ketsji/KX_PythonSeq.h
@@ -51,8 +51,8 @@ enum KX_PYGENSEQ_TYPE {
/* The Main PyType Object defined in Main.c */
extern PyTypeObject KX_PythonSeq_Type;
-#define BPy_KX_PythonSeq_Check(v) \
- ((v)->ob_type == &KX_PythonSeq_Type)
+#define BPy_KX_PythonSeq_Check(obj) \
+ (Py_TYPE(obj) == &KX_PythonSeq_Type)
typedef struct {
PyObject_VAR_HEAD
diff --git a/source/gameengine/Rasterizer/RAS_CameraData.h b/source/gameengine/Rasterizer/RAS_CameraData.h
index 2056068a2ad..2120a18f139 100644
--- a/source/gameengine/Rasterizer/RAS_CameraData.h
+++ b/source/gameengine/Rasterizer/RAS_CameraData.h
@@ -36,6 +36,9 @@ struct RAS_CameraData
{
float m_lens;
float m_scale;
+ float m_sensor_x;
+ float m_sensor_y;
+ short m_sensor_fit;
float m_clipstart;
float m_clipend;
bool m_perspective;
@@ -46,11 +49,15 @@ struct RAS_CameraData
int m_viewporttop;
float m_focallength;
- RAS_CameraData(float lens = 35.0, float scale = 6.0, float clipstart = 0.1, float clipend = 5000.0, bool perspective = true,
+ RAS_CameraData(float lens = 35.0, float scale = 6.0, float sensor_x = 32.0, float sensor_y = 18.0, short sensor_fit = 0,
+ float clipstart = 0.1, float clipend = 5000.0, bool perspective = true,
float focallength = 3.0, bool viewport = false, int viewportleft = 0, int viewportbottom = 0,
int viewportright = 0, int viewporttop = 0) :
m_lens(lens),
m_scale(scale),
+ m_sensor_x(sensor_x),
+ m_sensor_y(sensor_y),
+ m_sensor_fit(sensor_fit),
m_clipstart(clipstart),
m_clipend(clipend),
m_perspective(perspective),
diff --git a/source/gameengine/Rasterizer/RAS_FramingManager.cpp b/source/gameengine/Rasterizer/RAS_FramingManager.cpp
index da6c230ffc1..8a5c10b3a3b 100644
--- a/source/gameengine/Rasterizer/RAS_FramingManager.cpp
+++ b/source/gameengine/Rasterizer/RAS_FramingManager.cpp
@@ -39,25 +39,35 @@ ComputeDefaultFrustum(
const float camnear,
const float camfar,
const float lens,
+ const float sensor_x, const float sensor_y,
+ const short sensor_fit,
const float design_aspect_ratio,
RAS_FrameFrustum & frustum
-){
-
- /*
- * Magic Blender calculation.
- * Blender does not give a Field of View as lens but a size
- * at 16 units away from the lens.
- */
- float halfSize = 16.f * camnear / lens;
+){
+ float halfSize;
float sizeX;
float sizeY;
- if (design_aspect_ratio > 1.f) {
- // halfsize defines the width
+ if(sensor_fit==RAS_SENSORFIT_AUTO) {
+ halfSize = (sensor_x / 2.f) * camnear / lens;
+
+ if (design_aspect_ratio > 1.f) {
+ // halfsize defines the width
+ sizeX = halfSize;
+ sizeY = halfSize/design_aspect_ratio;
+ } else {
+ // halfsize defines the height
+ sizeX = halfSize * design_aspect_ratio;
+ sizeY = halfSize;
+ }
+ }
+ else if(sensor_fit==RAS_SENSORFIT_HOR) {
+ halfSize = (sensor_x / 2.f) * camnear / lens;
sizeX = halfSize;
sizeY = halfSize/design_aspect_ratio;
- } else {
- // halfsize defines the height
+ }
+ else {
+ halfSize = (sensor_y / 2.f) * camnear / lens;
sizeX = halfSize * design_aspect_ratio;
sizeY = halfSize;
}
@@ -77,6 +87,7 @@ ComputeDefaultOrtho(
const float camfar,
const float scale,
const float design_aspect_ratio,
+ const short sensor_fit,
RAS_FrameFrustum & frustum
)
{
@@ -84,12 +95,22 @@ ComputeDefaultOrtho(
float sizeX;
float sizeY;
- if (design_aspect_ratio > 1.f) {
- // halfsize defines the width
+ if(sensor_fit==RAS_SENSORFIT_AUTO) {
+ if (design_aspect_ratio > 1.f) {
+ // halfsize defines the width
+ sizeX = halfSize;
+ sizeY = halfSize/design_aspect_ratio;
+ } else {
+ // halfsize defines the height
+ sizeX = halfSize * design_aspect_ratio;
+ sizeY = halfSize;
+ }
+ }
+ else if(sensor_fit==RAS_SENSORFIT_HOR) {
sizeX = halfSize;
sizeY = halfSize/design_aspect_ratio;
- } else {
- // halfsize defines the height
+ }
+ else {
sizeX = halfSize * design_aspect_ratio;
sizeY = halfSize;
}
@@ -199,6 +220,7 @@ ComputeFrustum(
const RAS_Rect &availableViewport,
const RAS_Rect &viewport,
const float lens,
+ const float sensor_x, const float sensor_y, const short sensor_fit,
const float camnear,
const float camfar,
RAS_FrameFrustum &frustum
@@ -224,6 +246,9 @@ ComputeFrustum(
camnear,
camfar,
lens,
+ sensor_x,
+ sensor_y,
+ sensor_fit,
design_aspect_ratio,
frustum
);
@@ -269,6 +294,7 @@ RAS_FramingManager::
const float scale,
const float camnear,
const float camfar,
+ const short sensor_fit,
RAS_FrameFrustum &frustum
)
{
@@ -293,6 +319,7 @@ RAS_FramingManager::
camfar,
scale,
design_aspect_ratio,
+ sensor_fit,
frustum
);
diff --git a/source/gameengine/Rasterizer/RAS_FramingManager.h b/source/gameengine/Rasterizer/RAS_FramingManager.h
index 38ea8f4e07a..612142234e3 100644
--- a/source/gameengine/Rasterizer/RAS_FramingManager.h
+++ b/source/gameengine/Rasterizer/RAS_FramingManager.h
@@ -184,6 +184,14 @@ enum RAS_CullingMode
RAS_CULLING_NONE
};
+/* Should match CAMERA_SENSOR_FIT... from DNA_camera_types.h */
+enum RAS_SensorFit
+{
+ RAS_SENSORFIT_AUTO = 0,
+ RAS_SENSORFIT_HOR,
+ RAS_SENSORFIT_VERT
+};
+
/**
* @section RAS_FramingManager
* This class helps to compute a view frustum
@@ -229,6 +237,7 @@ public :
const float scale,
const float camnear,
const float camfar,
+ const short sensor_fit,
RAS_FrameFrustum &frustum
);
@@ -239,6 +248,7 @@ public :
const RAS_Rect &availableViewport,
const RAS_Rect &viewport,
const float lens,
+ const float sensor_x, const float sensor_y, const short sensor_fit,
const float camnear,
const float camfar,
RAS_FrameFrustum &frustum
@@ -250,6 +260,8 @@ public :
const float camnear,
const float camfar,
const float lens,
+ const float sensor_x, const float sensor_y,
+ const short sensor_fit,
const float design_aspect_ratio,
RAS_FrameFrustum & frustum
);
@@ -261,6 +273,7 @@ public :
const float camfar,
const float scale,
const float design_aspect_ratio,
+ const short sensor_fit,
RAS_FrameFrustum & frustum
);
diff --git a/source/gameengine/VideoTexture/BlendType.h b/source/gameengine/VideoTexture/BlendType.h
index 4d63031a363..fad23af922e 100644
--- a/source/gameengine/VideoTexture/BlendType.h
+++ b/source/gameengine/VideoTexture/BlendType.h
@@ -43,15 +43,15 @@ public:
if (m_objType == NULL)
{
// compare names of type
- if (strcmp(obj->ob_type->tp_name, m_name) == 0)
+ if (strcmp(Py_TYPE(obj)->tp_name, m_name) == 0)
// if name of type match, save pointer to type
- m_objType = obj->ob_type;
+ m_objType = Py_TYPE(obj);
else
// if names of type don't match, return NULL
return NULL;
}
// if pointer to type is set and don't match to type of provided object, return NULL
- else if (obj->ob_type != m_objType)
+ else if (Py_TYPE(obj) != m_objType)
return NULL;
// return pointer to object, this class can only be used for KX object =>
// the Py object is actually a proxy
diff --git a/source/gameengine/VideoTexture/FilterBase.cpp b/source/gameengine/VideoTexture/FilterBase.cpp
index 28e36cf80e0..6fa249ff00a 100644
--- a/source/gameengine/VideoTexture/FilterBase.cpp
+++ b/source/gameengine/VideoTexture/FilterBase.cpp
@@ -141,7 +141,7 @@ int Filter_setPrevious (PyFilter * self, PyObject * value, void * closure)
if (self->m_filter != NULL)
{
// check new value
- if (value == NULL || !pyFilterTypes.in(value->ob_type))
+ if (value == NULL || !pyFilterTypes.in(Py_TYPE(value)))
{
// report value error
PyErr_SetString(PyExc_TypeError, "Invalid type of value");
diff --git a/source/gameengine/VideoTexture/ImageBase.cpp b/source/gameengine/VideoTexture/ImageBase.cpp
index 0fe71dd8024..b1d77d8807f 100644
--- a/source/gameengine/VideoTexture/ImageBase.cpp
+++ b/source/gameengine/VideoTexture/ImageBase.cpp
@@ -567,7 +567,7 @@ PyObject * Image_setSource (PyImage * self, PyObject * args)
if (self->m_image != NULL)
{
// check type of object
- if (pyImageTypes.in(obj->ob_type))
+ if (pyImageTypes.in(Py_TYPE(obj)))
{
// convert to image struct
PyImage * img = reinterpret_cast<PyImage*>(obj);
@@ -619,7 +619,7 @@ int Image_setFilter (PyImage * self, PyObject * value, void * closure)
if (self->m_image != NULL)
{
// check new value
- if (value == NULL || !pyFilterTypes.in(value->ob_type))
+ if (value == NULL || !pyFilterTypes.in(Py_TYPE(value)))
{
// report value error
PyErr_SetString(PyExc_TypeError, "Invalid type of value");
diff --git a/source/gameengine/VideoTexture/ImageRender.cpp b/source/gameengine/VideoTexture/ImageRender.cpp
index 912d5864560..a349b45e403 100644
--- a/source/gameengine/VideoTexture/ImageRender.cpp
+++ b/source/gameengine/VideoTexture/ImageRender.cpp
@@ -214,6 +214,8 @@ void ImageRender::Render()
} else
{
float lens = m_camera->GetLens();
+ float sensor_x = m_camera->GetSensorWidth();
+ float sensor_y = m_camera->GetSensorHeight();
bool orthographic = !m_camera->GetCameraData()->m_perspective;
float nearfrust = m_camera->GetCameraNear();
float farfrust = m_camera->GetCameraFar();
@@ -233,6 +235,7 @@ void ImageRender::Render()
farfrust,
m_camera->GetScale(),
aspect_ratio,
+ m_camera->GetSensorFit(),
frustrum
);
@@ -244,6 +247,9 @@ void ImageRender::Render()
nearfrust,
farfrust,
lens,
+ sensor_x,
+ sensor_y,
+ RAS_SENSORFIT_AUTO,
aspect_ratio,
frustrum);
diff --git a/source/gameengine/VideoTexture/Texture.cpp b/source/gameengine/VideoTexture/Texture.cpp
index ba9922d455f..e1ddd7fce1e 100644
--- a/source/gameengine/VideoTexture/Texture.cpp
+++ b/source/gameengine/VideoTexture/Texture.cpp
@@ -171,7 +171,7 @@ void Texture_dealloc (Texture * self)
// release scaled image buffer
delete [] self->m_scaledImg;
// release object
- ((PyObject *)self)->ob_type->tp_free((PyObject*)self);
+ Py_TYPE((PyObject *)self)->tp_free((PyObject*)self);
}
@@ -410,7 +410,7 @@ PyObject * Texture_getSource (Texture * self, PyObject * value, void * closure)
int Texture_setSource (Texture * self, PyObject * value, void * closure)
{
// check new value
- if (value == NULL || !pyImageTypes.in(value->ob_type))
+ if (value == NULL || !pyImageTypes.in(Py_TYPE(value)))
{
// report value error
PyErr_SetString(PyExc_TypeError, "Invalid type of value");
diff --git a/source/gameengine/VideoTexture/blendVideoTex.cpp b/source/gameengine/VideoTexture/blendVideoTex.cpp
index c93fadada77..abfd0ed49b7 100644
--- a/source/gameengine/VideoTexture/blendVideoTex.cpp
+++ b/source/gameengine/VideoTexture/blendVideoTex.cpp
@@ -91,7 +91,7 @@ static PyObject * imageToArray (PyObject * self, PyObject *args)
// parameter is Image object
PyObject * pyImg;
char *mode = NULL;
- if (!PyArg_ParseTuple(args, "O|s:imageToArray", &pyImg, &mode) || !pyImageTypes.in(pyImg->ob_type))
+ if (!PyArg_ParseTuple(args, "O|s:imageToArray", &pyImg, &mode) || !pyImageTypes.in(Py_TYPE(pyImg)))
{
// if object is incorect, report error
PyErr_SetString(PyExc_TypeError, "VideoTexture.imageToArray(image): The value must be a image source object");