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
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/alembic/intern/abc_exporter.cc2
-rw-r--r--source/blender/alembic/intern/abc_exporter.h2
-rw-r--r--source/blender/alembic/intern/abc_hair.cc2
-rw-r--r--source/blender/alembic/intern/abc_mesh.cc3
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h18
-rw-r--r--source/blender/blenkernel/BKE_blender_version.h2
-rw-r--r--source/blender/blenkernel/BKE_bmfont.h61
-rw-r--r--source/blender/blenkernel/BKE_context.h6
-rw-r--r--source/blender/blenkernel/BKE_editmesh.h8
-rw-r--r--source/blender/blenkernel/BKE_editmesh_cache.h (renamed from source/blender/blenkernel/BKE_bmfont_types.h)44
-rw-r--r--source/blender/blenkernel/BKE_gpencil.h3
-rw-r--r--source/blender/blenkernel/BKE_mesh.h10
-rw-r--r--source/blender/blenkernel/BKE_mesh_runtime.h4
-rw-r--r--source/blender/blenkernel/BKE_modifier.h45
-rw-r--r--source/blender/blenkernel/BKE_object.h2
-rw-r--r--source/blender/blenkernel/BKE_paint.h1
-rw-r--r--source/blender/blenkernel/BKE_particle.h6
-rw-r--r--source/blender/blenkernel/BKE_screen.h2
-rw-r--r--source/blender/blenkernel/CMakeLists.txt5
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c668
-rw-r--r--source/blender/blenkernel/intern/armature.c7
-rw-r--r--source/blender/blenkernel/intern/bmfont.c293
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c2
-rw-r--r--source/blender/blenkernel/intern/crazyspace.c46
-rw-r--r--source/blender/blenkernel/intern/editderivedmesh.c1008
-rw-r--r--source/blender/blenkernel/intern/editmesh.c16
-rw-r--r--source/blender/blenkernel/intern/editmesh_cache.c120
-rw-r--r--source/blender/blenkernel/intern/font.c2
-rw-r--r--source/blender/blenkernel/intern/gpencil.c23
-rw-r--r--source/blender/blenkernel/intern/image.c4
-rw-r--r--source/blender/blenkernel/intern/library.c3
-rw-r--r--source/blender/blenkernel/intern/mesh.c32
-rw-r--r--source/blender/blenkernel/intern/mesh_convert.c29
-rw-r--r--source/blender/blenkernel/intern/mesh_evaluate.c29
-rw-r--r--source/blender/blenkernel/intern/mesh_iterators.c116
-rw-r--r--source/blender/blenkernel/intern/modifier.c183
-rw-r--r--source/blender/blenkernel/intern/multires_reshape.c2
-rw-r--r--source/blender/blenkernel/intern/object.c14
-rw-r--r--source/blender/blenkernel/intern/object_dupli.c4
-rw-r--r--source/blender/blenkernel/intern/paint.c10
-rw-r--r--source/blender/blenkernel/intern/particle.c4
-rw-r--r--source/blender/blenkernel/intern/smoke.c3
-rw-r--r--source/blender/blenlib/BLI_link_utils.h9
-rw-r--r--source/blender/blenlib/intern/path_util.c4
-rw-r--r--source/blender/blenloader/intern/readfile.c3
-rw-r--r--source/blender/blenloader/intern/versioning_userdef.c8
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh_conv.c149
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh_conv.h5
-rw-r--r--source/blender/bmesh/operators/bmo_subdivide.c39
-rw-r--r--source/blender/collada/AnimationImporter.h11
-rw-r--r--source/blender/collada/ArmatureExporter.cpp2
-rw-r--r--source/blender/collada/ArmatureImporter.cpp6
-rw-r--r--source/blender/collada/ControllerExporter.cpp2
-rw-r--r--source/blender/collada/GeometryExporter.cpp4
-rw-r--r--source/blender/collada/GeometryExporter.h2
-rw-r--r--source/blender/collada/collada_utils.cpp2
-rw-r--r--source/blender/compositor/intern/COM_NodeOperation.cpp2
-rw-r--r--source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp2
-rwxr-xr-xsource/blender/datatoc/datatoc_icon_split.py1
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc4
-rw-r--r--source/blender/draw/CMakeLists.txt4
-rw-r--r--source/blender/draw/engines/basic/basic_engine.c6
-rw-r--r--source/blender/draw/engines/eevee/eevee_engine.c2
-rw-r--r--source/blender/draw/engines/eevee/eevee_lights.c6
-rw-r--r--source/blender/draw/engines/eevee/eevee_materials.c178
-rw-r--r--source/blender/draw/engines/eevee/eevee_render.c11
-rw-r--r--source/blender/draw/engines/eevee/eevee_volumes.c7
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl3
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c27
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_draw_utils.c31
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_engine.c2
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_engine.h5
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_render.c2
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_shader_fx.c290
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl3
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl68
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl46
-rw-r--r--source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl3
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl64
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl8
-rw-r--r--source/blender/draw/engines/workbench/workbench_deferred.c4
-rw-r--r--source/blender/draw/engines/workbench/workbench_forward.c4
-rw-r--r--source/blender/draw/engines/workbench/workbench_volume.c87
-rw-r--r--source/blender/draw/intern/DRW_render.h16
-rw-r--r--source/blender/draw/intern/draw_cache.c4
-rw-r--r--source/blender/draw/intern/draw_cache.h3
-rw-r--r--source/blender/draw/intern/draw_cache_impl.h9
-rw-r--r--source/blender/draw/intern/draw_cache_impl_mesh.c1379
-rw-r--r--source/blender/draw/intern/draw_debug.c4
-rw-r--r--source/blender/draw/intern/draw_manager.c31
-rw-r--r--source/blender/draw/intern/draw_manager.h8
-rw-r--r--source/blender/draw/intern/draw_manager_data.c46
-rw-r--r--source/blender/draw/intern/draw_manager_exec.c14
-rw-r--r--source/blender/draw/intern/draw_view.c4
-rw-r--r--source/blender/draw/modes/edit_mesh_mode.c76
-rw-r--r--source/blender/draw/modes/object_mode.c14
-rw-r--r--source/blender/draw/modes/overlay_mode.c10
-rw-r--r--source/blender/draw/modes/paint_weight_mode.c2
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl6
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl6
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl46
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl20
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl53
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl52
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl41
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl89
-rw-r--r--source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl16
-rw-r--r--source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl34
-rw-r--r--source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl96
-rw-r--r--source/blender/draw/modes/shaders/paint_weight_frag.glsl72
-rw-r--r--source/blender/editors/animation/keyframes_draw.c17
-rw-r--r--source/blender/editors/armature/armature_add.c6
-rw-r--r--source/blender/editors/armature/armature_edit.c70
-rw-r--r--source/blender/editors/armature/armature_naming.c6
-rw-r--r--source/blender/editors/armature/armature_select.c164
-rw-r--r--source/blender/editors/armature/pose_edit.c130
-rw-r--r--source/blender/editors/armature/pose_select.c49
-rw-r--r--source/blender/editors/datafiles/CMakeLists.txt165
-rw-r--r--source/blender/editors/gizmo_library/gizmo_library_utils.c3
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c2
-rw-r--r--source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c6
-rw-r--r--source/blender/editors/gpencil/annotate_draw.c52
-rw-r--r--source/blender/editors/gpencil/annotate_paint.c30
-rw-r--r--source/blender/editors/gpencil/drawgpencil.c131
-rw-r--r--source/blender/editors/gpencil/gpencil_brush.c13
-rw-r--r--source/blender/editors/gpencil/gpencil_convert.c116
-rw-r--r--source/blender/editors/gpencil/gpencil_data.c27
-rw-r--r--source/blender/editors/gpencil/gpencil_edit.c12
-rw-r--r--source/blender/editors/gpencil/gpencil_fill.c53
-rw-r--r--source/blender/editors/gpencil/gpencil_intern.h15
-rw-r--r--source/blender/editors/gpencil/gpencil_ops.c4
-rw-r--r--source/blender/editors/gpencil/gpencil_paint.c82
-rw-r--r--source/blender/editors/gpencil/gpencil_utils.c40
-rw-r--r--source/blender/editors/include/ED_view3d.h1
-rw-r--r--source/blender/editors/include/UI_icons.h909
-rw-r--r--source/blender/editors/include/UI_interface.h2
-rw-r--r--source/blender/editors/include/UI_resources.h21
-rw-r--r--source/blender/editors/interface/interface.c5
-rw-r--r--source/blender/editors/interface/interface_draw.c36
-rw-r--r--source/blender/editors/interface/interface_handlers.c66
-rw-r--r--source/blender/editors/interface/interface_icons.c76
-rw-r--r--source/blender/editors/interface/interface_layout.c2
-rw-r--r--source/blender/editors/interface/interface_panel.c14
-rw-r--r--source/blender/editors/interface/interface_region_popover.c14
-rw-r--r--source/blender/editors/interface/interface_region_search.c5
-rw-r--r--source/blender/editors/interface/interface_style.c5
-rw-r--r--source/blender/editors/interface/interface_templates.c62
-rw-r--r--source/blender/editors/interface/interface_widgets.c27
-rw-r--r--source/blender/editors/interface/resources.c36
-rw-r--r--source/blender/editors/interface/view2d.c44
-rw-r--r--source/blender/editors/mesh/editmesh_knife_project.c2
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c14
-rw-r--r--source/blender/editors/metaball/mball_edit.c1
-rw-r--r--source/blender/editors/object/object_add.c37
-rw-r--r--source/blender/editors/object/object_bake_api.c2
-rw-r--r--source/blender/editors/object/object_edit.c2
-rw-r--r--source/blender/editors/object/object_modifier.c50
-rw-r--r--source/blender/editors/screen/area.c16
-rw-r--r--source/blender/editors/screen/glutil.c8
-rw-r--r--source/blender/editors/sculpt_paint/paint_cursor.c16
-rw-r--r--source/blender/editors/sculpt_paint/paint_utils.c11
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c6
-rw-r--r--source/blender/editors/space_buttons/buttons_texture.c2
-rw-r--r--source/blender/editors/space_buttons/space_buttons.c1
-rw-r--r--source/blender/editors/space_clip/clip_dopesheet_draw.c6
-rw-r--r--source/blender/editors/space_clip/clip_draw.c8
-rw-r--r--source/blender/editors/space_file/file_draw.c12
-rw-r--r--source/blender/editors/space_file/filelist.h18
-rw-r--r--source/blender/editors/space_graph/graph_buttons.c4
-rw-r--r--source/blender/editors/space_graph/graph_draw.c16
-rw-r--r--source/blender/editors/space_node/drawnode.c16
-rw-r--r--source/blender/editors/space_node/node_buttons.c4
-rw-r--r--source/blender/editors/space_node/node_draw.c2
-rw-r--r--source/blender/editors/space_outliner/outliner_draw.c17
-rw-r--r--source/blender/editors/space_sequencer/sequencer_draw.c32
-rw-r--r--source/blender/editors/space_view3d/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_view3d/drawvolume.c853
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c14
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c11
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_empty.c3
-rw-r--r--source/blender/editors/space_view3d/view3d_iterators.c23
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c7
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c6
-rw-r--r--source/blender/editors/transform/transform_snap_object.c83
-rw-r--r--source/blender/editors/util/ed_transverts.c5
-rw-r--r--source/blender/freestyle/intern/application/AppCanvas.h2
-rw-r--r--source/blender/freestyle/intern/application/AppConfig.h2
-rw-r--r--source/blender/freestyle/intern/application/Controller.cpp10
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp2
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h2
-rw-r--r--source/blender/freestyle/intern/geometry/Grid.h5
-rw-r--r--source/blender/freestyle/intern/geometry/SweepLine.h2
-rw-r--r--source/blender/freestyle/intern/image/ImagePyramid.cpp2
-rw-r--r--source/blender/freestyle/intern/python/BPy_Convert.h90
-rw-r--r--source/blender/freestyle/intern/python/BPy_IntegrationType.cpp2
-rw-r--r--source/blender/freestyle/intern/python/BPy_Interface1D.cpp8
-rw-r--r--source/blender/freestyle/intern/python/BPy_SShape.cpp2
-rw-r--r--source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp8
-rw-r--r--source/blender/freestyle/intern/scene_graph/NodeCamera.h4
-rw-r--r--source/blender/freestyle/intern/view_map/Interface0D.cpp10
-rw-r--r--source/blender/gpu/CMakeLists.txt6
-rw-r--r--source/blender/gpu/GPU_draw.h1
-rw-r--r--source/blender/gpu/GPU_immediate.h50
-rw-r--r--source/blender/gpu/GPU_shader.h5
-rw-r--r--source/blender/gpu/GPU_shader_interface.h1
-rw-r--r--source/blender/gpu/GPU_vertex_format.h3
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c12
-rw-r--r--source/blender/gpu/intern/gpu_codegen.h2
-rw-r--r--source/blender/gpu/intern/gpu_draw.c297
-rw-r--r--source/blender/gpu/intern/gpu_immediate.c128
-rw-r--r--source/blender/gpu/intern/gpu_immediate_util.c30
-rw-r--r--source/blender/gpu/intern/gpu_material.c1
-rw-r--r--source/blender/gpu/intern/gpu_shader.c17
-rw-r--r--source/blender/gpu/intern/gpu_shader_interface.c1
-rw-r--r--source/blender/gpu/intern/gpu_texture.c5
-rw-r--r--source/blender/gpu/intern/gpu_vertex_format.c111
-rw-r--r--source/blender/gpu/shaders/gpu_shader_fire_frag.glsl15
-rw-r--r--source/blender/gpu/shaders/gpu_shader_smoke_frag.glsl47
-rw-r--r--source/blender/gpu/shaders/gpu_shader_smoke_vert.glsl15
-rw-r--r--source/blender/imbuf/IMB_imbuf_types.h2
-rw-r--r--source/blender/imbuf/intern/allocimbuf.c8
-rw-r--r--source/blender/imbuf/intern/dds/BlockDXT.cpp4
-rw-r--r--source/blender/imbuf/intern/dds/ColorBlock.h4
-rw-r--r--source/blender/imbuf/intern/dds/Image.cpp6
-rw-r--r--source/blender/imbuf/intern/dds/Image.h10
-rw-r--r--source/blender/makesdna/DNA_gpencil_types.h3
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h10
-rw-r--r--source/blender/makesdna/DNA_meshdata_types.h2
-rw-r--r--source/blender/makesdna/DNA_screen_types.h1
-rw-r--r--source/blender/makesdna/DNA_shader_fx_types.h22
-rw-r--r--source/blender/makesdna/DNA_smoke_types.h3
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h13
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h9
-rw-r--r--source/blender/makesrna/RNA_access.h3
-rw-r--r--source/blender/makesrna/intern/rna_ID.c4
-rw-r--r--source/blender/makesrna/intern/rna_access.c2
-rw-r--r--source/blender/makesrna/intern/rna_action.c2
-rw-r--r--source/blender/makesrna/intern/rna_brush.c37
-rw-r--r--source/blender/makesrna/intern/rna_color.c2
-rw-r--r--source/blender/makesrna/intern/rna_constraint.c54
-rw-r--r--source/blender/makesrna/intern/rna_curve.c24
-rw-r--r--source/blender/makesrna/intern/rna_gpencil.c14
-rw-r--r--source/blender/makesrna/intern/rna_internal.h2
-rw-r--r--source/blender/makesrna/intern/rna_key.c2
-rw-r--r--source/blender/makesrna/intern/rna_main_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_material.c2
-rw-r--r--source/blender/makesrna/intern/rna_mesh.c893
-rw-r--r--source/blender/makesrna/intern/rna_mesh_api.c16
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c106
-rw-r--r--source/blender/makesrna/intern/rna_object_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_scene.c45
-rw-r--r--source/blender/makesrna/intern/rna_screen.c2
-rw-r--r--source/blender/makesrna/intern/rna_sculpt_paint.c16
-rw-r--r--source/blender/makesrna/intern/rna_shader_fx.c68
-rw-r--r--source/blender/makesrna/intern/rna_space.c51
-rw-r--r--source/blender/makesrna/intern/rna_ui.c4
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c9
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c48
-rw-r--r--source/blender/makesrna/intern/rna_workspace.c2
-rw-r--r--source/blender/modifiers/intern/MOD_bevel.c2
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.c2
-rw-r--r--source/blender/modifiers/intern/MOD_decimate.c2
-rw-r--r--source/blender/modifiers/intern/MOD_edgesplit.c2
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c2
-rw-r--r--source/blender/modifiers/intern/MOD_particlesystem.c2
-rw-r--r--source/blender/modifiers/intern/MOD_shrinkwrap.c2
-rw-r--r--source/blender/modifiers/intern/MOD_skin.c2
-rw-r--r--source/blender/modifiers/intern/MOD_smooth.c2
-rw-r--r--source/blender/modifiers/intern/MOD_triangulate.c2
-rw-r--r--source/blender/modifiers/intern/MOD_util.c2
-rw-r--r--source/blender/modifiers/intern/MOD_warp.c2
-rw-r--r--source/blender/modifiers/intern/MOD_wireframe.c2
-rw-r--r--source/blender/python/bmesh/bmesh_py_api.c18
-rw-r--r--source/blender/python/bmesh/bmesh_py_types.c8
-rw-r--r--source/blender/python/generic/bgl.c8
-rw-r--r--source/blender/python/generic/idprop_py_api.c28
-rw-r--r--source/blender/python/generic/py_capi_utils.c78
-rw-r--r--source/blender/python/generic/py_capi_utils.h108
-rw-r--r--source/blender/python/gpu/gpu_py_api.c9
-rw-r--r--source/blender/python/gpu/gpu_py_element.c37
-rw-r--r--source/blender/python/gpu/gpu_py_shader.c183
-rw-r--r--source/blender/python/gpu/gpu_py_shader.h1
-rw-r--r--source/blender/python/gpu/gpu_py_vertex_buffer.c29
-rw-r--r--source/blender/python/gpu/gpu_py_vertex_format.c20
-rw-r--r--source/blender/python/intern/bpy_props.c5
-rw-r--r--source/blender/python/intern/bpy_utils_units.c1
-rw-r--r--source/blender/python/mathutils/mathutils.c5
-rw-r--r--source/blender/render/intern/source/bake_api.c45
-rw-r--r--source/blender/shader_fx/CMakeLists.txt1
-rw-r--r--source/blender/shader_fx/FX_shader_types.h1
-rw-r--r--source/blender/shader_fx/intern/FX_shader_glow.c78
-rw-r--r--source/blender/shader_fx/intern/FX_shader_util.c1
-rw-r--r--source/blender/windowmanager/intern/wm_files.c17
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c8
-rw-r--r--source/blender/windowmanager/intern/wm_stereo.c24
295 files changed, 6063 insertions, 7027 deletions
diff --git a/source/blender/alembic/intern/abc_exporter.cc b/source/blender/alembic/intern/abc_exporter.cc
index d050f3b78b1..d470488937a 100644
--- a/source/blender/alembic/intern/abc_exporter.cc
+++ b/source/blender/alembic/intern/abc_exporter.cc
@@ -421,7 +421,7 @@ void AbcExporter::exploreTransform(Base *ob_base, Object *parent, Object *dupliO
}
}
-AbcTransformWriter * AbcExporter::createTransformWriter(Object *ob, Object *parent, Object *dupliObParent)
+AbcTransformWriter *AbcExporter::createTransformWriter(Object *ob, Object *parent, Object *dupliObParent)
{
/* An object should not be its own parent, or we'll get infinite loops. */
BLI_assert(ob != parent);
diff --git a/source/blender/alembic/intern/abc_exporter.h b/source/blender/alembic/intern/abc_exporter.h
index a92e426292c..74af85bfef9 100644
--- a/source/blender/alembic/intern/abc_exporter.h
+++ b/source/blender/alembic/intern/abc_exporter.h
@@ -116,7 +116,7 @@ private:
Alembic::Abc::TimeSamplingPtr createTimeSampling(double step);
void createTransformWritersHierarchy();
- AbcTransformWriter * createTransformWriter(Object *ob, Object *parent, Object *dupliObParent);
+ AbcTransformWriter *createTransformWriter(Object *ob, Object *parent, Object *dupliObParent);
void exploreTransform(Base *ob_base, Object *parent, Object *dupliObParent);
void exploreObject(Base *ob_base, Object *dupliObParent);
void createShapeWriters();
diff --git a/source/blender/alembic/intern/abc_hair.cc b/source/blender/alembic/intern/abc_hair.cc
index 83a46a330fd..50c2d04e042 100644
--- a/source/blender/alembic/intern/abc_hair.cc
+++ b/source/blender/alembic/intern/abc_hair.cc
@@ -133,7 +133,7 @@ void AbcHairWriter::write_hair_sample(Mesh *mesh,
m_uv_warning_shown = true;
}
- ParticleData * pa = m_psys->particles;
+ ParticleData *pa = m_psys->particles;
int k;
ParticleCacheKey **cache = m_psys->pathcache;
diff --git a/source/blender/alembic/intern/abc_mesh.cc b/source/blender/alembic/intern/abc_mesh.cc
index 2b739837239..4c48b7a5bce 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -546,8 +546,7 @@ Mesh *AbcMeshWriter::getFinalMesh(bool &r_needsfree)
BM_mesh_triangulate(bm, quad_method, ngon_method, tag_only, NULL, NULL, NULL);
- struct BMeshToMeshParams bmmp = {0};
- Mesh *result = BKE_bmesh_to_mesh_nomain(bm, &bmmp);
+ Mesh *result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BM_mesh_free(bm);
mesh = result;
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 0b0030ec101..db918bb0fbd 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -514,7 +514,7 @@ void DM_interp_poly_data(
* In use now by vertex/weight paint and particles */
DMCoNo *mesh_get_mapped_verts_nors(struct Scene *scene, struct Object *ob);
#endif
-void mesh_get_mapped_verts_coords(DerivedMesh *dm, float (*r_cos)[3], const int totcos);
+void mesh_get_mapped_verts_coords(struct Mesh *me_eval, float (*r_cos)[3], const int totcos);
/* */
@@ -526,10 +526,6 @@ DerivedMesh *mesh_create_derived_render(
struct Depsgraph *depsgraph, struct Scene *scene,
struct Object *ob, CustomDataMask dataMask);
-DerivedMesh *getEditDerivedBMesh(
- struct BMEditMesh *em, struct Object *ob, CustomDataMask data_mask,
- float (*vertexCos)[3]);
-
/* same as above but wont use render settings */
DerivedMesh *mesh_create_derived(struct Mesh *me, float (*vertCos)[3]);
DerivedMesh *mesh_create_derived_no_deform(
@@ -541,20 +537,16 @@ DerivedMesh *mesh_create_derived_no_deform_render(
struct Object *ob, float (*vertCos)[3],
CustomDataMask dataMask);
-DerivedMesh *editbmesh_get_derived_base(
- struct Object *ob, struct BMEditMesh *em, CustomDataMask data_mask);
-DerivedMesh *editbmesh_get_derived_cage(
+struct Mesh *editbmesh_get_eval_cage(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *,
struct BMEditMesh *em, CustomDataMask dataMask);
-DerivedMesh *editbmesh_get_derived_cage_and_final(
+struct Mesh *editbmesh_get_eval_cage_and_final(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *,
struct BMEditMesh *em, CustomDataMask dataMask,
- DerivedMesh **r_final);
-
-DerivedMesh *object_get_derived_final(struct Object *ob, const bool for_render);
+ struct Mesh **r_final);
float (*editbmesh_get_vertex_cos(struct BMEditMesh *em, int *r_numVerts))[3];
-bool editbmesh_modifier_is_enabled(struct Scene *scene, struct ModifierData *md, DerivedMesh *dm);
+bool editbmesh_modifier_is_enabled(struct Scene *scene, struct ModifierData *md, bool has_prev_mesh);
void makeDerivedMesh(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct BMEditMesh *em,
CustomDataMask dataMask, const bool build_shapekey_layers);
diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h
index 84451fe31d4..d4b5b4c7d47 100644
--- a/source/blender/blenkernel/BKE_blender_version.h
+++ b/source/blender/blenkernel/BKE_blender_version.h
@@ -28,7 +28,7 @@
* and keep comment above the defines.
* Use STRINGIFY() rather than defining with quotes */
#define BLENDER_VERSION 280
-#define BLENDER_SUBVERSION 25
+#define BLENDER_SUBVERSION 26
/* Several breakages with 280, e.g. collections vs layers */
#define BLENDER_MINVERSION 280
#define BLENDER_MINSUBVERSION 0
diff --git a/source/blender/blenkernel/BKE_bmfont.h b/source/blender/blenkernel/BKE_bmfont.h
deleted file mode 100644
index 3be84c83892..00000000000
--- a/source/blender/blenkernel/BKE_bmfont.h
+++ /dev/null
@@ -1,61 +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) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-#ifndef __BKE_BMFONT_H__
-#define __BKE_BMFONT_H__
-
-/** \file BKE_bmfont.h
- * \ingroup bke
- * \since March 2001
- * \author nzc
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct bmGlyph;
-struct ImBuf;
-struct bmFont;
-
-void printfGlyph(struct bmGlyph *glyph);
-void calcAlpha(struct ImBuf *ibuf);
-void readBitmapFontVersion0(struct ImBuf *ibuf,
- unsigned char *rect,
- int step);
-void detectBitmapFont(struct ImBuf *ibuf);
-int locateGlyph(struct bmFont *bmfont, unsigned short unicode);
-void matrixGlyph(struct ImBuf *ibuf, unsigned short unicode,
- float *centerx, float *centery,
- float *sizex, float *sizey,
- float *transx, float *transy,
- float *movex, float *movey, float *advance);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index 28dcf9cb127..1c73434cde5 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -249,6 +249,12 @@ void CTX_data_list_add(bContextDataResult *result, void *data);
CTX_DATA_BEGIN(C, Type, instance, member) \
Type_id instance_id = ctx_link->ptr.id.data; \
+#define CTX_DATA_BEGIN_FOR_ID(C, Type, instance, member, instance_id) \
+ CTX_DATA_BEGIN(C, Type, instance, member) \
+ if (ctx_link->ptr.id.data != (instance_id)) { \
+ continue; \
+ }
+
int ctx_data_list_count(const bContext *C, int (*func)(const bContext *, ListBase *));
#define CTX_DATA_COUNT(C, member) \
diff --git a/source/blender/blenkernel/BKE_editmesh.h b/source/blender/blenkernel/BKE_editmesh.h
index 09f9c3dfbcf..de4efaf37b0 100644
--- a/source/blender/blenkernel/BKE_editmesh.h
+++ b/source/blender/blenkernel/BKE_editmesh.h
@@ -41,6 +41,7 @@ struct Scene;
struct DerivedMesh;
struct MeshStatVis;
struct Depsgraph;
+struct EditMeshData;
/**
* This structure is used for mesh edit-mode.
@@ -63,8 +64,9 @@ typedef struct BMEditMesh {
struct BMLoop *(*looptris)[3];
int tottri;
+ struct Mesh *mesh_eval_final, *mesh_eval_cage;
+
/*derivedmesh stuff*/
- struct DerivedMesh *derivedFinal, *derivedCage;
CustomDataMask lastDataMask;
unsigned char (*derivedVertColor)[4];
int derivedVertColorLen;
@@ -97,8 +99,8 @@ void BKE_editmesh_lnorspace_update(BMEditMesh *em);
/* editderivedmesh.c */
/* should really be defined in editmesh.c, but they use 'EditDerivedBMesh' */
-void BKE_editmesh_statvis_calc(BMEditMesh *em, struct DerivedMesh *dm,
- const struct MeshStatVis *statvis);
+void BKE_editmesh_statvis_calc(
+ BMEditMesh *em, struct EditMeshData *emd, const struct MeshStatVis *statvis);
float (*BKE_editmesh_vertexCos_get(
struct Depsgraph *depsgraph, struct BMEditMesh *em, struct Scene *scene, int *r_numVerts))[3];
diff --git a/source/blender/blenkernel/BKE_bmfont_types.h b/source/blender/blenkernel/BKE_editmesh_cache.h
index 31513e4b8f1..aaaa79a0857 100644
--- a/source/blender/blenkernel/BKE_bmfont_types.h
+++ b/source/blender/blenkernel/BKE_editmesh_cache.h
@@ -15,44 +15,22 @@
* 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.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
* ***** END GPL LICENSE BLOCK *****
*/
-#ifndef __BKE_BMFONT_TYPES_H__
-#define __BKE_BMFONT_TYPES_H__
-/** \file BKE_bmfont_types.h
+#ifndef __BKE_EDITMESH_CACHE_H__
+#define __BKE_EDITMESH_CACHE_H__
+
+/** \file BKE_editmesh_cache.h
* \ingroup bke
- * \since March 2001
- * \author nzc
*/
-#define is_power_of_two(N) ((N ^ (N - 1)) == (2 * N - 1))
-/*
- * Moved to IMB_imbuf_types.h where it will live close to the ImBuf type.
- * It is used as a userflag bit mask.
- */
-// #define IB_BITMAPFONT 1
-typedef struct bmGlyph {
- unsigned short unicode;
- short locx, locy;
- signed char ofsx, ofsy;
- unsigned char sizex, sizey;
- unsigned char advance, reserved;
-} bmGlyph;
+struct BMEditMesh;
+struct EditMeshData;
+
+void BKE_editmesh_cache_ensure_poly_normals(struct BMEditMesh *em, struct EditMeshData *emd);
+void BKE_editmesh_cache_ensure_vert_normals(struct BMEditMesh *em, struct EditMeshData *emd);
-typedef struct bmFont {
- char magic[4];
- short version;
- short glyphcount;
- short xsize, ysize;
- bmGlyph glyphs[1];
-} bmFont;
+void BKE_editmesh_cache_ensure_poly_centers(struct BMEditMesh *em, struct EditMeshData *emd);
-#endif
+#endif /* __BKE_EDITMESH_CACHE_H__ */
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 058e42bd261..8ab088eff02 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -143,6 +143,9 @@ struct Material *BKE_gpencil_get_material_from_brush(struct Brush *brush);
struct Material *BKE_gpencil_material_ensure(struct Main *bmain, struct Object *ob);
/* object boundbox */
+bool BKE_gpencil_data_minmax(
+ struct Object *ob, const struct bGPdata *gpd,
+ float r_min[3], float r_max[3]);
bool BKE_gpencil_stroke_minmax(
const struct bGPDstroke *gps, const bool use_select,
float r_min[3], float r_max[3]);
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index a5f8338f3cc..89bde516264 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -67,6 +67,7 @@ struct CustomData;
struct Scene;
struct MLoopUV;
struct ReportList;
+struct BMEditMesh;
#ifdef __cplusplus
extern "C" {
@@ -89,7 +90,11 @@ struct BMesh *BKE_mesh_to_bmesh(
struct Mesh *me, struct Object *ob,
const bool add_key_index, const struct BMeshCreateParams *params);
-struct Mesh *BKE_bmesh_to_mesh_nomain(struct BMesh *bm, const struct BMeshToMeshParams *params);
+struct Mesh *BKE_mesh_from_bmesh_nomain(struct BMesh *bm, const struct BMeshToMeshParams *params);
+struct Mesh *BKE_mesh_from_bmesh_for_eval_nomain(struct BMesh *bm, int64_t cd_mask_extra);
+
+struct Mesh *BKE_mesh_from_editmesh_with_coords_thin_wrap(
+ struct BMEditMesh *em, CustomDataMask data_mask, float (*vertexCos)[3]);
int poly_find_loop_from_vert(
const struct MPoly *poly,
@@ -174,7 +179,7 @@ void BKE_mesh_split_faces(struct Mesh *mesh, bool free_loop_normals);
struct Mesh *BKE_mesh_new_from_object(
struct Depsgraph *depsgraph, struct Main *bmain, struct Scene *sce, struct Object *ob,
- const bool apply_modifiers, const bool calc_tessface, const bool calc_undeformed);
+ const bool apply_modifiers, const bool calc_undeformed);
struct Mesh *BKE_mesh_create_derived_for_modifier(
struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob,
struct ModifierData *md, int build_shapekey_layers);
@@ -230,6 +235,7 @@ void BKE_mesh_calc_normals_poly(
const bool only_face_normals);
void BKE_mesh_calc_normals(struct Mesh *me);
void BKE_mesh_ensure_normals(struct Mesh *me);
+void BKE_mesh_ensure_normals_for_display(struct Mesh *mesh);
void BKE_mesh_calc_normals_tessface(
struct MVert *mverts, int numVerts,
const struct MFace *mfaces, int numFaces,
diff --git a/source/blender/blenkernel/BKE_mesh_runtime.h b/source/blender/blenkernel/BKE_mesh_runtime.h
index 9132c3dae64..050d17771c9 100644
--- a/source/blender/blenkernel/BKE_mesh_runtime.h
+++ b/source/blender/blenkernel/BKE_mesh_runtime.h
@@ -87,6 +87,10 @@ struct Mesh *mesh_get_eval_deform(
struct Depsgraph *depsgraph, struct Scene *scene,
struct Object *ob, CustomDataMask dataMask);
+struct Mesh *mesh_create_eval_final_render(
+ struct Depsgraph *depsgraph, struct Scene *scene,
+ struct Object *ob, CustomDataMask dataMask);
+
#ifdef USE_DERIVEDMESH
struct DerivedMesh *mesh_create_derived_index_render(
struct Depsgraph *depsgraph, struct Scene *scene,
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index eb08db93bd0..2be91406524 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -424,22 +424,22 @@ const char *modifier_path_relbase_from_global(struct Object *ob);
/* wrappers for modifier callbacks that ensure valid normals */
-struct DerivedMesh *modwrap_applyModifier(
+struct Mesh *modwrap_applyModifier(
ModifierData *md, const struct ModifierEvalContext *ctx,
- struct DerivedMesh *dm);
+ struct Mesh *me);
-struct DerivedMesh *modwrap_applyModifierEM(
+struct Mesh *modwrap_applyModifierEM(
ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *em, struct DerivedMesh *dm);
+ struct BMEditMesh *em, struct Mesh *me);
void modwrap_deformVerts(
ModifierData *md, const struct ModifierEvalContext *ctx,
- struct DerivedMesh *dm,
+ struct Mesh *me,
float (*vertexCos)[3], int numVerts);
void modwrap_deformVertsEM(
ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *em, struct DerivedMesh *dm,
+ struct BMEditMesh *em, struct Mesh *me,
float (*vertexCos)[3], int numVerts);
#define applyModifier_DM_wrapper(NEW_FUNC_NAME, OLD_FUNC_NAME) \
@@ -456,43 +456,10 @@ void modwrap_deformVertsEM(
* depending on if the modifier has been ported to Mesh or is still using DerivedMesh
*/
-void modifier_deformVerts_ensure_normals(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct Mesh *mesh, float (*vertexCos)[3], int numVerts);
-
-struct Mesh *modifier_applyModifier_ensure_normals(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct Mesh *mesh);
-
-/* deprecated variants of above that accept DerivedMesh */
-
-void modifier_deformVerts_DM_deprecated(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts);
-
-void modifier_deformMatrices_DM_deprecated(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct DerivedMesh *dm,
- float (*vertexCos)[3], float (*defMats)[3][3], int numVerts);
-
-void modifier_deformVertsEM_DM_deprecated(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct DerivedMesh *dm,
- float (*vertexCos)[3], int numVerts);
-
-void modifier_deformMatricesEM_DM_deprecated(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct DerivedMesh *dm,
- float (*vertexCos)[3], float (*defMats)[3][3], int numVerts);
-
struct DerivedMesh *modifier_applyModifier_DM_deprecated(
struct ModifierData *md, const struct ModifierEvalContext *ctx,
struct DerivedMesh *dm);
-struct DerivedMesh *modifier_applyModifierEM_DM_deprecated(
- struct ModifierData *md, const struct ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct DerivedMesh *dm);
-
struct Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(
struct Object *ob_eval, bool *r_free_mesh);
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 81182a89f3e..6d7def8f93f 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -102,7 +102,7 @@ typedef enum eObjectVisibilityCheck {
OB_VISIBILITY_CHECK_UNKNOWN_RENDER_MODE,
} eObjectVisibilityCheck;
-bool BKE_object_is_visible(struct Object *ob, const eObjectVisibilityCheck mode);
+bool BKE_object_is_visible(const struct Object *ob, const eObjectVisibilityCheck mode);
void BKE_object_init(struct Object *ob);
struct Object *BKE_object_add_only_object(
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index d2d09609221..3782d26fc1b 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -104,6 +104,7 @@ void BKE_paint_reset_overlay_invalid(eOverlayControlFlags flag);
void BKE_paint_set_overlay_override(enum eOverlayFlags flag);
/* palettes */
+void BKE_palette_init(struct Palette *palette);
void BKE_palette_free(struct Palette *palette);
struct Palette *BKE_palette_add(struct Main *bmain, const char *name);
void BKE_palette_copy_data(
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index 3279839f8b5..aa00024b27b 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -67,7 +67,7 @@ struct ViewLayer;
#define PARTICLE_COLLISION_MAX_COLLISIONS 10
-#define PARTICLE_P ParticleData * pa; int p
+#define PARTICLE_P ParticleData *pa; int p
#define LOOP_PARTICLES for (p = 0, pa = psys->particles; p < psys->totpart; p++, pa++)
#define LOOP_EXISTING_PARTICLES for (p = 0, pa = psys->particles; p < psys->totpart; p++, pa++) if (!(pa->flag & PARS_UNEXIST))
#define LOOP_SHOWN_PARTICLES for (p = 0, pa = psys->particles; p < psys->totpart; p++, pa++) if (!(pa->flag & (PARS_UNEXIST | PARS_NO_DISP)))
@@ -75,7 +75,7 @@ struct ViewLayer;
#define LOOP_DYNAMIC_PARTICLES for (p = 0; p < psys->totpart; p++) if ((pa = psys->particles + p)->state.time > 0.0f)
/* fast but sure way to get the modifier*/
-#define PARTICLE_PSMD ParticleSystemModifierData * psmd = sim->psmd ? sim->psmd : psys_get_modifier(sim->ob, sim->psys)
+#define PARTICLE_PSMD ParticleSystemModifierData *psmd = sim->psmd ? sim->psmd : psys_get_modifier(sim->ob, sim->psys)
/* common stuff that many particle functions need */
typedef struct ParticleSimulationData {
@@ -304,7 +304,7 @@ void psys_set_current_num(Object *ob, int index);
struct LatticeDeformData *psys_create_lattice_deform_data(struct ParticleSimulationData *sim);
struct ParticleSystem *psys_orig_get(struct ParticleSystem *psys);
-bool psys_in_edit_mode(struct Depsgraph *depsgraph, struct ParticleSystem *psys);
+bool psys_in_edit_mode(struct Depsgraph *depsgraph, const struct ParticleSystem *psys);
bool psys_check_enabled(struct Object *ob, struct ParticleSystem *psys, const bool use_render_params);
bool psys_check_edited(struct ParticleSystem *psys);
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index aaaaf620afa..58058d1e134 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -238,7 +238,7 @@ typedef void (*uiListDrawItemFunc)(
/* Draw the filtering part of an uiList */
typedef void (*uiListDrawFilterFunc)(
- struct uiList *ui_list, struct bContext *C, struct uiLayout *layout);
+ struct uiList *ui_list, struct bContext *C, struct uiLayout *layout, bool reverse);
/* Filter items of an uiList */
typedef void (*uiListFilterItemsFunc)(
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 452ca90ecf1..77c9df12428 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -82,7 +82,6 @@ set(SRC
intern/blender_undo.c
intern/blender_user_menu.c
intern/blendfile.c
- intern/bmfont.c
intern/boids.c
intern/bpath.c
intern/brush.c
@@ -110,6 +109,7 @@ set(SRC
intern/editlattice.c
intern/editmesh.c
intern/editmesh_bvh.c
+ intern/editmesh_cache.c
intern/editmesh_tangent.c
intern/effect.c
intern/fcurve.c
@@ -236,8 +236,6 @@ set(SRC
BKE_blender_user_menu.h
BKE_blender_version.h
BKE_blendfile.h
- BKE_bmfont.h
- BKE_bmfont_types.h
BKE_boids.h
BKE_bpath.h
BKE_brush.h
@@ -264,6 +262,7 @@ set(SRC
BKE_editlattice.h
BKE_editmesh.h
BKE_editmesh_bvh.h
+ BKE_editmesh_cache.h
BKE_editmesh_tangent.h
BKE_effect.h
BKE_fcurve.h
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 4c55591db31..5a99978f00c 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -60,6 +60,7 @@
#include "BKE_material.h"
#include "BKE_modifier.h"
#include "BKE_mesh.h"
+#include "BKE_mesh_iterators.h"
#include "BKE_mesh_mapping.h"
#include "BKE_mesh_runtime.h"
#include "BKE_mesh_tangent.h"
@@ -463,12 +464,6 @@ void DM_ensure_normals(DerivedMesh *dm)
BLI_assert((dm->dirty & DM_DIRTY_NORMALS) == 0);
}
-static void DM_calc_loop_normals(DerivedMesh *dm, const bool use_split_normals, float split_angle)
-{
- dm->calcLoopNormals(dm, use_split_normals, split_angle);
- dm->dirty |= DM_DIRTY_TESS_CDLAYERS;
-}
-
/* note: until all modifiers can take MPoly's as input,
* use this at the start of modifiers */
void DM_ensure_tessface(DerivedMesh *dm)
@@ -1169,7 +1164,7 @@ static float (*get_editbmesh_orco_verts(BMEditMesh *em))[3]
}
/* orco custom data layer */
-static float (*get_orco_coords_dm(Object *ob, BMEditMesh *em, int layer, int *free))[3]
+static float (*get_orco_coords(Object *ob, BMEditMesh *em, int layer, int *free))[3]
{
*free = 0;
@@ -1200,29 +1195,6 @@ static float (*get_orco_coords_dm(Object *ob, BMEditMesh *em, int layer, int *fr
return NULL;
}
-static DerivedMesh *create_orco_dm(Object *ob, Mesh *me, BMEditMesh *em, int layer)
-{
- DerivedMesh *dm;
- float (*orco)[3];
- int free;
-
- if (em) {
- dm = CDDM_from_editbmesh(em, false, false);
- }
- else {
- dm = CDDM_from_mesh(me);
- }
-
- orco = get_orco_coords_dm(ob, em, layer, &free);
-
- if (orco) {
- CDDM_apply_vert_coords(dm, orco);
- if (free) MEM_freeN(orco);
- }
-
- return dm;
-}
-
static Mesh *create_orco_mesh(Object *ob, Mesh *me, BMEditMesh *em, int layer)
{
Mesh *mesh;
@@ -1230,13 +1202,13 @@ static Mesh *create_orco_mesh(Object *ob, Mesh *me, BMEditMesh *em, int layer)
int free;
if (em) {
- mesh = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0});
+ mesh = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
}
else {
mesh = BKE_mesh_copy_for_eval(me, true);
}
- orco = get_orco_coords_dm(ob, em, layer, &free);
+ orco = get_orco_coords(ob, em, layer, &free);
if (orco) {
BKE_mesh_apply_vert_coords(mesh, orco);
@@ -1246,58 +1218,20 @@ static Mesh *create_orco_mesh(Object *ob, Mesh *me, BMEditMesh *em, int layer)
return mesh;
}
-static void add_orco_dm(
- Object *ob, BMEditMesh *em, DerivedMesh *dm,
- DerivedMesh *orcodm, int layer)
-{
- float (*orco)[3], (*layerorco)[3];
- int totvert, free;
-
- totvert = dm->getNumVerts(dm);
-
- if (orcodm) {
- orco = MEM_calloc_arrayN(totvert, sizeof(float[3]), "dm orco");
- free = 1;
-
- if (orcodm->getNumVerts(orcodm) == totvert)
- orcodm->getVertCos(orcodm, orco);
- else
- dm->getVertCos(dm, orco);
- }
- else {
- /* TODO(sybren): totvert should potentially change here, as ob->data
- * or em may have a different number of vertices than dm. */
- orco = get_orco_coords_dm(ob, em, layer, &free);
- }
-
- if (orco) {
- if (layer == CD_ORCO)
- BKE_mesh_orco_verts_transform(ob->data, orco, totvert, 0);
-
- if (!(layerorco = DM_get_vert_data_layer(dm, layer))) {
- DM_add_vert_layer(dm, layer, CD_CALLOC, NULL);
- layerorco = DM_get_vert_data_layer(dm, layer);
- }
-
- memcpy(layerorco, orco, sizeof(float) * 3 * totvert);
- if (free) MEM_freeN(orco);
- }
-}
-
static void add_orco_mesh(
Object *ob, BMEditMesh *em, Mesh *mesh,
- Mesh *orco_mesh, int layer)
+ Mesh *me_orco, int layer)
{
float (*orco)[3], (*layerorco)[3];
int totvert, free;
totvert = mesh->totvert;
- if (orco_mesh) {
+ if (me_orco) {
free = 1;
- if (orco_mesh->totvert == totvert) {
- orco = BKE_mesh_vertexCos_get(orco_mesh, NULL);
+ if (me_orco->totvert == totvert) {
+ orco = BKE_mesh_vertexCos_get(me_orco, NULL);
}
else {
orco = BKE_mesh_vertexCos_get(mesh, NULL);
@@ -1306,7 +1240,7 @@ static void add_orco_mesh(
else {
/* TODO(sybren): totvert should potentially change here, as ob->data
* or em may have a different number of vertices than dm. */
- orco = get_orco_coords_dm(ob, em, layer, &free);
+ orco = get_orco_coords(ob, em, layer, &free);
}
if (orco) {
@@ -1326,11 +1260,12 @@ static void add_orco_mesh(
}
}
-static void DM_update_statvis_color(const Scene *scene, Object *ob, DerivedMesh *dm)
+static void editmesh_update_statvis_color(const Scene *scene, Object *ob)
{
BMEditMesh *em = BKE_editmesh_from_object(ob);
-
- BKE_editmesh_statvis_calc(em, dm, &scene->toolsettings->statvis);
+ Mesh *me = ob->data;
+ BKE_mesh_runtime_ensure_edit_data(me);
+ BKE_editmesh_statvis_calc(em, me->runtime.edit_data, &scene->toolsettings->statvis);
}
static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape_uid)
@@ -1389,20 +1324,20 @@ static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape
}
}
-static void UNUSED_FUNCTION(add_shapekey_layers)(DerivedMesh *dm, Mesh *me, Object *UNUSED(ob))
+static void add_shapekey_layers(Mesh *me_dst, Mesh *me_src, Object *UNUSED(ob))
{
KeyBlock *kb;
- Key *key = me->key;
+ Key *key = me_src->key;
int i;
- if (!me->key)
+ if (!me_src->key)
return;
/* ensure we can use mesh vertex count for derived mesh custom data */
- if (me->totvert != dm->getNumVerts(dm)) {
+ if (me_src->totvert != me_dst->totvert) {
fprintf(stderr,
- "%s: vertex size mismatch (mesh/dm) '%s' (%d != %d)\n",
- __func__, me->id.name + 2, me->totvert, dm->getNumVerts(dm));
+ "%s: vertex size mismatch (mesh/eval) '%s' (%d != %d)\n",
+ __func__, me_src->id.name + 2, me_src->totvert, me_dst->totvert);
return;
}
@@ -1410,67 +1345,21 @@ static void UNUSED_FUNCTION(add_shapekey_layers)(DerivedMesh *dm, Mesh *me, Obje
int ci;
float *array;
- if (me->totvert != kb->totelem) {
+ if (me_src->totvert != kb->totelem) {
fprintf(stderr,
"%s: vertex size mismatch (Mesh '%s':%d != KeyBlock '%s':%d)\n",
- __func__, me->id.name + 2, me->totvert, kb->name, kb->totelem);
- array = MEM_calloc_arrayN((size_t)me->totvert, 3 * sizeof(float), __func__);
+ __func__, me_src->id.name + 2, me_src->totvert, kb->name, kb->totelem);
+ array = MEM_calloc_arrayN((size_t)me_src->totvert, sizeof(float[3]), __func__);
}
else {
- array = MEM_malloc_arrayN((size_t)me->totvert, 3 * sizeof(float), __func__);
- memcpy(array, kb->data, (size_t)me->totvert * 3 * sizeof(float));
+ array = MEM_malloc_arrayN((size_t)me_src->totvert, sizeof(float[3]), __func__);
+ memcpy(array, kb->data, (size_t)me_src->totvert * sizeof(float[3]));
}
- CustomData_add_layer_named(&dm->vertData, CD_SHAPEKEY, CD_ASSIGN, array, dm->numVertData, kb->name);
- ci = CustomData_get_layer_index_n(&dm->vertData, CD_SHAPEKEY, i);
-
- dm->vertData.layers[ci].uid = kb->uid;
- }
-}
-
-/**
- * Called after calculating all modifiers.
- *
- * \note tessfaces should already be calculated.
- */
-static void dm_ensure_display_normals(DerivedMesh *dm)
-{
- /* Note: dm *may* have a poly CD_NORMAL layer (generated by a modifier needing poly normals e.g.).
- * We do not use it here, though. And it should be tagged as temp!
- */
- /* BLI_assert((CustomData_has_layer(&dm->polyData, CD_NORMAL) == false)); */
-
- if ((dm->type == DM_TYPE_CDDM) &&
- ((dm->dirty & DM_DIRTY_NORMALS) || CustomData_has_layer(&dm->polyData, CD_NORMAL) == false))
- {
- /* if normals are dirty we want to calculate vertex normals too */
- CDDM_calc_normals_mapping_ex(dm, (dm->dirty & DM_DIRTY_NORMALS) ? false : true);
- }
-}
-
-static void mesh_ensure_display_normals(Mesh *mesh)
-{
- /* Note: mesh *may* have a poly CD_NORMAL layer (generated by a modifier needing poly normals e.g.).
- * We do not use it here, though. And it should be tagged as temp!
- */
- /* BLI_assert((CustomData_has_layer(&mesh->pdata, CD_NORMAL) == false)); */
-
- if (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL || !CustomData_has_layer(&mesh->pdata, CD_NORMAL)) {
- float (*face_nors)[3] = NULL;
- face_nors = MEM_malloc_arrayN(mesh->totpoly, sizeof(*face_nors), "face_nors");
-
- /* if normals are dirty we want to calculate vertex normals too */
- bool only_face_normals = !(mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL);
+ CustomData_add_layer_named(&me_dst->vdata, CD_SHAPEKEY, CD_ASSIGN, array, me_dst->totvert, kb->name);
+ ci = CustomData_get_layer_index_n(&me_dst->vdata, CD_SHAPEKEY, i);
- /* calculate face normals */
- BKE_mesh_calc_normals_poly(
- mesh->mvert, NULL, mesh->totvert, mesh->mloop, mesh->mpoly,
- mesh->totloop, mesh->totpoly, face_nors,
- only_face_normals);
-
- CustomData_add_layer(&mesh->pdata, CD_NORMAL, CD_ASSIGN, face_nors, mesh->totpoly);
-
- mesh->runtime.cd_dirty_vert &= ~CD_MASK_NORMAL;
+ me_dst->vdata.layers[ci].uid = kb->uid;
}
}
@@ -1480,15 +1369,14 @@ static void mesh_calc_modifiers(
const bool need_mapping, CustomDataMask dataMask,
const int index, const bool useCache, const bool build_shapekey_layers,
/* return args */
- Mesh **r_deform_mesh, Mesh **r_final_mesh)
+ Mesh **r_deform, Mesh **r_final)
{
- Mesh *me = ob->data;
ModifierData *firstmd, *md, *previewmd = NULL;
CDMaskLink *datamasks, *curr;
/* XXX Always copying POLYINDEX, else tessellated data are no more valid! */
CustomDataMask mask, nextmask, previewmask = 0, append_mask = CD_MASK_ORIGINDEX;
float (*deformedVerts)[3] = NULL;
- int numVerts = me->totvert;
+ int numVerts = ((Mesh *)ob->data)->totvert;
const bool useRenderParams = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
const int required_mode = useRenderParams ? eModifierMode_Render : eModifierMode_Realtime;
bool isPrevDeform = false;
@@ -1500,14 +1388,14 @@ static void mesh_calc_modifiers(
/* Generic preview only in object mode! */
const bool do_mod_mcol = (ob->mode == OB_MODE_OBJECT);
- const bool do_loop_normals = (me->flag & ME_AUTOSMOOTH) != 0;
+ const bool do_loop_normals = (((Mesh *)ob->data)->flag & ME_AUTOSMOOTH) != 0;
VirtualModifierData virtualModifierData;
ModifierApplyFlag app_flags = useRenderParams ? MOD_APPLY_RENDER : 0;
ModifierApplyFlag deform_app_flags = app_flags;
- BLI_assert((me->id.tag & LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT) == 0);
+ BLI_assert((((Mesh *)ob->data)->id.tag & LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT) == 0);
if (useCache)
app_flags |= MOD_APPLY_USECACHE;
@@ -1535,10 +1423,10 @@ static void mesh_calc_modifiers(
datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, previewmd, previewmask);
curr = datamasks;
- if (r_deform_mesh) {
- *r_deform_mesh = NULL;
+ if (r_deform) {
+ *r_deform = NULL;
}
- *r_final_mesh = NULL;
+ *r_final = NULL;
if (useDeform) {
if (inputVertexCos)
@@ -1558,9 +1446,9 @@ static void mesh_calc_modifiers(
if (mti->type == eModifierTypeType_OnlyDeform && !sculpt_dyntopo) {
if (!deformedVerts)
- deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
+ deformedVerts = BKE_mesh_vertexCos_get(ob->data, &numVerts);
- modifier_deformVerts_ensure_normals(md, &mectx_deform, NULL, deformedVerts, numVerts);
+ modwrap_deformVerts(md, &mectx_deform, NULL, deformedVerts, numVerts);
}
else {
break;
@@ -1575,17 +1463,17 @@ static void mesh_calc_modifiers(
* places that wish to use the original mesh but with deformed
* coordinates (vpaint, etc.)
*/
- if (r_deform_mesh) {
- *r_deform_mesh = BKE_mesh_copy_for_eval(me, true);
+ if (r_deform) {
+ *r_deform = BKE_mesh_copy_for_eval(ob->data, true);
/* XXX: Is build_shapekey_layers ever even true? This should have crashed long ago... */
BLI_assert(!build_shapekey_layers);
- UNUSED_VARS_NDEBUG(build_shapekey_layers);
- //if (build_shapekey_layers)
- // add_shapekey_layers(*r_deform_mesh, me, ob);
+ if (build_shapekey_layers) {
+ add_shapekey_layers(*r_deform, ob->data, ob);
+ }
if (deformedVerts) {
- BKE_mesh_apply_vert_coords(*r_deform_mesh, deformedVerts);
+ BKE_mesh_apply_vert_coords(*r_deform, deformedVerts);
}
}
}
@@ -1594,16 +1482,16 @@ static void mesh_calc_modifiers(
if (inputVertexCos)
deformedVerts = inputVertexCos;
else
- deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
+ deformedVerts = BKE_mesh_vertexCos_get(ob->data, &numVerts);
}
/* Now apply all remaining modifiers. If useDeform is off then skip
* OnlyDeform ones.
*/
- Mesh *mesh = NULL;
- Mesh *orco_mesh = NULL;
- Mesh *cloth_orco_mesh = NULL;
+ Mesh *me = NULL;
+ Mesh *me_orco = NULL;
+ Mesh *me_orco_cloth = NULL;
for (; md; md = md->next, curr = curr->next) {
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -1616,7 +1504,7 @@ static void mesh_calc_modifiers(
continue;
}
- if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && mesh) {
+ if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && me) {
modifier_setError(md, "Modifier requires original data, bad stack position");
continue;
}
@@ -1667,8 +1555,8 @@ static void mesh_calc_modifiers(
else
mask = 0;
- if (mesh && (mask & CD_MASK_ORCO)) {
- add_orco_mesh(ob, NULL, mesh, orco_mesh, CD_ORCO);
+ if (me && (mask & CD_MASK_ORCO)) {
+ add_orco_mesh(ob, NULL, me, me_orco, CD_ORCO);
}
/* How to apply modifier depends on (a) what we already have as
@@ -1679,15 +1567,15 @@ static void mesh_calc_modifiers(
if (mti->type == eModifierTypeType_OnlyDeform) {
/* No existing verts to deform, need to build them. */
if (!deformedVerts) {
- if (mesh) {
+ if (me) {
/* Deforming a mesh, read the vertex locations
* out of the mesh and deform them. Once done with this
* run of deformers verts will be written back.
*/
- deformedVerts = BKE_mesh_vertexCos_get(mesh, &numVerts);
+ deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
}
else {
- deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
+ deformedVerts = BKE_mesh_vertexCos_get(ob->data, &numVerts);
}
}
@@ -1695,12 +1583,12 @@ static void mesh_calc_modifiers(
* to avoid giving bogus normals to the next modifier see: [#23673] */
if (isPrevDeform && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
/* XXX, this covers bug #23673, but we may need normal calc for other types */
- if (mesh) {
- BKE_mesh_apply_vert_coords(mesh, deformedVerts);
+ if (me) {
+ BKE_mesh_apply_vert_coords(me, deformedVerts);
}
}
- modifier_deformVerts_ensure_normals(md, &mectx_deform, mesh, deformedVerts, numVerts);
+ modwrap_deformVerts(md, &mectx_deform, me, deformedVerts, numVerts);
}
else {
/* determine which data layers are needed by following modifiers */
@@ -1710,21 +1598,21 @@ static void mesh_calc_modifiers(
nextmask = dataMask;
/* apply vertex coordinates or build a Mesh as necessary */
- if (mesh) {
+ if (me) {
if (deformedVerts) {
- BKE_mesh_apply_vert_coords(mesh, deformedVerts);
+ BKE_mesh_apply_vert_coords(me, deformedVerts);
}
}
else {
- mesh = BKE_mesh_copy_for_eval(me, true);
- ASSERT_IS_VALID_MESH(mesh);
+ me = BKE_mesh_copy_for_eval(ob->data, true);
+ ASSERT_IS_VALID_MESH(me);
- // XXX: port to Mesh if build_shapekey_layers can ever be true
- //if (build_shapekey_layers)
- // add_shapekey_layers(mesh, me, ob);
+ if (build_shapekey_layers) {
+ add_shapekey_layers(me, ob->data, ob);
+ }
if (deformedVerts) {
- BKE_mesh_apply_vert_coords(mesh, deformedVerts);
+ BKE_mesh_apply_vert_coords(me, deformedVerts);
}
/* Constructive modifiers need to have an origindex
@@ -1736,14 +1624,14 @@ static void mesh_calc_modifiers(
*/
if (need_mapping || (nextmask & CD_MASK_ORIGINDEX)) {
/* calc */
- CustomData_add_layer(&mesh->vdata, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totvert);
- CustomData_add_layer(&mesh->edata, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totedge);
- CustomData_add_layer(&mesh->pdata, CD_ORIGINDEX, CD_CALLOC, NULL, mesh->totpoly);
+ CustomData_add_layer(&me->vdata, CD_ORIGINDEX, CD_CALLOC, NULL, me->totvert);
+ CustomData_add_layer(&me->edata, CD_ORIGINDEX, CD_CALLOC, NULL, me->totedge);
+ CustomData_add_layer(&me->pdata, CD_ORIGINDEX, CD_CALLOC, NULL, me->totpoly);
/* Not worth parallelizing this, gives less than 0.1% overall speedup in best of best cases... */
- range_vn_i(CustomData_get_layer(&mesh->vdata, CD_ORIGINDEX), mesh->totvert, 0);
- range_vn_i(CustomData_get_layer(&mesh->edata, CD_ORIGINDEX), mesh->totedge, 0);
- range_vn_i(CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX), mesh->totpoly, 0);
+ range_vn_i(CustomData_get_layer(&me->vdata, CD_ORIGINDEX), me->totvert, 0);
+ range_vn_i(CustomData_get_layer(&me->edata, CD_ORIGINDEX), me->totedge, 0);
+ range_vn_i(CustomData_get_layer(&me->pdata, CD_ORIGINDEX), me->totpoly, 0);
}
}
@@ -1753,85 +1641,84 @@ static void mesh_calc_modifiers(
/* needMapping check here fixes bug [#28112], otherwise it's
* possible that it won't be copied */
mask |= append_mask;
- mesh_set_only_copy(mesh, mask | (need_mapping ? CD_MASK_ORIGINDEX : 0));
+ mesh_set_only_copy(me, mask | (need_mapping ? CD_MASK_ORIGINDEX : 0));
/* add cloth rest shape key if needed */
if (mask & CD_MASK_CLOTH_ORCO)
- add_orco_mesh(ob, NULL, mesh, orco_mesh, CD_CLOTH_ORCO);
+ add_orco_mesh(ob, NULL, me, me_orco, CD_CLOTH_ORCO);
/* add an origspace layer if needed */
if ((curr->mask) & CD_MASK_ORIGSPACE_MLOOP) {
- if (!CustomData_has_layer(&mesh->ldata, CD_ORIGSPACE_MLOOP)) {
- CustomData_add_layer(&mesh->ldata, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL, mesh->totloop);
- mesh_init_origspace(mesh);
+ if (!CustomData_has_layer(&me->ldata, CD_ORIGSPACE_MLOOP)) {
+ CustomData_add_layer(&me->ldata, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL, me->totloop);
+ mesh_init_origspace(me);
}
}
- Mesh *new_mesh = modifier_applyModifier_ensure_normals(md, &mectx_apply, mesh);
- ASSERT_IS_VALID_MESH(new_mesh);
+ Mesh *me_next = modwrap_applyModifier(md, &mectx_apply, me);
+ ASSERT_IS_VALID_MESH(me_next);
- if (new_mesh) {
+ if (me_next) {
/* if the modifier returned a new mesh, release the old one */
- if (mesh && mesh != new_mesh) {
- BLI_assert(mesh != me);
- BKE_id_free(NULL, mesh);
+ if (me && me != me_next) {
+ BLI_assert(me != ob->data);
+ BKE_id_free(NULL, me);
}
-
- mesh = new_mesh;
+ me = me_next;
if (deformedVerts) {
- if (deformedVerts != inputVertexCos)
+ if (deformedVerts != inputVertexCos) {
MEM_freeN(deformedVerts);
-
+ }
deformedVerts = NULL;
}
}
/* create an orco mesh in parallel */
if (nextmask & CD_MASK_ORCO) {
- if (!orco_mesh) {
- orco_mesh = create_orco_mesh(ob, me, NULL, CD_ORCO);
+ if (!me_orco) {
+ me_orco = create_orco_mesh(ob, ob->data, NULL, CD_ORCO);
}
nextmask &= ~CD_MASK_ORCO;
- mesh_set_only_copy(orco_mesh, nextmask | CD_MASK_ORIGINDEX |
+ mesh_set_only_copy(me_orco, nextmask | CD_MASK_ORIGINDEX |
(mti->requiredDataMask ?
mti->requiredDataMask(ob, md) : 0));
- new_mesh = modifier_applyModifier_ensure_normals(md, &mectx_orco, orco_mesh);
- ASSERT_IS_VALID_MESH(new_mesh);
+ me_next = modwrap_applyModifier(md, &mectx_orco, me_orco);
+ ASSERT_IS_VALID_MESH(me_next);
- if (new_mesh) {
+ if (me_next) {
/* if the modifier returned a new mesh, release the old one */
- if (orco_mesh && orco_mesh != new_mesh) {
- BLI_assert(orco_mesh != me);
- BKE_id_free(NULL, orco_mesh);
+ if (me_orco && me_orco != me_next) {
+ BLI_assert(me_orco != ob->data);
+ BKE_id_free(NULL, me_orco);
}
- orco_mesh = new_mesh;
+ me_orco = me_next;
}
}
/* create cloth orco mesh in parallel */
if (nextmask & CD_MASK_CLOTH_ORCO) {
- if (!cloth_orco_mesh) {
- cloth_orco_mesh = create_orco_mesh(ob, me, NULL, CD_CLOTH_ORCO);
+ if (!me_orco_cloth) {
+ me_orco_cloth = create_orco_mesh(ob, ob->data, NULL, CD_CLOTH_ORCO);
}
nextmask &= ~CD_MASK_CLOTH_ORCO;
- mesh_set_only_copy(cloth_orco_mesh, nextmask | CD_MASK_ORIGINDEX);
+ mesh_set_only_copy(me_orco_cloth, nextmask | CD_MASK_ORIGINDEX);
- new_mesh = modifier_applyModifier_ensure_normals(md, &mectx_orco, cloth_orco_mesh);
- ASSERT_IS_VALID_DM(new_mesh);
+ me_next = modwrap_applyModifier(md, &mectx_orco, me_orco_cloth);
+ ASSERT_IS_VALID_DM(me_next);
- if (new_mesh) {
+ if (me_next) {
/* if the modifier returned a new mesh, release the old one */
- if (cloth_orco_mesh && cloth_orco_mesh != new_mesh) {
- BLI_assert(orco_mesh != me);
- BKE_id_free(NULL, cloth_orco_mesh);
+ if (me_orco_cloth && me_orco_cloth != me_next) {
+ BLI_assert(me_orco != ob->data);
+ BKE_id_free(NULL, me_orco_cloth);
}
- cloth_orco_mesh = new_mesh;
+ me_orco_cloth = me_next;
}
}
@@ -1840,7 +1727,7 @@ static void mesh_calc_modifiers(
if (md->type == eModifierType_DynamicPaint)
append_mask |= CD_MASK_PREVIEW_MLOOPCOL;
- mesh->runtime.deformed_only = false;
+ me->runtime.deformed_only = false;
}
isPrevDeform = (mti->type == eModifierTypeType_OnlyDeform);
@@ -1861,45 +1748,43 @@ static void mesh_calc_modifiers(
* need to apply these back onto the Mesh. If we have no
* Mesh then we need to build one.
*/
- Mesh *final_mesh;
-
- if (mesh) {
- final_mesh = mesh;
+ if (me) {
+ *r_final = me;
if (deformedVerts) {
- BKE_mesh_apply_vert_coords(final_mesh, deformedVerts);
+ BKE_mesh_apply_vert_coords(*r_final, deformedVerts);
}
}
else {
- final_mesh = BKE_mesh_copy_for_eval(me, true);
+ *r_final = BKE_mesh_copy_for_eval(ob->data, true);
- //if (build_shapekey_layers) {
- // add_shapekey_layers(final_mesh, me, ob);
- //}
+ if (build_shapekey_layers) {
+ add_shapekey_layers(*r_final, ob->data, ob);
+ }
if (deformedVerts) {
- BKE_mesh_apply_vert_coords(final_mesh, deformedVerts);
+ BKE_mesh_apply_vert_coords(*r_final, deformedVerts);
}
}
/* add an orco layer if needed */
if (dataMask & CD_MASK_ORCO) {
- add_orco_mesh(ob, NULL, final_mesh, orco_mesh, CD_ORCO);
+ add_orco_mesh(ob, NULL, *r_final, me_orco, CD_ORCO);
- if (r_deform_mesh && *r_deform_mesh)
- add_orco_mesh(ob, NULL, *r_deform_mesh, NULL, CD_ORCO);
+ if (r_deform && *r_deform)
+ add_orco_mesh(ob, NULL, *r_deform, NULL, CD_ORCO);
}
if (do_loop_normals) {
/* Compute loop normals (note: will compute poly and vert normals as well, if needed!) */
- BKE_mesh_calc_normals_split(final_mesh);
- BKE_mesh_tessface_clear(final_mesh);
+ BKE_mesh_calc_normals_split(*r_final);
+ BKE_mesh_tessface_clear(*r_final);
}
if (sculpt_dyntopo == false) {
/* watch this! after 2.75a we move to from tessface to looptri (by default) */
if (dataMask & CD_MASK_MFACE) {
- BKE_mesh_tessface_ensure(final_mesh);
+ BKE_mesh_tessface_ensure(*r_final);
}
/* without this, drawing ngon tri's faces will show ugly tessellated face
@@ -1912,23 +1797,21 @@ static void mesh_calc_modifiers(
* If using loop normals, poly nors have already been computed.
*/
if (!do_loop_normals) {
- mesh_ensure_display_normals(final_mesh);
+ BKE_mesh_ensure_normals_for_display(*r_final);
}
}
/* Some modifiers, like datatransfer, may generate those data as temp layer, we do not want to keep them,
* as they are used by display code when available (i.e. even if autosmooth is disabled). */
- if (!do_loop_normals && CustomData_has_layer(&final_mesh->ldata, CD_NORMAL)) {
- CustomData_free_layers(&final_mesh->ldata, CD_NORMAL, final_mesh->totloop);
+ if (!do_loop_normals && CustomData_has_layer(&(*r_final)->ldata, CD_NORMAL)) {
+ CustomData_free_layers(&(*r_final)->ldata, CD_NORMAL, (*r_final)->totloop);
}
- *r_final_mesh = final_mesh;
-
- if (orco_mesh) {
- BKE_id_free(NULL, orco_mesh);
+ if (me_orco) {
+ BKE_id_free(NULL, me_orco);
}
- if (cloth_orco_mesh) {
- BKE_id_free(NULL, cloth_orco_mesh);
+ if (me_orco_cloth) {
+ BKE_id_free(NULL, me_orco_cloth);
}
if (deformedVerts && deformedVerts != inputVertexCos)
@@ -1979,7 +1862,7 @@ float (*editbmesh_get_vertex_cos(BMEditMesh *em, int *r_numVerts))[3]
return cos;
}
-bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *dm)
+bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, bool has_prev_mesh)
{
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
@@ -1988,7 +1871,7 @@ bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *
return false;
}
- if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) {
+ if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && has_prev_mesh) {
modifier_setError(md, "Modifier requires original data, bad stack position");
return false;
}
@@ -2000,17 +1883,15 @@ static void editbmesh_calc_modifiers(
struct Depsgraph *depsgraph, Scene *scene, Object *ob,
BMEditMesh *em, CustomDataMask dataMask,
/* return args */
- DerivedMesh **r_cage, DerivedMesh **r_final)
+ Mesh **r_cage, Mesh **r_final)
{
ModifierData *md;
float (*deformedVerts)[3] = NULL;
CustomDataMask mask = 0, append_mask = 0;
- DerivedMesh *dm = NULL, *orcodm = NULL;
int i, numVerts = 0, cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
CDMaskLink *datamasks, *curr;
const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
-
- const bool do_init_statvis = false;
+ const bool do_init_statvis = false; /* FIXME: use V3D_OVERLAY_EDIT_STATVIS. */
VirtualModifierData virtualModifierData;
/* TODO(sybren): do we really need multiple objects, or shall we change the flags where needed? */
@@ -2019,12 +1900,11 @@ static void editbmesh_calc_modifiers(
const ModifierEvalContext mectx_cache = {depsgraph, ob, MOD_APPLY_USECACHE};
const bool do_loop_normals = (((Mesh *)(ob->data))->flag & ME_AUTOSMOOTH) != 0;
- const float loop_normals_split_angle = ((Mesh *)(ob->data))->smoothresh;
modifiers_clearErrors(ob);
if (r_cage && cageIndex == -1) {
- *r_cage = getEditDerivedBMesh(em, ob, dataMask, NULL);
+ *r_cage = BKE_mesh_from_editmesh_with_coords_thin_wrap(em, dataMask, NULL);
}
md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
@@ -2033,18 +1913,23 @@ static void editbmesh_calc_modifiers(
datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, NULL, 0);
curr = datamasks;
+
+ Mesh *me = NULL;
+ Mesh *me_orco = NULL;
+
for (i = 0; md; i++, md = md->next, curr = curr->next) {
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- if (!editbmesh_modifier_is_enabled(scene, md, dm)) {
+ if (!editbmesh_modifier_is_enabled(scene, md, me != NULL)) {
continue;
}
/* add an orco layer if needed by this modifier */
- if (dm && mti->requiredDataMask) {
+ if (me && mti->requiredDataMask) {
mask = mti->requiredDataMask(ob, md);
- if (mask & CD_MASK_ORCO)
- add_orco_dm(ob, em, dm, orcodm, CD_ORCO);
+ if (mask & CD_MASK_ORCO) {
+ add_orco_mesh(ob, em, me, me_orco, CD_ORCO);
+ }
}
/* How to apply modifier depends on (a) what we already have as
@@ -2055,15 +1940,12 @@ static void editbmesh_calc_modifiers(
if (mti->type == eModifierTypeType_OnlyDeform) {
/* No existing verts to deform, need to build them. */
if (!deformedVerts) {
- if (dm) {
+ if (me) {
/* Deforming a derived mesh, read the vertex locations
* out of the mesh and deform them. Once done with this
* run of deformers verts will be written back.
*/
- numVerts = dm->getNumVerts(dm);
- deformedVerts =
- MEM_malloc_arrayN(numVerts, sizeof(*deformedVerts), "dfmv");
- dm->getVertCos(dm, deformedVerts);
+ deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
}
else {
deformedVerts = editbmesh_get_vertex_cos(em, &numVerts);
@@ -2071,60 +1953,63 @@ static void editbmesh_calc_modifiers(
}
if (mti->deformVertsEM)
- modwrap_deformVertsEM(md, &mectx, em, dm, deformedVerts, numVerts);
+ modwrap_deformVertsEM(md, &mectx, em, me, deformedVerts, numVerts);
else
- modwrap_deformVerts(md, &mectx, dm, deformedVerts, numVerts);
+ modwrap_deformVerts(md, &mectx, me, deformedVerts, numVerts);
}
else {
- DerivedMesh *ndm;
+ Mesh *me_next;
/* apply vertex coordinates or build a DerivedMesh as necessary */
- if (dm) {
+ if (me) {
if (deformedVerts) {
- DerivedMesh *tdm = CDDM_copy(dm);
- if (!(r_cage && dm == *r_cage)) {
- dm->release(dm);
- }
- dm = tdm;
+ Mesh *me_temp = BKE_mesh_copy_for_eval(me, false);
- CDDM_apply_vert_coords(dm, deformedVerts);
+ if (!(r_cage && me == *r_cage)) {
+ BKE_id_free(NULL, me);
+ }
+ me = me_temp;
+ BKE_mesh_apply_vert_coords(me, deformedVerts);
}
- else if (r_cage && dm == *r_cage) {
- /* dm may be changed by this modifier, so we need to copy it */
- dm = CDDM_copy(dm);
+ else if (r_cage && me == *r_cage) {
+ /* 'me' may be changed by this modifier, so we need to copy it. */
+ me = BKE_mesh_copy_for_eval(me, false);
}
}
else {
- dm = CDDM_from_editbmesh(em, false, false);
- ASSERT_IS_VALID_DM(dm);
+ me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
+ ASSERT_IS_VALID_MESH(me);
if (deformedVerts) {
- CDDM_apply_vert_coords(dm, deformedVerts);
+ BKE_mesh_apply_vert_coords(me, deformedVerts);
}
}
/* create an orco derivedmesh in parallel */
mask = curr->mask;
if (mask & CD_MASK_ORCO) {
- if (!orcodm)
- orcodm = create_orco_dm(ob, ob->data, em, CD_ORCO);
+ if (!me_orco) {
+ me_orco = create_orco_mesh(ob, ob->data, em, CD_ORCO);
+ }
mask &= ~CD_MASK_ORCO;
- DM_set_only_copy(orcodm, mask | CD_MASK_ORIGINDEX);
+ mesh_set_only_copy(me_orco, mask | CD_MASK_ORIGINDEX);
if (mti->applyModifierEM) {
- ndm = modwrap_applyModifierEM(md, &mectx_orco, em, orcodm);
+ me_next = modwrap_applyModifierEM(md, &mectx_orco, em, me_orco);
}
else {
- ndm = modwrap_applyModifier(md, &mectx_orco, orcodm);
+ me_next = modwrap_applyModifier(md, &mectx_orco, me_orco);
}
- ASSERT_IS_VALID_DM(ndm);
+ ASSERT_IS_VALID_MESH(me_next);
- if (ndm) {
+ if (me_next) {
/* if the modifier returned a new dm, release the old one */
- if (orcodm && orcodm != ndm) orcodm->release(orcodm);
- orcodm = ndm;
+ if (me_orco && me_orco != me_next) {
+ BKE_id_free(NULL, me_orco);
+ }
+ me_orco = me_next;
}
}
@@ -2132,52 +2017,53 @@ static void editbmesh_calc_modifiers(
mask |= append_mask;
mask = curr->mask; /* CD_MASK_ORCO may have been cleared above */
- DM_set_only_copy(dm, mask | CD_MASK_ORIGINDEX);
+ mesh_set_only_copy(me, mask | CD_MASK_ORIGINDEX);
if (mask & CD_MASK_ORIGSPACE_MLOOP) {
- if (!CustomData_has_layer(&dm->loopData, CD_ORIGSPACE_MLOOP)) {
- DM_add_loop_layer(dm, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL);
- DM_init_origspace(dm);
+ if (!CustomData_has_layer(&me->ldata, CD_ORIGSPACE_MLOOP)) {
+ CustomData_add_layer(&me->ldata, CD_ORIGSPACE_MLOOP, CD_CALLOC, NULL, me->totloop);
+ mesh_init_origspace(me);
}
}
- if (mti->applyModifierEM)
- ndm = modwrap_applyModifierEM(md, &mectx_cache, em, dm);
- else
- ndm = modwrap_applyModifier(md, &mectx_cache, dm);
- ASSERT_IS_VALID_DM(ndm);
-
- if (ndm) {
- if (dm && dm != ndm)
- dm->release(dm);
+ if (mti->applyModifierEM) {
+ me_next = modwrap_applyModifierEM(md, &mectx_cache, em, me);
+ }
+ else {
+ me_next = modwrap_applyModifier(md, &mectx_cache, me);
+ }
+ ASSERT_IS_VALID_MESH(me_next);
- dm = ndm;
+ if (me_next) {
+ if (me && me != me_next) {
+ BKE_id_free(NULL, me);
+ }
+ me = me_next;
if (deformedVerts) {
MEM_freeN(deformedVerts);
deformedVerts = NULL;
}
}
-
- dm->deformedOnly = false;
+ me->runtime.deformed_only = false;
}
if (r_cage && i == cageIndex) {
- if (dm && deformedVerts) {
- *r_cage = CDDM_copy(dm);
- CDDM_apply_vert_coords(*r_cage, deformedVerts);
+ if (me && deformedVerts) {
+ *r_cage = BKE_mesh_copy_for_eval(me, false);
+ BKE_mesh_apply_vert_coords(*r_cage, deformedVerts);
}
- else if (dm) {
- *r_cage = dm;
+ else if (me) {
+ *r_cage = me;
}
else {
- struct Mesh *mesh = ob->data;
- if (mesh->id.tag & LIB_TAG_COPIED_ON_WRITE) {
- BKE_mesh_runtime_ensure_edit_data(mesh);
- mesh->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts);
+ Mesh *me_orig = ob->data;
+ if (me_orig->id.tag & LIB_TAG_COPIED_ON_WRITE) {
+ BKE_mesh_runtime_ensure_edit_data(me_orig);
+ me_orig->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts);
}
- *r_cage = getEditDerivedBMesh(
- em, ob, mask,
+ *r_cage = BKE_mesh_from_editmesh_with_coords_thin_wrap(
+ em, mask,
deformedVerts ? MEM_dupallocN(deformedVerts) : NULL);
}
}
@@ -2189,48 +2075,44 @@ static void editbmesh_calc_modifiers(
* to apply these back onto the DerivedMesh. If we have no DerivedMesh
* then we need to build one.
*/
- if (dm && deformedVerts) {
- *r_final = CDDM_copy(dm);
+ if (me && deformedVerts) {
+ *r_final = BKE_mesh_copy_for_eval(me, false);
- if (!(r_cage && dm == *r_cage)) {
- dm->release(dm);
+ if (!(r_cage && me == *r_cage)) {
+ BKE_id_free(NULL, me);
}
-
- CDDM_apply_vert_coords(*r_final, deformedVerts);
+ BKE_mesh_apply_vert_coords(*r_final, deformedVerts);
}
- else if (dm) {
- *r_final = dm;
+ else if (me) {
+ *r_final = me;
}
else if (!deformedVerts && r_cage && *r_cage) {
/* cage should already have up to date normals */
*r_final = *r_cage;
/* In this case, we should never have weight-modifying modifiers in stack... */
- if (do_init_statvis)
- DM_update_statvis_color(scene, ob, *r_final);
+ if (do_init_statvis) {
+ editmesh_update_statvis_color(scene, ob);
+ }
}
else {
/* this is just a copy of the editmesh, no need to calc normals */
- struct Mesh *mesh = ob->data;
- if (mesh->id.tag & LIB_TAG_COPIED_ON_WRITE) {
- BKE_mesh_runtime_ensure_edit_data(mesh);
- if (mesh->runtime.edit_data->vertexCos != NULL)
- MEM_freeN((void *)mesh->runtime.edit_data->vertexCos);
- mesh->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts);
- }
- *r_final = getEditDerivedBMesh(em, ob, dataMask, deformedVerts);
+ *r_final = BKE_mesh_from_editmesh_with_coords_thin_wrap(em, dataMask, deformedVerts);
deformedVerts = NULL;
/* In this case, we should never have weight-modifying modifiers in stack... */
- if (do_init_statvis)
- DM_update_statvis_color(scene, ob, *r_final);
+ if (do_init_statvis) {
+ editmesh_update_statvis_color(scene, ob);
+ }
}
if (do_loop_normals) {
/* Compute loop normals */
- DM_calc_loop_normals(*r_final, do_loop_normals, loop_normals_split_angle);
+ BKE_mesh_calc_normals_split(*r_final);
+ BKE_mesh_tessface_clear(*r_final);
if (r_cage && *r_cage && (*r_cage != *r_final)) {
- DM_calc_loop_normals(*r_cage, do_loop_normals, loop_normals_split_angle);
+ BKE_mesh_calc_normals_split(*r_cage);
+ BKE_mesh_tessface_clear(*r_cage);
}
}
@@ -2239,13 +2121,13 @@ static void editbmesh_calc_modifiers(
* check if the derived meshes are DM_TYPE_EDITBMESH before calling, this isn't essential
* but quiets annoying error messages since tessfaces wont be created. */
if (dataMask & CD_MASK_MFACE) {
- if ((*r_final)->type != DM_TYPE_EDITBMESH) {
- DM_ensure_tessface(*r_final);
+ if ((*r_final)->edit_btmesh == NULL) {
+ BKE_mesh_tessface_ensure(*r_final);
}
if (r_cage && *r_cage) {
- if ((*r_cage)->type != DM_TYPE_EDITBMESH) {
+ if ((*r_cage)->edit_btmesh == NULL) {
if (*r_cage != *r_final) {
- DM_ensure_tessface(*r_cage);
+ BKE_mesh_tessface_ensure(*r_cage);
}
}
}
@@ -2254,27 +2136,29 @@ static void editbmesh_calc_modifiers(
/* same as mesh_calc_modifiers (if using loop normals, poly nors have already been computed). */
if (!do_loop_normals) {
- dm_ensure_display_normals(*r_final);
+ BKE_mesh_ensure_normals_for_display(*r_final);
/* Some modifiers, like datatransfer, may generate those data, we do not want to keep them,
* as they are used by display code when available (i.e. even if autosmooth is disabled). */
- if (CustomData_has_layer(&(*r_final)->loopData, CD_NORMAL)) {
- CustomData_free_layers(&(*r_final)->loopData, CD_NORMAL, (*r_final)->numLoopData);
+ if (CustomData_has_layer(&(*r_final)->ldata, CD_NORMAL)) {
+ CustomData_free_layers(&(*r_final)->ldata, CD_NORMAL, (*r_final)->totloop);
}
- if (r_cage && CustomData_has_layer(&(*r_cage)->loopData, CD_NORMAL)) {
- CustomData_free_layers(&(*r_cage)->loopData, CD_NORMAL, (*r_cage)->numLoopData);
+ if (r_cage && CustomData_has_layer(&(*r_cage)->ldata, CD_NORMAL)) {
+ CustomData_free_layers(&(*r_cage)->ldata, CD_NORMAL, (*r_cage)->totloop);
}
}
/* add an orco layer if needed */
if (dataMask & CD_MASK_ORCO)
- add_orco_dm(ob, em, *r_final, orcodm, CD_ORCO);
+ add_orco_mesh(ob, em, *r_final, me_orco, CD_ORCO);
- if (orcodm)
- orcodm->release(orcodm);
+ if (me_orco) {
+ BKE_id_free(NULL, me_orco);
+ }
- if (deformedVerts)
+ if (deformedVerts) {
MEM_freeN(deformedVerts);
+ }
}
static void mesh_finalize_eval(Object *object)
@@ -2368,17 +2252,23 @@ static void editbmesh_build_data(
BKE_editmesh_free_derivedmesh(em);
+ Mesh *me_cage;
+ Mesh *me_final;
+
editbmesh_calc_modifiers(
depsgraph, scene, obedit, em, dataMask,
- &em->derivedCage, &em->derivedFinal);
+ &me_cage, &me_final);
+ em->mesh_eval_final = me_final;
+ em->mesh_eval_cage = me_cage;
+
+#if 0
DM_set_object_boundbox(obedit, em->derivedFinal);
+#endif
em->lastDataMask = dataMask;
- em->derivedFinal->needsFree = 0;
- em->derivedCage->needsFree = 0;
- BLI_assert(!(em->derivedFinal->dirty & DM_DIRTY_NORMALS));
+ BLI_assert(!(em->mesh_eval_final->runtime.cd_dirty_vert & DM_DIRTY_NORMALS));
}
static CustomDataMask object_get_datamask(const Depsgraph *depsgraph, Object *ob, bool *r_need_mapping)
@@ -2409,6 +2299,10 @@ static CustomDataMask object_get_datamask(const Depsgraph *depsgraph, Object *ob
mask |= CD_MASK_MLOOPCOL;
}
+ if (ob->mode & OB_MODE_WEIGHT_PAINT) {
+ mask |= CD_MASK_MDEFORMVERT;
+ }
+
if (ob->mode & OB_MODE_EDIT)
mask |= CD_MASK_MVERT_SKIN;
}
@@ -2516,6 +2410,8 @@ Mesh *mesh_get_eval_deform(struct Depsgraph *depsgraph, Scene *scene, Object *ob
}
+#ifdef USE_DERIVEDMESH
+/* Deprecated, use `mesh_create_eval_final_render` instead. */
DerivedMesh *mesh_create_derived_render(struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask)
{
DerivedMesh *final;
@@ -2526,6 +2422,17 @@ DerivedMesh *mesh_create_derived_render(struct Depsgraph *depsgraph, Scene *scen
return final;
}
+#endif
+Mesh *mesh_create_eval_final_render(struct Depsgraph *depsgraph, Scene *scene, Object *ob, CustomDataMask dataMask)
+{
+ Mesh *final;
+
+ mesh_calc_modifiers(
+ depsgraph, scene, ob, NULL, 1, false, dataMask, -1, false, false,
+ NULL, &final);
+
+ return final;
+}
#ifdef USE_DERIVEDMESH
/* Deprecated, use `mesh_create_eval_final_index_render` instead. */
@@ -2540,7 +2447,7 @@ DerivedMesh *mesh_create_derived_index_render(struct Depsgraph *depsgraph, Scene
return final;
}
#endif
-struct Mesh *mesh_create_eval_final_index_render(
+Mesh *mesh_create_eval_final_index_render(
struct Depsgraph *depsgraph, struct Scene *scene,
struct Object *ob, CustomDataMask dataMask, int index)
{
@@ -2613,29 +2520,29 @@ DerivedMesh *mesh_create_derived_no_deform(
/***/
-DerivedMesh *editbmesh_get_derived_cage_and_final(
+Mesh *editbmesh_get_eval_cage_and_final(
struct Depsgraph *depsgraph, Scene *scene, Object *obedit, BMEditMesh *em,
CustomDataMask dataMask,
/* return args */
- DerivedMesh **r_final)
+ Mesh **r_final)
{
/* if there's no derived mesh or the last data mask used doesn't include
* the data we need, rebuild the derived mesh
*/
dataMask |= object_get_datamask(depsgraph, obedit, NULL);
- if (!em->derivedCage ||
+ if (!em->mesh_eval_cage ||
(em->lastDataMask & dataMask) != dataMask)
{
editbmesh_build_data(depsgraph, scene, obedit, em, dataMask);
}
- *r_final = em->derivedFinal;
- if (em->derivedFinal) { BLI_assert(!(em->derivedFinal->dirty & DM_DIRTY_NORMALS)); }
- return em->derivedCage;
+ *r_final = em->mesh_eval_final;
+ if (em->mesh_eval_final) { BLI_assert(!(em->mesh_eval_final->runtime.cd_dirty_vert & DM_DIRTY_NORMALS)); }
+ return em->mesh_eval_cage;
}
-DerivedMesh *editbmesh_get_derived_cage(
+Mesh *editbmesh_get_eval_cage(
struct Depsgraph *depsgraph, Scene *scene, Object *obedit, BMEditMesh *em,
CustomDataMask dataMask)
{
@@ -2644,45 +2551,17 @@ DerivedMesh *editbmesh_get_derived_cage(
*/
dataMask |= object_get_datamask(depsgraph, obedit, NULL);
- if (!em->derivedCage ||
+ if (!em->mesh_eval_cage ||
(em->lastDataMask & dataMask) != dataMask)
{
editbmesh_build_data(depsgraph, scene, obedit, em, dataMask);
}
- return em->derivedCage;
-}
-
-DerivedMesh *editbmesh_get_derived_base(Object *obedit, BMEditMesh *em, CustomDataMask data_mask)
-{
- return getEditDerivedBMesh(em, obedit, data_mask, NULL);
+ return em->mesh_eval_cage;
}
/***/
-/* get derived mesh from an object, using editbmesh if available. */
-DerivedMesh *object_get_derived_final(Object *ob, const bool for_render)
-{
- if (for_render) {
- /* TODO(sergey): use proper derived render here in the future. */
- return ob->derivedFinal;
- }
-
- /* only return the editmesh if its from this object because
- * we don't a mesh from another object's modifier stack: T43122 */
- if (ob->type == OB_MESH) {
- Mesh *me = ob->data;
- BMEditMesh *em = me->edit_btmesh;
- if (em && (em->ob == ob)) {
- DerivedMesh *dm = em->derivedFinal;
- return dm;
- }
- }
-
- return ob->derivedFinal;
-}
-
-
/* UNUSED */
#if 0
@@ -2764,20 +2643,20 @@ static void make_vertexcos__mapFunc(
}
}
-void mesh_get_mapped_verts_coords(DerivedMesh *dm, float (*r_cos)[3], const int totcos)
+void mesh_get_mapped_verts_coords(Mesh *me_eval, float (*r_cos)[3], const int totcos)
{
- if (dm->foreachMappedVert) {
+ if (me_eval->runtime.deformed_only == false) {
MappedUserData userData;
memset(r_cos, 0, sizeof(*r_cos) * totcos);
userData.vertexcos = r_cos;
userData.vertex_visit = BLI_BITMAP_NEW(totcos, "vertexcos flags");
- dm->foreachMappedVert(dm, make_vertexcos__mapFunc, &userData, DM_FOREACH_NOP);
+ BKE_mesh_foreach_mapped_vert(me_eval, make_vertexcos__mapFunc, &userData, MESH_FOREACH_NOP);
MEM_freeN(userData.vertex_visit);
}
else {
- int i;
- for (i = 0; i < totcos; i++) {
- dm->getVertCo(dm, i, r_cos[i]);
+ MVert *mv = me_eval->mvert;
+ for (int i = 0; i < totcos; i++, mv++) {
+ copy_v3_v3(r_cos[i], mv->co);
}
}
}
@@ -3013,7 +2892,6 @@ char *DM_debug_info(DerivedMesh *dm)
BLI_dynstr_appendf(dynstr, " 'ptr': '%p',\n", (void *)dm);
switch (dm->type) {
case DM_TYPE_CDDM: tstr = "DM_TYPE_CDDM"; break;
- case DM_TYPE_EDITBMESH: tstr = "DM_TYPE_EDITMESH"; break;
case DM_TYPE_CCGDM: tstr = "DM_TYPE_CCGDM"; break;
default: tstr = "UNKNOWN"; break;
}
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 17a708fc3ba..22059a1ff0a 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -1059,9 +1059,10 @@ static void armature_bbone_defmats_cb(void *userdata, Link *iter, int index)
}
}
-void armature_deform_verts(Object *armOb, Object *target, const Mesh * mesh, float (*vertexCos)[3],
- float (*defMats)[3][3], int numVerts, int deformflag,
- float (*prevCos)[3], const char *defgrp_name, bGPDstroke *gps)
+void armature_deform_verts(
+ Object *armOb, Object *target, const Mesh *mesh, float (*vertexCos)[3],
+ float (*defMats)[3][3], int numVerts, int deformflag,
+ float (*prevCos)[3], const char *defgrp_name, bGPDstroke *gps)
{
bPoseChanDeform *pdef_info_array;
bPoseChanDeform *pdef_info = NULL;
diff --git a/source/blender/blenkernel/intern/bmfont.c b/source/blender/blenkernel/intern/bmfont.c
deleted file mode 100644
index c99894bfbaf..00000000000
--- a/source/blender/blenkernel/intern/bmfont.c
+++ /dev/null
@@ -1,293 +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) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): 04-10-2000 frank.
- *
- * ***** END GPL LICENSE BLOCK *****
- *
- */
-
-/** \file blender/blenkernel/intern/bmfont.c
- * \ingroup bke
- */
-
-
-/**
- * Two external functions:
- *
- * void detectBitmapFont(ImBuf *ibuf)
- * detects if an image buffer contains a bitmap font. It makes the
- * specific bitmap data which is stored in the bitmap invisible to blender.
- *
- * void matrixGlyph(ImBuf *ibuf, unsigned short unicode, *float x 7)
- * returns all the information about the character (unicode) in the floats
- *
- * Room for improvement:
- * add kerning data in the bitmap
- * all calculations in matrixGlyph() are static and could be done during
- * initialization
- */
-
-#include <stdio.h>
-
-#include "MEM_guardedalloc.h"
-#include "IMB_imbuf_types.h"
-
-#include "BLI_utildefines.h"
-
-#include "BKE_bmfont.h"
-#include "BKE_bmfont_types.h"
-#include "BKE_global.h"
-
-void printfGlyph(bmGlyph *glyph)
-{
- printf("unicode: %d '%c'\n", glyph->unicode, glyph->unicode);
- printf(" locx: %4d locy: %4d\n", glyph->locx, glyph->locy);
- printf(" sizex: %3d sizey: %3d\n", glyph->sizex, glyph->sizey);
- printf(" ofsx: %3d ofsy: %3d\n", glyph->ofsx, glyph->ofsy);
- printf(" advan: %3d reser: %3d\n", glyph->advance, glyph->reserved);
-}
-
-void calcAlpha(ImBuf *ibuf)
-{
- int i;
- char *rect;
-
- if (ibuf) {
- rect = (char *) ibuf->rect;
- for (i = ibuf->x * ibuf->y; i > 0; i--) {
- rect[3] = MAX3(rect[0], rect[1], rect[2]);
- rect += 4;
- }
- }
-}
-
-void readBitmapFontVersion0(ImBuf *ibuf, unsigned char *rect, int step)
-{
- int glyphcount, bytes, i, index, linelength, ysize;
- unsigned char *buffer;
- bmFont * bmfont;
-
- linelength = ibuf->x * step;
-
- glyphcount = (rect[6 * step] << 8) | rect[7 * step];
- bytes = ((glyphcount - 1) * sizeof(bmGlyph)) + sizeof(bmFont);
-
- ysize = (bytes + (ibuf->x - 1)) / ibuf->x;
-
- if (ysize < ibuf->y) {
- /* we're first going to copy all data into a linear buffer.
- * step can be 4 or 1 bytes, and the data is not sequential because
- * the bitmap was flipped vertically. */
-
- buffer = MEM_mallocN(bytes, "readBitmapFontVersion0:buffer");
-
- index = 0;
- for (i = 0; i < bytes; i++) {
- buffer[i] = rect[index];
- index += step;
- if (index >= linelength) {
- /* we've read one line, no skip to the line *before* that */
- rect -= linelength;
- index -= linelength;
- }
- }
-
- /* we're now going to endian convert the data */
-
- bmfont = MEM_mallocN(bytes, "readBitmapFontVersion0:bmfont");
- index = 0;
-
- /* first read the header */
- bmfont->magic[0] = buffer[index++];
- bmfont->magic[1] = buffer[index++];
- bmfont->magic[2] = buffer[index++];
- bmfont->magic[3] = buffer[index++];
- bmfont->version = (buffer[index] << 8) | buffer[index + 1]; index += 2;
- bmfont->glyphcount = (buffer[index] << 8) | buffer[index + 1]; index += 2;
- bmfont->xsize = (buffer[index] << 8) | buffer[index + 1]; index += 2;
- bmfont->ysize = (buffer[index] << 8) | buffer[index + 1]; index += 2;
-
- for (i = 0; i < bmfont->glyphcount; i++) {
- bmfont->glyphs[i].unicode = (buffer[index] << 8) | buffer[index + 1]; index += 2;
- bmfont->glyphs[i].locx = (buffer[index] << 8) | buffer[index + 1]; index += 2;
- bmfont->glyphs[i].locy = (buffer[index] << 8) | buffer[index + 1]; index += 2;
- bmfont->glyphs[i].ofsx = buffer[index++];
- bmfont->glyphs[i].ofsy = buffer[index++];
- bmfont->glyphs[i].sizex = buffer[index++];
- bmfont->glyphs[i].sizey = buffer[index++];
- bmfont->glyphs[i].advance = buffer[index++];
- bmfont->glyphs[i].reserved = buffer[index++];
- if (G.debug & G_DEBUG) {
- printfGlyph(&bmfont->glyphs[i]);
- }
- }
-
- MEM_freeN(buffer);
-
- if (G.debug & G_DEBUG) {
- printf("Oldy = %d Newy = %d\n", ibuf->y, ibuf->y - ysize);
- printf("glyphcount = %d\n", glyphcount);
- printf("bytes = %d\n", bytes);
- }
-
- /* we've read the data from the image. Now we're going
- * to crop the image vertically so only the bitmap data
- * remains visible */
-
- ibuf->y -= ysize;
- ibuf->userdata = bmfont;
- ibuf->userflags |= IB_BITMAPFONT;
-
- if (ibuf->planes < 32) {
- /* we're going to fake alpha here: */
- calcAlpha(ibuf);
- }
- }
- else {
- printf("readBitmapFontVersion0: corrupted bitmapfont\n");
- }
-}
-
-void detectBitmapFont(ImBuf *ibuf)
-{
- unsigned char *rect;
- unsigned short version;
- int i;
-
- if (ibuf != NULL && ibuf->rect != NULL) {
- /* bitmap must have an x size that is a power of two */
- if (is_power_of_two(ibuf->x)) {
- rect = (unsigned char *) (ibuf->rect + (ibuf->x * (ibuf->y - 1)));
- /* printf ("starts with: %s %c %c %c %c\n", rect, rect[0], rect[1], rect[2], rect[3]); */
- if (rect[0] == 'B' && rect[1] == 'F' && rect[2] == 'N' && rect[3] == 'T') {
- /* printf("found 8bit font !\n");
- * round y size down
- * do the 8 bit font stuff. (not yet) */
- }
- else {
- /* we try all 4 possible combinations */
- for (i = 0; i < 4; i++) {
- if (rect[0] == 'B' && rect[4] == 'F' && rect[8] == 'N' && rect[12] == 'T') {
- /* printf("found 24bit font !\n");
- * We're going to parse the file: */
-
- version = (rect[16] << 8) | rect[20];
-
- if (version == 0) {
- readBitmapFontVersion0(ibuf, rect, 4);
- }
- else {
- printf("detectBitmapFont :Unsupported version %d\n", (int)version);
- }
-
- /* on success ibuf->userdata points to the bitmapfont */
- if (ibuf->userdata) {
- break;
- }
- }
- rect++;
- }
- }
- }
- }
-}
-
-int locateGlyph(bmFont *bmfont, unsigned short unicode)
-{
- int min, max, current = 0;
-
- if (bmfont) {
- min = 0;
- max = bmfont->glyphcount;
- while (1) {
- /* look halfway for glyph */
- current = (min + max) >> 1;
-
- if (bmfont->glyphs[current].unicode == unicode) {
- break;
- }
- else if (bmfont->glyphs[current].unicode < unicode) {
- /* have to move up */
- min = current;
- }
- else {
- /* have to move down */
- max = current;
- }
-
- if (max - min <= 1) {
- /* unable to locate glyph */
- current = 0;
- break;
- }
- }
- }
-
- return(current);
-}
-
-void matrixGlyph(
- ImBuf *ibuf, unsigned short unicode,
- float *centerx, float *centery,
- float *sizex, float *sizey,
- float *transx, float *transy,
- float *movex, float *movey,
- float *advance)
-{
- int index;
- bmFont *bmfont;
-
- *centerx = *centery = 0.0;
- *sizex = *sizey = 1.0;
- *transx = *transy = 0.0;
- *movex = *movey = 0.0;
- *advance = 1.0;
-
- if (ibuf) {
- bmfont = ibuf->userdata;
- if (bmfont && (ibuf->userflags & IB_BITMAPFONT)) {
- index = locateGlyph(bmfont, unicode);
- if (index) {
-
- *sizex = (bmfont->glyphs[index].sizex) / (float) (bmfont->glyphs[0].sizex);
- *sizey = (bmfont->glyphs[index].sizey) / (float) (bmfont->glyphs[0].sizey);
-
- *transx = bmfont->glyphs[index].locx / (float) ibuf->x;
- *transy = (ibuf->y - bmfont->glyphs[index].locy) / (float) ibuf->y;
-
- *centerx = bmfont->glyphs[0].locx / (float) ibuf->x;
- *centery = (ibuf->y - bmfont->glyphs[0].locy) / (float) ibuf->y;
-
- /* 2.0 units is the default size of an object */
-
- *movey = 1.0f - *sizey + 2.0f * (bmfont->glyphs[index].ofsy - bmfont->glyphs[0].ofsy) / (float) bmfont->glyphs[0].sizey;
- *movex = *sizex - 1.0f + 2.0f * (bmfont->glyphs[index].ofsx - bmfont->glyphs[0].ofsx) / (float) bmfont->glyphs[0].sizex;
-
- *advance = 2.0f * bmfont->glyphs[index].advance / (float) bmfont->glyphs[0].advance;
-
- // printfGlyph(&bmfont->glyphs[index]);
- // printf("%c %d %0.5f %0.5f %0.5f %0.5f %0.5f\n", unicode, index, *sizex, *sizey, *transx, *transy, *advance);
- }
- }
- }
-}
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 9043460562d..ef418fc68f5 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -752,6 +752,8 @@ static void loops_to_customdata_corners(
}
}
+/* TODO(campbell): remove, use BKE_mesh_from_bmesh_for_eval_nomain instead. */
+
/* used for both editbmesh and bmesh */
static DerivedMesh *cddm_from_bmesh_ex(
struct BMesh *bm, const bool use_mdisps,
diff --git a/source/blender/blenkernel/intern/crazyspace.c b/source/blender/blenkernel/intern/crazyspace.c
index 539b4723121..354cc4926f1 100644
--- a/source/blender/blenkernel/intern/crazyspace.c
+++ b/source/blender/blenkernel/intern/crazyspace.c
@@ -48,6 +48,7 @@
#include "BKE_multires.h"
#include "BKE_mesh.h"
#include "BKE_editmesh.h"
+#include "BKE_library.h"
BLI_INLINE void tan_calc_quat_v3(
float r_quat[4],
@@ -103,7 +104,7 @@ float (*BKE_crazyspace_get_mapped_editverts(
struct Depsgraph *depsgraph, Scene *scene, Object *obedit))[3]
{
Mesh *me = obedit->data;
- DerivedMesh *dm;
+ Mesh *me_eval;
float (*vertexcos)[3];
int nverts = me->edit_btmesh->bm->totvert;
@@ -116,11 +117,9 @@ float (*BKE_crazyspace_get_mapped_editverts(
/* now get the cage */
vertexcos = MEM_mallocN(sizeof(*vertexcos) * nverts, "vertexcos map");
- dm = editbmesh_get_derived_cage(depsgraph, scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH);
+ me_eval = editbmesh_get_eval_cage(depsgraph, scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH);
- mesh_get_mapped_verts_coords(dm, vertexcos, nverts);
-
- dm->release(dm);
+ mesh_get_mapped_verts_coords(me_eval, vertexcos, nverts);
/* set back the flag, no new cage needs to be built, transform does it */
modifiers_disable_subsurf_temporary(obedit);
@@ -256,7 +255,7 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(
float (**deformmats)[3][3], float (**deformcos)[3])
{
ModifierData *md;
- DerivedMesh *dm;
+ Mesh *me;
int i, a, numleft = 0, numVerts = 0;
int cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
@@ -265,7 +264,7 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(
modifiers_clearErrors(ob);
- dm = NULL;
+ me = NULL;
md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
/* compute the deformation matrices and coordinates for the first
@@ -274,7 +273,7 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(
for (i = 0; md && i <= cageIndex; i++, md = md->next) {
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- if (!editbmesh_modifier_is_enabled(scene, md, dm))
+ if (!editbmesh_modifier_is_enabled(scene, md, me != NULL))
continue;
if (mti->type == eModifierTypeType_OnlyDeform && mti->deformMatricesEM) {
@@ -285,26 +284,26 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(
data_mask = datamasks->mask;
BLI_linklist_free((LinkNode *)datamasks, NULL);
- dm = getEditDerivedBMesh(em, ob, data_mask, NULL);
+ me = BKE_mesh_from_editmesh_with_coords_thin_wrap(em, data_mask, NULL);
deformedVerts = editbmesh_get_vertex_cos(em, &numVerts);
defmats = MEM_mallocN(sizeof(*defmats) * numVerts, "defmats");
for (a = 0; a < numVerts; a++)
unit_m3(defmats[a]);
}
-
- modifier_deformMatricesEM_DM_deprecated(md, &mectx, em, dm, deformedVerts, defmats, numVerts);
+ mti->deformMatricesEM(md, &mectx, em, me, deformedVerts, defmats, numVerts);
}
else
break;
}
for (; md && i <= cageIndex; md = md->next, i++)
- if (editbmesh_modifier_is_enabled(scene, md, dm) && modifier_isCorrectableDeformed(md))
+ if (editbmesh_modifier_is_enabled(scene, md, me != NULL) && modifier_isCorrectableDeformed(md))
numleft++;
- if (dm)
- dm->release(dm);
+ if (me) {
+ BKE_id_free(NULL, me);
+ }
*deformmats = defmats;
*deformcos = deformedVerts;
@@ -317,14 +316,14 @@ int BKE_sculpt_get_first_deform_matrices(
Object *ob, float (**deformmats)[3][3], float (**deformcos)[3])
{
ModifierData *md;
- DerivedMesh *dm;
+ Mesh *me_eval;
int a, numVerts = 0;
float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0);
const bool has_multires = mmd != NULL && mmd->sculptlvl > 0;
int numleft = 0;
VirtualModifierData virtualModifierData;
- ModifierEvalContext mectx = {depsgraph, ob, 0};
+ const ModifierEvalContext mectx = {depsgraph, ob, 0};
if (has_multires) {
*deformmats = NULL;
@@ -332,7 +331,7 @@ int BKE_sculpt_get_first_deform_matrices(
return numleft;
}
- dm = NULL;
+ me_eval = NULL;
md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
for (; md; md = md->next) {
@@ -342,8 +341,8 @@ int BKE_sculpt_get_first_deform_matrices(
if (mti->type == eModifierTypeType_OnlyDeform) {
if (!defmats) {
- Mesh *me = (Mesh *)ob->data;
- dm = mesh_create_derived(me, NULL);
+ Mesh *me = ob->data;
+ me_eval = BKE_mesh_copy_for_eval(me, true);
deformedVerts = BKE_mesh_vertexCos_get(me, &numVerts);
defmats = MEM_callocN(sizeof(*defmats) * numVerts, "defmats");
@@ -352,7 +351,7 @@ int BKE_sculpt_get_first_deform_matrices(
}
if (mti->deformMatrices) {
- modifier_deformMatrices_DM_deprecated(md, &mectx, dm, deformedVerts, defmats, numVerts);
+ mti->deformMatrices(md, &mectx, me_eval, deformedVerts, defmats, numVerts);
}
else break;
}
@@ -367,8 +366,9 @@ int BKE_sculpt_get_first_deform_matrices(
numleft++;
}
- if (dm)
- dm->release(dm);
+ if (me_eval) {
+ BKE_id_free(NULL, me_eval);
+ }
*deformmats = defmats;
*deformcos = deformedVerts;
@@ -390,7 +390,7 @@ void BKE_crazyspace_build_sculpt(struct Depsgraph *depsgraph, Scene *scene, Obje
int i, deformed = 0;
VirtualModifierData virtualModifierData;
ModifierData *md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
- ModifierEvalContext mectx = {depsgraph, ob, 0};
+ const ModifierEvalContext mectx = {depsgraph, ob, 0};
Mesh *me = (Mesh *)ob->data;
for (; md; md = md->next) {
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
index 27d1ad01f2d..e6873e66c91 100644
--- a/source/blender/blenkernel/intern/editderivedmesh.c
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -51,8 +51,10 @@
#include "BKE_cdderivedmesh.h"
#include "BKE_deform.h"
#include "BKE_mesh.h"
+#include "BKE_mesh_iterators.h"
#include "BKE_editmesh.h"
#include "BKE_editmesh_bvh.h"
+#include "BKE_editmesh_cache.h"
#include "BKE_editmesh_tangent.h"
#include "DNA_scene_types.h"
@@ -61,986 +63,6 @@
#include "MEM_guardedalloc.h"
-typedef struct EditDerivedBMesh {
- DerivedMesh dm;
-
- BMEditMesh *em;
-
- EditMeshData emd;
-} EditDerivedBMesh;
-
-/* -------------------------------------------------------------------- */
-/* Lazy initialize datastructures */
-
-static void emDM_ensurePolyNormals(EditDerivedBMesh *bmdm);
-
-static void emDM_ensureVertNormals(EditDerivedBMesh *bmdm)
-{
- if (bmdm->emd.vertexCos && (bmdm->emd.vertexNos == NULL)) {
-
- BMesh *bm = bmdm->em->bm;
- const float (*vertexCos)[3], (*polyNos)[3];
- float (*vertexNos)[3];
-
- /* calculate vertex normals from poly normals */
- emDM_ensurePolyNormals(bmdm);
-
- BM_mesh_elem_index_ensure(bm, BM_FACE);
-
- polyNos = bmdm->emd.polyNos;
- vertexCos = bmdm->emd.vertexCos;
- vertexNos = MEM_callocN(sizeof(*vertexNos) * bm->totvert, __func__);
-
- BM_verts_calc_normal_vcos(bm, polyNos, vertexCos, vertexNos);
-
- bmdm->emd.vertexNos = (const float (*)[3])vertexNos;
- }
-}
-
-static void emDM_ensurePolyNormals(EditDerivedBMesh *bmdm)
-{
- if (bmdm->emd.vertexCos && (bmdm->emd.polyNos == NULL)) {
- BMesh *bm = bmdm->em->bm;
- const float (*vertexCos)[3];
- float (*polyNos)[3];
-
- BMFace *efa;
- BMIter fiter;
- int i;
-
- BM_mesh_elem_index_ensure(bm, BM_VERT);
-
- polyNos = MEM_mallocN(sizeof(*polyNos) * bm->totface, __func__);
-
- vertexCos = bmdm->emd.vertexCos;
-
- BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
- BM_elem_index_set(efa, i); /* set_inline */
- BM_face_calc_normal_vcos(bm, efa, polyNos[i], vertexCos);
- }
- bm->elem_index_dirty &= ~BM_FACE;
-
- bmdm->emd.polyNos = (const float (*)[3])polyNos;
- }
-}
-
-static void emDM_ensurePolyCenters(EditDerivedBMesh *bmdm)
-{
- if (bmdm->emd.polyCos == NULL) {
- BMesh *bm = bmdm->em->bm;
- float (*polyCos)[3];
-
- BMFace *efa;
- BMIter fiter;
- int i;
-
- polyCos = MEM_mallocN(sizeof(*polyCos) * bm->totface, __func__);
-
- if (bmdm->emd.vertexCos) {
- const float (*vertexCos)[3];
- vertexCos = bmdm->emd.vertexCos;
-
- BM_mesh_elem_index_ensure(bm, BM_VERT);
-
- BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
- BM_face_calc_center_mean_vcos(bm, efa, polyCos[i], vertexCos);
- }
- }
- else {
- BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
- BM_face_calc_center_mean(efa, polyCos[i]);
- }
- }
-
- bmdm->emd.polyCos = (const float (*)[3])polyCos;
- }
-}
-
-static void emDM_calcNormals(DerivedMesh *dm)
-{
- /* Nothing to do: normals are already calculated and stored on the
- * BMVerts and BMFaces */
- dm->dirty &= ~DM_DIRTY_NORMALS;
-}
-
-static void emDM_calcLoopNormalsSpaceArray(
- DerivedMesh *dm, const bool use_split_normals, const float split_angle, MLoopNorSpaceArray *r_lnors_spacearr);
-
-static void emDM_calcLoopNormals(DerivedMesh *dm, const bool use_split_normals, const float split_angle)
-{
- emDM_calcLoopNormalsSpaceArray(dm, use_split_normals, split_angle, NULL);
-}
-
-/* #define DEBUG_CLNORS */
-
-static void emDM_calcLoopNormalsSpaceArray(
- DerivedMesh *dm, const bool use_split_normals, const float split_angle, MLoopNorSpaceArray *r_lnors_spacearr)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- const float (*vertexCos)[3], (*vertexNos)[3], (*polyNos)[3];
- float (*loopNos)[3];
- short (*clnors_data)[2];
- int cd_loop_clnors_offset;
-
- /* calculate loop normals from poly and vertex normals */
- emDM_ensureVertNormals(bmdm);
- emDM_ensurePolyNormals(bmdm);
- dm->dirty &= ~DM_DIRTY_NORMALS;
-
- vertexCos = bmdm->emd.vertexCos;
- vertexNos = bmdm->emd.vertexNos;
- polyNos = bmdm->emd.polyNos;
-
- loopNos = dm->getLoopDataArray(dm, CD_NORMAL);
- if (!loopNos) {
- DM_add_loop_layer(dm, CD_NORMAL, CD_CALLOC, NULL);
- loopNos = dm->getLoopDataArray(dm, CD_NORMAL);
- }
-
- /* We can have both, give priority to dm's data, and fallback to bm's ones. */
- clnors_data = dm->getLoopDataArray(dm, CD_CUSTOMLOOPNORMAL);
- cd_loop_clnors_offset = clnors_data ? -1 : CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL);
-
- BM_loops_calc_normal_vcos(bm, vertexCos, vertexNos, polyNos, use_split_normals, split_angle, loopNos,
- r_lnors_spacearr, clnors_data, cd_loop_clnors_offset, false);
-#ifdef DEBUG_CLNORS
- if (r_lnors_spacearr) {
- int i;
- for (i = 0; i < numLoops; i++) {
- if (r_lnors_spacearr->lspacearr[i]->ref_alpha != 0.0f) {
- LinkNode *loops = r_lnors_spacearr->lspacearr[i]->loops;
- printf("Loop %d uses lnor space %p:\n", i, r_lnors_spacearr->lspacearr[i]);
- print_v3("\tfinal lnor:", loopNos[i]);
- print_v3("\tauto lnor:", r_lnors_spacearr->lspacearr[i]->vec_lnor);
- print_v3("\tref_vec:", r_lnors_spacearr->lspacearr[i]->vec_ref);
- printf("\talpha: %f\n\tbeta: %f\n\tloops: %p\n", r_lnors_spacearr->lspacearr[i]->ref_alpha,
- r_lnors_spacearr->lspacearr[i]->ref_beta, r_lnors_spacearr->lspacearr[i]->loops);
- printf("\t\t(shared with loops");
- while (loops) {
- printf(" %d", POINTER_AS_INT(loops->link));
- loops = loops->next;
- }
- printf(")\n");
- }
- else {
- printf("Loop %d has no lnor space\n", i);
- }
- }
- }
-#endif
-}
-
-static void emDM_calc_loop_tangents(
- DerivedMesh *dm, bool calc_active_tangent,
- const char (*tangent_names)[MAX_NAME], int tangent_names_len)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMEditMesh *em = bmdm->em;
-
- if (CustomData_number_of_layers(&em->bm->ldata, CD_MLOOPUV) == 0) {
- return;
- }
-
- const float (*poly_normals)[3] = bmdm->emd.polyNos;
- const float (*loop_normals)[3] = CustomData_get_layer(&dm->loopData, CD_NORMAL);
- const float (*vert_orco)[3] = dm->getVertDataArray(dm, CD_ORCO); /* can be NULL */
- BKE_editmesh_loop_tangent_calc(
- em, calc_active_tangent,
- tangent_names, tangent_names_len,
- poly_normals, loop_normals,
- vert_orco,
- &dm->loopData, dm->numLoopData,
- &dm->tangent_mask);
-}
-
-
-static void emDM_recalcTessellation(DerivedMesh *UNUSED(dm))
-{
- /* do nothing */
-}
-
-static void emDM_recalcLoopTri(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMLoop *(*looptris)[3] = bmdm->em->looptris;
- MLoopTri *mlooptri;
- const int tottri = bmdm->em->tottri;
- int i;
-
- DM_ensure_looptri_data(dm);
- mlooptri = dm->looptris.array_wip;
-
- BLI_assert(tottri == 0 || mlooptri != NULL);
- BLI_assert(poly_to_tri_count(dm->numPolyData, dm->numLoopData) == dm->looptris.num);
- BLI_assert(tottri == dm->looptris.num);
-
- BM_mesh_elem_index_ensure(bmdm->em->bm, BM_FACE | BM_LOOP);
-
- for (i = 0; i < tottri; i++) {
- BMLoop **ltri = looptris[i];
- MLoopTri *lt = &mlooptri[i];
-
- ARRAY_SET_ITEMS(
- lt->tri,
- BM_elem_index_get(ltri[0]),
- BM_elem_index_get(ltri[1]),
- BM_elem_index_get(ltri[2]));
- lt->poly = BM_elem_index_get(ltri[0]->f);
- }
-
- BLI_assert(dm->looptris.array == NULL);
- atomic_cas_ptr((void **)&dm->looptris.array, dm->looptris.array, dm->looptris.array_wip);
- dm->looptris.array_wip = NULL;
-}
-
-static void emDM_foreachMappedVert(
- DerivedMesh *dm,
- void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]),
- void *userData,
- DMForeachFlag flag)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMVert *eve;
- BMIter iter;
- int i;
-
- if (bmdm->emd.vertexCos) {
- const float (*vertexCos)[3] = bmdm->emd.vertexCos;
- const float (*vertexNos)[3];
-
- if (flag & DM_FOREACH_USE_NORMAL) {
- emDM_ensureVertNormals(bmdm);
- vertexNos = bmdm->emd.vertexNos;
- }
- else {
- vertexNos = NULL;
- }
-
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- const float *no = (flag & DM_FOREACH_USE_NORMAL) ? vertexNos[i] : NULL;
- func(userData, i, vertexCos[i], no, NULL);
- }
- }
- else {
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- const float *no = (flag & DM_FOREACH_USE_NORMAL) ? eve->no : NULL;
- func(userData, i, eve->co, no, NULL);
- }
- }
-}
-static void emDM_foreachMappedEdge(
- DerivedMesh *dm,
- void (*func)(void *userData, int index, const float v0co[3], const float v1co[3]),
- void *userData)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMEdge *eed;
- BMIter iter;
- int i;
-
- if (bmdm->emd.vertexCos) {
-
- BM_mesh_elem_index_ensure(bm, BM_VERT);
-
- BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) {
- func(userData, i,
- bmdm->emd.vertexCos[BM_elem_index_get(eed->v1)],
- bmdm->emd.vertexCos[BM_elem_index_get(eed->v2)]);
- }
- }
- else {
- BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) {
- func(userData, i, eed->v1->co, eed->v2->co);
- }
- }
-}
-
-static void emDM_foreachMappedLoop(
- DerivedMesh *dm,
- void (*func)(void *userData, int vertex_index, int face_index, const float co[3], const float no[3]),
- void *userData,
- DMForeachFlag flag)
-{
- /* We can't use dm->getLoopDataLayout(dm) here, we want to always access dm->loopData, EditDerivedBMesh would
- * return loop data from bmesh itself. */
- const float (*lnors)[3] = (flag & DM_FOREACH_USE_NORMAL) ? DM_get_loop_data_layer(dm, CD_NORMAL) : NULL;
-
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMFace *efa;
- BMIter iter;
-
- const float (*vertexCos)[3] = bmdm->emd.vertexCos;
- int f_idx;
-
- BM_mesh_elem_index_ensure(bm, BM_VERT);
-
- BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, f_idx) {
- BMLoop *l_iter, *l_first;
-
- l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
- do {
- const BMVert *eve = l_iter->v;
- const int v_idx = BM_elem_index_get(eve);
- const float *no = lnors ? *lnors++ : NULL;
- func(userData, v_idx, f_idx, vertexCos ? vertexCos[v_idx] : eve->co, no);
- } while ((l_iter = l_iter->next) != l_first);
- }
-}
-
-static void emDM_foreachMappedFaceCenter(
- DerivedMesh *dm,
- void (*func)(void *userData, int index, const float co[3], const float no[3]),
- void *userData,
- DMForeachFlag flag)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- const float (*polyNos)[3];
- const float (*polyCos)[3];
- BMFace *efa;
- BMIter iter;
- int i;
-
- emDM_ensurePolyCenters(bmdm);
- polyCos = bmdm->emd.polyCos; /* always set */
-
- if (flag & DM_FOREACH_USE_NORMAL) {
- emDM_ensurePolyNormals(bmdm);
- polyNos = bmdm->emd.polyNos; /* maybe NULL */
- }
- else {
- polyNos = NULL;
- }
-
- if (polyNos) {
- BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) {
- const float *no = polyNos[i];
- func(userData, i, polyCos[i], no);
- }
- }
- else {
- BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) {
- const float *no = (flag & DM_FOREACH_USE_NORMAL) ? efa->no : NULL;
- func(userData, i, polyCos[i], no);
- }
- }
-}
-
-static void emDM_getMinMax(DerivedMesh *dm, float r_min[3], float r_max[3])
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMVert *eve;
- BMIter iter;
- int i;
-
- if (bm->totvert) {
- if (bmdm->emd.vertexCos) {
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- minmax_v3v3_v3(r_min, r_max, bmdm->emd.vertexCos[i]);
- }
- }
- else {
- BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
- minmax_v3v3_v3(r_min, r_max, eve->co);
- }
- }
- }
- else {
- zero_v3(r_min);
- zero_v3(r_max);
- }
-}
-static int emDM_getNumVerts(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return bmdm->em->bm->totvert;
-}
-
-static int emDM_getNumEdges(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return bmdm->em->bm->totedge;
-}
-
-static int emDM_getNumTessFaces(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return bmdm->em->tottri;
-}
-
-static int emDM_getNumLoops(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return bmdm->em->bm->totloop;
-}
-
-static int emDM_getNumPolys(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return bmdm->em->bm->totface;
-}
-
-static void bmvert_to_mvert(BMesh *bm, BMVert *ev, MVert *r_vert)
-{
- const float *f;
-
- copy_v3_v3(r_vert->co, ev->co);
-
- normal_float_to_short_v3(r_vert->no, ev->no);
-
- r_vert->flag = BM_vert_flag_to_mflag(ev);
-
- if ((f = CustomData_bmesh_get(&bm->vdata, ev->head.data, CD_BWEIGHT))) {
- r_vert->bweight = (unsigned char)((*f) * 255.0f);
- }
-}
-
-static void emDM_getVert(DerivedMesh *dm, int index, MVert *r_vert)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMVert *ev;
-
- if (UNLIKELY(index < 0 || index >= bm->totvert)) {
- BLI_assert(!"error in emDM_getVert");
- return;
- }
-
- BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
- ev = bm->vtable[index]; /* should be BM_vert_at_index() */
- // ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */
-
- bmvert_to_mvert(bm, ev, r_vert);
- if (bmdm->emd.vertexCos)
- copy_v3_v3(r_vert->co, bmdm->emd.vertexCos[index]);
-}
-
-static void emDM_getVertCo(DerivedMesh *dm, int index, float r_co[3])
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
-
- if (UNLIKELY(index < 0 || index >= bm->totvert)) {
- BLI_assert(!"error in emDM_getVertCo");
- return;
- }
-
- if (bmdm->emd.vertexCos) {
- copy_v3_v3(r_co, bmdm->emd.vertexCos[index]);
- }
- else {
- BMVert *ev;
-
- BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
- ev = bm->vtable[index]; /* should be BM_vert_at_index() */
- // ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */
- copy_v3_v3(r_co, ev->co);
- }
-}
-
-static void emDM_getVertNo(DerivedMesh *dm, int index, float r_no[3])
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
-
- if (UNLIKELY(index < 0 || index >= bm->totvert)) {
- BLI_assert(!"error in emDM_getVertNo");
- return;
- }
-
-
- if (bmdm->emd.vertexCos) {
- emDM_ensureVertNormals(bmdm);
- copy_v3_v3(r_no, bmdm->emd.vertexNos[index]);
- }
- else {
- BMVert *ev;
-
- BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
- ev = bm->vtable[index]; /* should be BM_vert_at_index() */
- // ev = BM_vert_at_index(bm, index); /* warning, does list loop, _not_ ideal */
- copy_v3_v3(r_no, ev->no);
- }
-}
-
-static void emDM_getPolyNo(DerivedMesh *dm, int index, float r_no[3])
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
-
- if (UNLIKELY(index < 0 || index >= bm->totface)) {
- BLI_assert(!"error in emDM_getPolyNo");
- return;
- }
-
- if (bmdm->emd.vertexCos) {
- emDM_ensurePolyNormals(bmdm);
- copy_v3_v3(r_no, bmdm->emd.polyNos[index]);
- }
- else {
- BMFace *efa;
-
- BLI_assert((bm->elem_table_dirty & BM_FACE) == 0);
- efa = bm->ftable[index]; /* should be BM_vert_at_index() */
- // efa = BM_face_at_index(bm, index); /* warning, does list loop, _not_ ideal */
- copy_v3_v3(r_no, efa->no);
- }
-}
-
-static void emDM_getEdge(DerivedMesh *dm, int index, MEdge *r_edge)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMEdge *e;
- const float *f;
-
- if (UNLIKELY(index < 0 || index >= bm->totedge)) {
- BLI_assert(!"error in emDM_getEdge");
- return;
- }
-
- BLI_assert((bm->elem_table_dirty & BM_EDGE) == 0);
- e = bm->etable[index]; /* should be BM_edge_at_index() */
- // e = BM_edge_at_index(bm, index); /* warning, does list loop, _not_ ideal */
-
- r_edge->flag = BM_edge_flag_to_mflag(e);
-
- r_edge->v1 = BM_elem_index_get(e->v1);
- r_edge->v2 = BM_elem_index_get(e->v2);
-
- if ((f = CustomData_bmesh_get(&bm->edata, e->head.data, CD_BWEIGHT))) {
- r_edge->bweight = (unsigned char)((*f) * 255.0f);
- }
- if ((f = CustomData_bmesh_get(&bm->edata, e->head.data, CD_CREASE))) {
- r_edge->crease = (unsigned char)((*f) * 255.0f);
- }
-}
-
-static void emDM_getTessFace(DerivedMesh *dm, int index, MFace *r_face)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMFace *ef;
- BMLoop **ltri;
-
- if (UNLIKELY(index < 0 || index >= bmdm->em->tottri)) {
- BLI_assert(!"error in emDM_getTessFace");
- return;
- }
-
- ltri = bmdm->em->looptris[index];
-
- ef = ltri[0]->f;
-
- r_face->mat_nr = (unsigned char) ef->mat_nr;
- r_face->flag = BM_face_flag_to_mflag(ef);
-
- r_face->v1 = BM_elem_index_get(ltri[0]->v);
- r_face->v2 = BM_elem_index_get(ltri[1]->v);
- r_face->v3 = BM_elem_index_get(ltri[2]->v);
- r_face->v4 = 0;
-
- test_index_face(r_face, NULL, 0, 3);
-}
-
-static void emDM_copyVertArray(DerivedMesh *dm, MVert *r_vert)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMVert *eve;
- BMIter iter;
- const int cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT);
-
- if (bmdm->emd.vertexCos) {
- int i;
-
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- copy_v3_v3(r_vert->co, bmdm->emd.vertexCos[i]);
- normal_float_to_short_v3(r_vert->no, eve->no);
- r_vert->flag = BM_vert_flag_to_mflag(eve);
-
- r_vert->bweight = (cd_vert_bweight_offset != -1) ? BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset) : 0;
-
- r_vert++;
- }
- }
- else {
- BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
- copy_v3_v3(r_vert->co, eve->co);
- normal_float_to_short_v3(r_vert->no, eve->no);
- r_vert->flag = BM_vert_flag_to_mflag(eve);
-
- r_vert->bweight = (cd_vert_bweight_offset != -1) ? BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset) : 0;
-
- r_vert++;
- }
- }
-}
-
-static void emDM_copyEdgeArray(DerivedMesh *dm, MEdge *r_edge)
-{
- BMesh *bm = ((EditDerivedBMesh *)dm)->em->bm;
- BMEdge *eed;
- BMIter iter;
-
- const int cd_edge_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
- const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
-
- BM_mesh_elem_index_ensure(bm, BM_VERT);
-
- BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
- r_edge->v1 = BM_elem_index_get(eed->v1);
- r_edge->v2 = BM_elem_index_get(eed->v2);
-
- r_edge->flag = BM_edge_flag_to_mflag(eed);
-
- r_edge->crease = (cd_edge_crease_offset != -1) ? BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_crease_offset) : 0;
- r_edge->bweight = (cd_edge_bweight_offset != -1) ? BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_bweight_offset) : 0;
-
- r_edge++;
- }
-}
-
-static void emDM_copyTessFaceArray(DerivedMesh *dm, MFace *r_face)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- struct BMLoop *(*looptris)[3] = bmdm->em->looptris;
- BMFace *ef;
- int i;
-
- BM_mesh_elem_index_ensure(bm, BM_VERT);
-
- for (i = 0; i < bmdm->em->tottri; i++, r_face++) {
- BMLoop **ltri = looptris[i];
- ef = ltri[0]->f;
-
- r_face->mat_nr = (unsigned char) ef->mat_nr;
-
- r_face->flag = BM_face_flag_to_mflag(ef);
- r_face->edcode = 0;
-
- r_face->v1 = BM_elem_index_get(ltri[0]->v);
- r_face->v2 = BM_elem_index_get(ltri[1]->v);
- r_face->v3 = BM_elem_index_get(ltri[2]->v);
- r_face->v4 = 0;
-
- test_index_face(r_face, NULL, 0, 3);
- }
-}
-
-static void emDM_copyLoopArray(DerivedMesh *dm, MLoop *r_loop)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMIter iter;
- BMFace *efa;
-
- BM_mesh_elem_index_ensure(bm, BM_VERT | BM_EDGE);
-
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- BMLoop *l_iter, *l_first;
- l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
- do {
- r_loop->v = BM_elem_index_get(l_iter->v);
- r_loop->e = BM_elem_index_get(l_iter->e);
- r_loop++;
- } while ((l_iter = l_iter->next) != l_first);
- }
-}
-
-static void emDM_copyPolyArray(DerivedMesh *dm, MPoly *r_poly)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMIter iter;
- BMFace *efa;
- int i;
-
- i = 0;
- BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- r_poly->flag = BM_face_flag_to_mflag(efa);
- r_poly->loopstart = i;
- r_poly->totloop = efa->len;
- r_poly->mat_nr = efa->mat_nr;
-
- r_poly++;
- i += efa->len;
- }
-}
-
-static void *emDM_getTessFaceDataArray(DerivedMesh *dm, int type)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- void *datalayer;
-
- datalayer = DM_get_tessface_data_layer(dm, type);
- if (datalayer)
- return datalayer;
-
- /* layers are store per face for editmesh, we convert to a temporary
- * data layer array in the derivedmesh when these are requested */
- if (type == CD_MTFACE || type == CD_MCOL) {
- const char *bmdata;
- char *data;
-
- bool has_type_source = CustomData_has_layer(&bm->ldata, (type == CD_MTFACE) ? CD_MLOOPUV : CD_MLOOPCOL);
-
- if (has_type_source) {
- /* offset = bm->pdata.layers[index].offset; */ /* UNUSED */
- BMLoop *(*looptris)[3] = bmdm->em->looptris;
- const int size = CustomData_sizeof(type);
- int i, j;
-
- DM_add_tessface_layer(dm, type, CD_CALLOC, NULL);
- const int index = CustomData_get_layer_index(&dm->faceData, type);
- dm->faceData.layers[index].flag |= CD_FLAG_TEMPORARY;
-
- data = datalayer = DM_get_tessface_data_layer(dm, type);
-
- if (type == CD_MTFACE) {
- const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
-
- for (i = 0; i < bmdm->em->tottri; i++, data += size) {
- for (j = 0; j < 3; j++) {
- // bmdata = CustomData_bmesh_get(&bm->ldata, looptris[i][j]->head.data, CD_MLOOPUV);
- bmdata = BM_ELEM_CD_GET_VOID_P(looptris[i][j], cd_loop_uv_offset);
- copy_v2_v2(((MTFace *)data)->uv[j], ((const MLoopUV *)bmdata)->uv);
- }
- }
- }
- else {
- const int cd_loop_color_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPCOL);
- for (i = 0; i < bmdm->em->tottri; i++, data += size) {
- for (j = 0; j < 3; j++) {
- // bmdata = CustomData_bmesh_get(&bm->ldata, looptris[i][j]->head.data, CD_MLOOPCOL);
- bmdata = BM_ELEM_CD_GET_VOID_P(looptris[i][j], cd_loop_color_offset);
- MESH_MLOOPCOL_TO_MCOL(((const MLoopCol *)bmdata), (((MCol *)data) + j));
- }
- }
- }
- }
- }
-
- /* Special handling for CD_TESSLOOPNORMAL, we generate it on demand as well. */
- if (type == CD_TESSLOOPNORMAL) {
- const float (*lnors)[3] = dm->getLoopDataArray(dm, CD_NORMAL);
-
- if (lnors) {
- BMLoop *(*looptris)[3] = bmdm->em->looptris;
- short (*tlnors)[4][3], (*tlnor)[4][3];
- int index, i, j;
-
- DM_add_tessface_layer(dm, type, CD_CALLOC, NULL);
- index = CustomData_get_layer_index(&dm->faceData, type);
- dm->faceData.layers[index].flag |= CD_FLAG_TEMPORARY;
-
- tlnor = tlnors = DM_get_tessface_data_layer(dm, type);
-
- BM_mesh_elem_index_ensure(bm, BM_LOOP);
-
- for (i = 0; i < bmdm->em->tottri; i++, tlnor++, looptris++) {
- for (j = 0; j < 3; j++) {
- normal_float_to_short_v3((*tlnor)[j], lnors[BM_elem_index_get((*looptris)[j])]);
- }
- }
- }
- }
-
- return datalayer;
-}
-
-static void emDM_getVertCos(DerivedMesh *dm, float (*r_cos)[3])
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BMesh *bm = bmdm->em->bm;
- BMVert *eve;
- BMIter iter;
- int i;
-
- if (bmdm->emd.vertexCos) {
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- copy_v3_v3(r_cos[i], bmdm->emd.vertexCos[i]);
- }
- }
- else {
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- copy_v3_v3(r_cos[i], eve->co);
- }
- }
-}
-
-static void emDM_release(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- if (DM_release(dm)) {
- if (bmdm->emd.vertexCos) {
- MEM_freeN((void *)bmdm->emd.vertexCos);
- if (bmdm->emd.vertexNos) {
- MEM_freeN((void *)bmdm->emd.vertexNos);
- }
- if (bmdm->emd.polyNos) {
- MEM_freeN((void *)bmdm->emd.polyNos);
- }
- }
-
- if (bmdm->emd.polyCos) {
- MEM_freeN((void *)bmdm->emd.polyCos);
- }
-
- MEM_freeN(bmdm);
- }
-}
-
-static CustomData *bmDm_getVertDataLayout(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return &bmdm->em->bm->vdata;
-}
-
-static CustomData *bmDm_getEdgeDataLayout(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return &bmdm->em->bm->edata;
-}
-
-static CustomData *bmDm_getTessFaceDataLayout(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return &bmdm->dm.faceData;
-}
-
-static CustomData *bmDm_getLoopDataLayout(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return &bmdm->em->bm->ldata;
-}
-
-static CustomData *bmDm_getPolyDataLayout(DerivedMesh *dm)
-{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
-
- return &bmdm->em->bm->pdata;
-}
-
-/**
- * \note This may be called per-draw,
- * avoid allocating large arrays where possible and keep this a thin wrapper for #BMesh.
- */
-DerivedMesh *getEditDerivedBMesh(
- BMEditMesh *em, struct Object *UNUSED(ob),
- CustomDataMask data_mask,
- float (*vertexCos)[3])
-{
- EditDerivedBMesh *bmdm = MEM_callocN(sizeof(*bmdm), __func__);
- BMesh *bm = em->bm;
-
- bmdm->em = em;
-
- DM_init((DerivedMesh *)bmdm, DM_TYPE_EDITBMESH, bm->totvert,
- bm->totedge, em->tottri, bm->totloop, bm->totface);
-
- /* could also get from the objects mesh directly */
- bmdm->dm.cd_flag = BM_mesh_cd_flag_from_bmesh(bm);
-
- bmdm->dm.getVertCos = emDM_getVertCos;
- bmdm->dm.getMinMax = emDM_getMinMax;
-
- bmdm->dm.getVertDataLayout = bmDm_getVertDataLayout;
- bmdm->dm.getEdgeDataLayout = bmDm_getEdgeDataLayout;
- bmdm->dm.getTessFaceDataLayout = bmDm_getTessFaceDataLayout;
- bmdm->dm.getLoopDataLayout = bmDm_getLoopDataLayout;
- bmdm->dm.getPolyDataLayout = bmDm_getPolyDataLayout;
-
- bmdm->dm.getNumVerts = emDM_getNumVerts;
- bmdm->dm.getNumEdges = emDM_getNumEdges;
- bmdm->dm.getNumTessFaces = emDM_getNumTessFaces;
- bmdm->dm.getNumLoops = emDM_getNumLoops;
- bmdm->dm.getNumPolys = emDM_getNumPolys;
-
- bmdm->dm.getVert = emDM_getVert;
- bmdm->dm.getVertCo = emDM_getVertCo;
- bmdm->dm.getVertNo = emDM_getVertNo;
- bmdm->dm.getPolyNo = emDM_getPolyNo;
- bmdm->dm.getEdge = emDM_getEdge;
- bmdm->dm.getTessFace = emDM_getTessFace;
- bmdm->dm.copyVertArray = emDM_copyVertArray;
- bmdm->dm.copyEdgeArray = emDM_copyEdgeArray;
- bmdm->dm.copyTessFaceArray = emDM_copyTessFaceArray;
- bmdm->dm.copyLoopArray = emDM_copyLoopArray;
- bmdm->dm.copyPolyArray = emDM_copyPolyArray;
-
- bmdm->dm.getTessFaceDataArray = emDM_getTessFaceDataArray;
-
- bmdm->dm.calcNormals = emDM_calcNormals;
- bmdm->dm.calcLoopNormals = emDM_calcLoopNormals;
- bmdm->dm.calcLoopNormalsSpaceArray = emDM_calcLoopNormalsSpaceArray;
- bmdm->dm.calcLoopTangents = emDM_calc_loop_tangents;
- bmdm->dm.recalcTessellation = emDM_recalcTessellation;
- bmdm->dm.recalcLoopTri = emDM_recalcLoopTri;
-
- bmdm->dm.foreachMappedVert = emDM_foreachMappedVert;
- bmdm->dm.foreachMappedLoop = emDM_foreachMappedLoop;
- bmdm->dm.foreachMappedEdge = emDM_foreachMappedEdge;
- bmdm->dm.foreachMappedFaceCenter = emDM_foreachMappedFaceCenter;
-
- bmdm->dm.release = emDM_release;
-
- bmdm->emd.vertexCos = (const float (*)[3])vertexCos;
- bmdm->dm.deformedOnly = (vertexCos != NULL);
-
- const int cd_dvert_offset = (data_mask & CD_MASK_MDEFORMVERT) ?
- CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT) : -1;
-
- if (cd_dvert_offset != -1) {
- BMIter iter;
- BMVert *eve;
- int i;
-
- DM_add_vert_layer(&bmdm->dm, CD_MDEFORMVERT, CD_CALLOC, NULL);
-
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- DM_set_vert_data(&bmdm->dm, i, CD_MDEFORMVERT,
- BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset));
- }
- }
-
- const int cd_skin_offset = (data_mask & CD_MASK_MVERT_SKIN) ?
- CustomData_get_offset(&bm->vdata, CD_MVERT_SKIN) : -1;
-
- if (cd_skin_offset != -1) {
- BMIter iter;
- BMVert *eve;
- int i;
-
- DM_add_vert_layer(&bmdm->dm, CD_MVERT_SKIN, CD_CALLOC, NULL);
-
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- DM_set_vert_data(&bmdm->dm, i, CD_MVERT_SKIN,
- BM_ELEM_CD_GET_VOID_P(eve, cd_skin_offset));
- }
- }
-
- return (DerivedMesh *)bmdm;
-}
-
-
-
/* -------------------------------------------------------------------- */
/* StatVis Functions */
@@ -1418,18 +440,15 @@ static void statvis_calc_sharp(
}
void BKE_editmesh_statvis_calc(
- BMEditMesh *em, DerivedMesh *dm,
+ BMEditMesh *em, EditMeshData *emd,
const MeshStatVis *statvis)
{
- EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
- BLI_assert(dm == NULL || dm->type == DM_TYPE_EDITBMESH);
-
switch (statvis->type) {
case SCE_STATVIS_OVERHANG:
{
BKE_editmesh_color_ensure(em, BM_FACE);
statvis_calc_overhang(
- em, bmdm ? bmdm->emd.polyNos : NULL,
+ em, emd ? emd->polyNos : NULL,
statvis->overhang_min / (float)M_PI,
statvis->overhang_max / (float)M_PI,
statvis->overhang_axis,
@@ -1441,7 +460,7 @@ void BKE_editmesh_statvis_calc(
const float scale = 1.0f / mat4_to_scale(em->ob->obmat);
BKE_editmesh_color_ensure(em, BM_FACE);
statvis_calc_thickness(
- em, bmdm ? bmdm->emd.vertexCos : NULL,
+ em, emd ? emd->vertexCos : NULL,
statvis->thickness_min * scale,
statvis->thickness_max * scale,
statvis->thickness_samples,
@@ -1452,7 +471,7 @@ void BKE_editmesh_statvis_calc(
{
BKE_editmesh_color_ensure(em, BM_FACE);
statvis_calc_intersect(
- em, bmdm ? bmdm->emd.vertexCos : NULL,
+ em, emd ? emd->vertexCos : NULL,
em->derivedFaceColor);
break;
}
@@ -1460,11 +479,12 @@ void BKE_editmesh_statvis_calc(
{
BKE_editmesh_color_ensure(em, BM_FACE);
- if (bmdm)
- emDM_ensurePolyNormals(bmdm);
+ if (emd) {
+ BKE_editmesh_cache_ensure_poly_normals(em, emd);
+ }
statvis_calc_distort(
- em, bmdm ? bmdm->emd.vertexCos : NULL, bmdm ? bmdm->emd.polyNos : NULL,
+ em, emd ? emd->vertexCos : NULL, emd ? emd->polyNos : NULL,
statvis->distort_min,
statvis->distort_max,
em->derivedFaceColor);
@@ -1474,7 +494,7 @@ void BKE_editmesh_statvis_calc(
{
BKE_editmesh_color_ensure(em, BM_VERT);
statvis_calc_sharp(
- em, bmdm ? bmdm->emd.vertexCos : NULL,
+ em, emd ? emd->vertexCos : NULL,
statvis->sharp_min,
statvis->sharp_max,
/* in this case they are vertex colors */
@@ -1509,12 +529,12 @@ static void cage_mapped_verts_callback(
float (*BKE_editmesh_vertexCos_get(struct Depsgraph *depsgraph, BMEditMesh *em, Scene *scene, int *r_numVerts))[3]
{
- DerivedMesh *cage, *final;
+ Mesh *cage, *final;
BLI_bitmap *visit_bitmap;
struct CageUserData data;
float (*cos_cage)[3];
- cage = editbmesh_get_derived_cage_and_final(depsgraph, scene, em->ob, em, CD_MASK_BAREMESH, &final);
+ cage = editbmesh_get_eval_cage_and_final(depsgraph, scene, em->ob, em, CD_MASK_BAREMESH, &final);
cos_cage = MEM_callocN(sizeof(*cos_cage) * em->bm->totvert, "bmbvh cos_cage");
/* when initializing cage verts, we only want the first cage coordinate for each vertex,
@@ -1525,7 +545,7 @@ float (*BKE_editmesh_vertexCos_get(struct Depsgraph *depsgraph, BMEditMesh *em,
data.cos_cage = cos_cage;
data.visit_bitmap = visit_bitmap;
- cage->foreachMappedVert(cage, cage_mapped_verts_callback, &data, DM_FOREACH_NOP);
+ BKE_mesh_foreach_mapped_vert(cage, cage_mapped_verts_callback, &data, MESH_FOREACH_NOP);
MEM_freeN(visit_bitmap);
diff --git a/source/blender/blenkernel/intern/editmesh.c b/source/blender/blenkernel/intern/editmesh.c
index 9e1713dc805..0d09f4be39f 100644
--- a/source/blender/blenkernel/intern/editmesh.c
+++ b/source/blender/blenkernel/intern/editmesh.c
@@ -39,6 +39,7 @@
#include "BKE_editmesh.h"
#include "BKE_cdderivedmesh.h"
+#include "BKE_library.h"
BMEditMesh *BKE_editmesh_create(BMesh *bm, const bool do_tessellate)
@@ -58,7 +59,7 @@ BMEditMesh *BKE_editmesh_copy(BMEditMesh *em)
BMEditMesh *em_copy = MEM_callocN(sizeof(BMEditMesh), __func__);
*em_copy = *em;
- em_copy->derivedCage = em_copy->derivedFinal = NULL;
+ em_copy->mesh_eval_cage = em_copy->mesh_eval_final = NULL;
em_copy->derivedVertColor = NULL;
em_copy->derivedVertColorLen = 0;
@@ -169,16 +170,13 @@ void BKE_editmesh_tessface_calc(BMEditMesh *em)
void BKE_editmesh_free_derivedmesh(BMEditMesh *em)
{
- if (em->derivedCage) {
- em->derivedCage->needsFree = 1;
- em->derivedCage->release(em->derivedCage);
+ if (em->mesh_eval_cage) {
+ BKE_id_free(NULL, em->mesh_eval_cage);
}
- if (em->derivedFinal && em->derivedFinal != em->derivedCage) {
- em->derivedFinal->needsFree = 1;
- em->derivedFinal->release(em->derivedFinal);
+ if (em->mesh_eval_final && em->mesh_eval_final != em->mesh_eval_cage) {
+ BKE_id_free(NULL, em->mesh_eval_final);
}
-
- em->derivedCage = em->derivedFinal = NULL;
+ em->mesh_eval_cage = em->mesh_eval_final = NULL;
}
/*does not free the BMEditMesh struct itself*/
diff --git a/source/blender/blenkernel/intern/editmesh_cache.c b/source/blender/blenkernel/intern/editmesh_cache.c
new file mode 100644
index 00000000000..f0af0ede9b1
--- /dev/null
+++ b/source/blender/blenkernel/intern/editmesh_cache.c
@@ -0,0 +1,120 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/blenkernel/intern/editmesh_cache.c
+ * \ingroup bke
+ *
+ * Manage edit mesh cache: #EditMeshData
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_mesh_types.h"
+
+#include "BLI_math.h"
+
+#include "BKE_editmesh.h"
+#include "BKE_editmesh_cache.h" /* own include */
+
+void BKE_editmesh_cache_ensure_poly_normals(BMEditMesh *em, EditMeshData *emd)
+{
+ if (!(emd->vertexCos && (emd->polyNos == NULL))) {
+ return;
+ }
+
+ BMesh *bm = em->bm;
+ const float (*vertexCos)[3];
+ float (*polyNos)[3];
+
+ BMFace *efa;
+ BMIter fiter;
+ int i;
+
+ BM_mesh_elem_index_ensure(bm, BM_VERT);
+
+ polyNos = MEM_mallocN(sizeof(*polyNos) * bm->totface, __func__);
+
+ vertexCos = emd->vertexCos;
+
+ BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
+ BM_elem_index_set(efa, i); /* set_inline */
+ BM_face_calc_normal_vcos(bm, efa, polyNos[i], vertexCos);
+ }
+ bm->elem_index_dirty &= ~BM_FACE;
+
+ emd->polyNos = (const float (*)[3])polyNos;
+}
+
+void BKE_editmesh_cache_ensure_vert_normals(BMEditMesh *em, EditMeshData *emd)
+{
+ if (!(emd->vertexCos && (emd->vertexNos == NULL))) {
+ return;
+ }
+
+ BMesh *bm = em->bm;
+ const float (*vertexCos)[3], (*polyNos)[3];
+ float (*vertexNos)[3];
+
+ /* calculate vertex normals from poly normals */
+ BKE_editmesh_cache_ensure_poly_normals(em, emd);
+
+ BM_mesh_elem_index_ensure(bm, BM_FACE);
+
+ polyNos = emd->polyNos;
+ vertexCos = emd->vertexCos;
+ vertexNos = MEM_callocN(sizeof(*vertexNos) * bm->totvert, __func__);
+
+ BM_verts_calc_normal_vcos(bm, polyNos, vertexCos, vertexNos);
+
+ emd->vertexNos = (const float (*)[3])vertexNos;
+}
+
+void BKE_editmesh_cache_ensure_poly_centers(BMEditMesh *em, EditMeshData *emd)
+{
+ if (emd->polyCos != NULL) {
+ return;
+ }
+ BMesh *bm = em->bm;
+ float (*polyCos)[3];
+
+ BMFace *efa;
+ BMIter fiter;
+ int i;
+
+ polyCos = MEM_mallocN(sizeof(*polyCos) * bm->totface, __func__);
+
+ if (emd->vertexCos) {
+ const float (*vertexCos)[3];
+ vertexCos = emd->vertexCos;
+
+ BM_mesh_elem_index_ensure(bm, BM_VERT);
+
+ BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
+ BM_face_calc_center_mean_vcos(bm, efa, polyCos[i], vertexCos);
+ }
+ }
+ else {
+ BM_ITER_MESH_INDEX (efa, &fiter, bm, BM_FACES_OF_MESH, i) {
+ BM_face_calc_center_mean(efa, polyCos[i]);
+ }
+ }
+
+ emd->polyCos = (const float (*)[3])polyCos;
+}
diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c
index b81d633f156..51ab82fd593 100644
--- a/source/blender/blenkernel/intern/font.c
+++ b/source/blender/blenkernel/intern/font.c
@@ -1118,7 +1118,7 @@ makebreak:
/* Note: Only OB_CURVE objects could have a path */
if (cu->textoncurve && cu->textoncurve->type == OB_CURVE) {
BLI_assert(cu->textoncurve->runtime.curve_cache != NULL);
- if (cu->textoncurve->runtime.curve_cache->path) {
+ if (cu->textoncurve->runtime.curve_cache != NULL && cu->textoncurve->runtime.curve_cache->path != NULL) {
float distfac, imat[4][4], imat3[3][3], cmat[3][3];
float minx, maxx, miny, maxy;
float timeofs, sizefac;
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index ae78dd8d175..33c2587e800 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -1108,22 +1108,35 @@ bool BKE_gpencil_stroke_minmax(
}
/* get min/max bounds of all strokes in GP datablock */
-static void gpencil_minmax(bGPdata *gpd, float r_min[3], float r_max[3])
+bool BKE_gpencil_data_minmax(Object *ob, const bGPdata *gpd, float r_min[3], float r_max[3])
{
+ float bmat[3][3];
+ bool changed = false;
+
INIT_MINMAX(r_min, r_max);
if (gpd == NULL)
- return;
+ return changed;
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
bGPDframe *gpf = gpl->actframe;
if (gpf != NULL) {
for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
- BKE_gpencil_stroke_minmax(gps, false, r_min, r_max);
+ changed = BKE_gpencil_stroke_minmax(gps, false, r_min, r_max);
}
}
}
+
+ if ((changed) && (ob)) {
+ copy_m3_m4(bmat, ob->obmat);
+ mul_m3_v3(bmat, r_min);
+ add_v3_v3(r_min, ob->obmat[3]);
+ mul_m3_v3(bmat, r_max);
+ add_v3_v3(r_max, ob->obmat[3]);
+ }
+
+ return changed;
}
/* compute center of bounding box */
@@ -1131,7 +1144,7 @@ void BKE_gpencil_centroid_3D(bGPdata *gpd, float r_centroid[3])
{
float min[3], max[3], tot[3];
- gpencil_minmax(gpd, min, max);
+ BKE_gpencil_data_minmax(NULL, gpd, min, max);
add_v3_v3v3(tot, min, max);
mul_v3_v3fl(r_centroid, tot, 0.5f);
@@ -1152,7 +1165,7 @@ static void boundbox_gpencil(Object *ob)
bb = ob->bb;
gpd = ob->data;
- gpencil_minmax(gpd, min, max);
+ BKE_gpencil_data_minmax(NULL, gpd, min, max);
BKE_boundbox_init_from_minmax(bb, min, max);
bb->flag &= ~BOUNDBOX_DIRTY;
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 59ce3b4dd8a..b7885e08a60 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -68,7 +68,6 @@
#include "BLI_timecode.h" /* for stamp timecode format */
#include "BLI_utildefines.h"
-#include "BKE_bmfont.h"
#include "BKE_colortools.h"
#include "BKE_global.h"
#include "BKE_icons.h"
@@ -3450,9 +3449,6 @@ static ImBuf *load_image_single(
image_initialize_after_load(ima, ibuf);
*r_assign = true;
- /* check if the image is a font image... */
- detectBitmapFont(ibuf);
-
/* make packed file for autopack */
if ((has_packed == false) && (G.fileflags & G_AUTOPACK)) {
ImagePackedFile *imapf = MEM_mallocN(sizeof(ImagePackedFile), "Image Packefile");
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index a209b2ac1d7..84aa0ed962b 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -1373,6 +1373,9 @@ void BKE_libblock_init_empty(ID *id)
/* Should not be needed - animation from lib pre-2.5 is broken anyway. */
BLI_assert(0);
break;
+ case ID_PAL:
+ BKE_palette_init((Palette *)id);
+ break;
default:
BLI_assert(0); /* Should never reach this point... */
}
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 374365cc58a..81214f3bb9c 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -576,6 +576,7 @@ void BKE_mesh_copy_data(Main *bmain, Mesh *me_dst, const Mesh *me_src, const int
/* This is a direct copy of a main mesh, so for now it has the same topology. */
me_dst->runtime.deformed_only = 1;
}
+ me_dst->runtime.is_original = false;
me_dst->mselect = MEM_dupallocN(me_dst->mselect);
me_dst->bb = MEM_dupallocN(me_dst->bb);
@@ -685,7 +686,7 @@ static Mesh *mesh_new_nomain_from_template_ex(
return me_dst;
}
-Mesh * BKE_mesh_new_nomain_from_template(
+Mesh *BKE_mesh_new_nomain_from_template(
const Mesh *me_src,
int verts_len, int edges_len, int tessface_len,
int loops_len, int polys_len)
@@ -709,7 +710,7 @@ Mesh *BKE_mesh_copy_for_eval(struct Mesh *source, bool reference)
}
Mesh *result;
- BKE_id_copy_ex( NULL, &source->id, (ID **)&result, flags, false);
+ BKE_id_copy_ex(NULL, &source->id, (ID **)&result, flags, false);
return result;
}
@@ -748,7 +749,7 @@ BMesh *BKE_mesh_to_bmesh(
});
}
-Mesh *BKE_bmesh_to_mesh_nomain(BMesh *bm, const struct BMeshToMeshParams *params)
+Mesh *BKE_mesh_from_bmesh_nomain(BMesh *bm, const struct BMeshToMeshParams *params)
{
BLI_assert(params->calc_object_remap == false);
Mesh *mesh = BKE_id_new_nomain(ID_ME, NULL);
@@ -756,6 +757,31 @@ Mesh *BKE_bmesh_to_mesh_nomain(BMesh *bm, const struct BMeshToMeshParams *params
return mesh;
}
+Mesh *BKE_mesh_from_bmesh_for_eval_nomain(BMesh *bm, const int64_t cd_mask_extra)
+{
+ Mesh *mesh = BKE_id_new_nomain(ID_ME, NULL);
+ BM_mesh_bm_to_me_for_eval(bm, mesh, cd_mask_extra);
+ return mesh;
+}
+
+/**
+ * TODO(campbell): support mesh with only an edit-mesh which is lazy initialized.
+ */
+Mesh *BKE_mesh_from_editmesh_with_coords_thin_wrap(
+ BMEditMesh *em, CustomDataMask data_mask, float (*vertexCos)[3])
+{
+ Mesh *me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, data_mask);
+ /* Use editmesh directly where possible. */
+ me->runtime.is_original = true;
+ if (vertexCos) {
+ /* We will own this array in the future. */
+ BKE_mesh_apply_vert_coords(me, vertexCos);
+ MEM_freeN(vertexCos);
+ me->runtime.is_original = false;
+ }
+ return me;
+}
+
void BKE_mesh_make_local(Main *bmain, Mesh *me, const bool lib_local)
{
BKE_id_make_local_generic(bmain, &me->id, true, lib_local);
diff --git a/source/blender/blenkernel/intern/mesh_convert.c b/source/blender/blenkernel/intern/mesh_convert.c
index 7cc7095361c..b64cb8a1d0f 100644
--- a/source/blender/blenkernel/intern/mesh_convert.c
+++ b/source/blender/blenkernel/intern/mesh_convert.c
@@ -549,7 +549,7 @@ void BKE_mesh_from_nurbs_displist(
Main *bmain, Object *ob, ListBase *dispbase, const bool use_orco_uv, const char *obdata_name, bool temporary)
{
Object *ob1;
- DerivedMesh *dm = ob->derivedFinal;
+ Mesh *me_eval = ob->runtime.mesh_eval;
Mesh *me;
Curve *cu;
MVert *allvert = NULL;
@@ -561,7 +561,7 @@ void BKE_mesh_from_nurbs_displist(
cu = ob->data;
- if (dm == NULL) {
+ if (me_eval == NULL) {
if (BKE_mesh_nurbs_displist_to_mdata(
ob, dispbase, &allvert, &totvert,
&alledge, &totedge, &allloop,
@@ -593,7 +593,8 @@ void BKE_mesh_from_nurbs_displist(
}
else {
me = BKE_mesh_add(bmain, obdata_name);
- DM_to_mesh(dm, me, ob, CD_MASK_MESH, false);
+ ob->runtime.mesh_eval = NULL;
+ BKE_mesh_nomain_to_mesh(me_eval, me, ob, CD_MASK_MESH, false);
}
me->totcol = cu->totcol;
@@ -840,7 +841,7 @@ void BKE_mesh_to_curve(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *
/* settings: 1 - preview, 2 - render */
Mesh *BKE_mesh_new_from_object(
Depsgraph *depsgraph, Main *bmain, Scene *sce, Object *ob,
- const bool apply_modifiers, const bool calc_tessface, const bool calc_undeformed)
+ const bool apply_modifiers, const bool calc_undeformed)
{
Mesh *tmpmesh;
Curve *tmpcu = NULL, *copycu;
@@ -976,7 +977,7 @@ Mesh *BKE_mesh_new_from_object(
/* if not getting the original caged mesh, get final derived mesh */
else {
/* Make a dummy mesh, saves copying */
- DerivedMesh *dm;
+ Mesh *me_eval;
/* CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL; */
CustomDataMask mask = CD_MASK_MESH; /* this seems more suitable, exporter,
* for example, needs CD_MASK_MDEFORMVERT */
@@ -984,14 +985,15 @@ Mesh *BKE_mesh_new_from_object(
if (calc_undeformed)
mask |= CD_MASK_ORCO;
- /* Write the display mesh into the dummy mesh */
- if (render)
- dm = mesh_create_derived_render(depsgraph, sce, ob, mask);
- else
- dm = mesh_create_derived_view(depsgraph, sce, ob, mask);
+ if (render) {
+ me_eval = mesh_create_eval_final_render(depsgraph, sce, ob, mask);
+ }
+ else {
+ me_eval = mesh_create_eval_final_view(depsgraph, sce, ob, mask);
+ }
tmpmesh = BKE_mesh_add(bmain, ((ID *)ob->data)->name + 2);
- DM_to_mesh(dm, tmpmesh, ob, mask, true);
+ BKE_mesh_nomain_to_mesh(me_eval, tmpmesh, ob, mask, true);
/* Copy autosmooth settings from original mesh. */
Mesh *me = (Mesh *)ob->data;
@@ -1069,11 +1071,6 @@ Mesh *BKE_mesh_new_from_object(
break;
} /* end copy materials */
- if (calc_tessface) {
- /* cycles and exporters rely on this still */
- BKE_mesh_tessface_ensure(tmpmesh);
- }
-
return tmpmesh;
}
diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c b/source/blender/blenkernel/intern/mesh_evaluate.c
index f20d17c7917..f9ced904536 100644
--- a/source/blender/blenkernel/intern/mesh_evaluate.c
+++ b/source/blender/blenkernel/intern/mesh_evaluate.c
@@ -354,6 +354,35 @@ void BKE_mesh_ensure_normals(Mesh *mesh)
BLI_assert((mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL) == 0);
}
+/**
+ * Called after calculating all modifiers.
+ */
+void BKE_mesh_ensure_normals_for_display(Mesh *mesh)
+{
+ /* Note: mesh *may* have a poly CD_NORMAL layer (generated by a modifier needing poly normals e.g.).
+ * We do not use it here, though. And it should be tagged as temp!
+ */
+ /* BLI_assert((CustomData_has_layer(&mesh->pdata, CD_NORMAL) == false)); */
+
+ if (mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL || !CustomData_has_layer(&mesh->pdata, CD_NORMAL)) {
+ float (*poly_nors)[3] = NULL;
+ poly_nors = MEM_malloc_arrayN((size_t)mesh->totpoly, sizeof(*poly_nors), __func__);
+
+ /* if normals are dirty we want to calculate vertex normals too */
+ bool only_face_normals = !(mesh->runtime.cd_dirty_vert & CD_MASK_NORMAL);
+
+ /* calculate face normals */
+ BKE_mesh_calc_normals_poly(
+ mesh->mvert, NULL, mesh->totvert, mesh->mloop, mesh->mpoly,
+ mesh->totloop, mesh->totpoly, poly_nors,
+ only_face_normals);
+
+ CustomData_add_layer(&mesh->pdata, CD_NORMAL, CD_ASSIGN, poly_nors, mesh->totpoly);
+
+ mesh->runtime.cd_dirty_vert &= ~CD_MASK_NORMAL;
+ }
+}
+
/* Note that this does not update the CD_NORMAL layer, but does update the normals in the CD_MVERT layer. */
void BKE_mesh_calc_normals(Mesh *mesh)
{
diff --git a/source/blender/blenkernel/intern/mesh_iterators.c b/source/blender/blenkernel/intern/mesh_iterators.c
index f96a91c6e4d..73dcd912f48 100644
--- a/source/blender/blenkernel/intern/mesh_iterators.c
+++ b/source/blender/blenkernel/intern/mesh_iterators.c
@@ -45,20 +45,21 @@ void BKE_mesh_foreach_mapped_vert(
void *userData,
MeshForeachFlag flag)
{
- MVert *mv = mesh->mvert;
+ const MVert *mv = mesh->mvert;
const int *index = CustomData_get_layer(&mesh->vdata, CD_ORIGINDEX);
- int i;
if (index) {
- for (i = 0; i < mesh->totvert; i++, mv++) {
+ for (int i = 0; i < mesh->totvert; i++, mv++) {
const short *no = (flag & MESH_FOREACH_USE_NORMAL) ? mv->no : NULL;
const int orig = *index++;
- if (orig == ORIGINDEX_NONE) continue;
+ if (orig == ORIGINDEX_NONE) {
+ continue;
+ }
func(userData, orig, mv->co, NULL, no);
}
}
else {
- for (i = 0; i < mesh->totvert; i++, mv++) {
+ for (int i = 0; i < mesh->totvert; i++, mv++) {
const short *no = (flag & MESH_FOREACH_USE_NORMAL) ? mv->no : NULL;
func(userData, i, mv->co, NULL, no);
}
@@ -71,18 +72,23 @@ void BKE_mesh_foreach_mapped_edge(
void (*func)(void *userData, int index, const float v0co[3], const float v1co[3]),
void *userData)
{
- MVert *mv = mesh->mvert;
- MEdge *med = mesh->medge;
- int i, orig, *index = CustomData_get_layer(&mesh->edata, CD_ORIGINDEX);
-
- for (i = 0; i < mesh->totedge; i++, med++) {
- if (index) {
- orig = *index++;
- if (orig == ORIGINDEX_NONE) continue;
+ const MVert *mv = mesh->mvert;
+ const MEdge *med = mesh->medge;
+ const int *index = CustomData_get_layer(&mesh->edata, CD_ORIGINDEX);
+
+ if (index) {
+ for (int i = 0; i < mesh->totedge; i++, med++) {
+ const int orig = *index++;
+ if (orig == ORIGINDEX_NONE) {
+ continue;
+ }
func(userData, orig, mv[med->v1].co, mv[med->v2].co);
}
- else
+ }
+ else {
+ for (int i = 0; i < mesh->totedge; i++, med++) {
func(userData, i, mv[med->v1].co, mv[med->v2].co);
+ }
}
}
@@ -104,12 +110,25 @@ void BKE_mesh_foreach_mapped_loop(
const int *f_index = CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX);
int p_idx, i;
- for (p_idx = 0; p_idx < mesh->totpoly; ++p_idx, ++mp) {
- for (i = 0; i < mp->totloop; ++i, ++ml) {
- const int v_idx = v_index ? v_index[ml->v] : ml->v;
- const int f_idx = f_index ? f_index[p_idx] : p_idx;
- const float *no = lnors ? *lnors++ : NULL;
- if (!ELEM(ORIGINDEX_NONE, v_idx, f_idx)) {
+ if (v_index || f_index) {
+ for (p_idx = 0; p_idx < mesh->totpoly; p_idx++, mp++) {
+ for (i = 0; i < mp->totloop; i++, ml++) {
+ const int v_idx = v_index ? v_index[ml->v] : ml->v;
+ const int f_idx = f_index ? f_index[p_idx] : p_idx;
+ const float *no = lnors ? *lnors++ : NULL;
+ if (ELEM(ORIGINDEX_NONE, v_idx, f_idx)) {
+ continue;
+ }
+ func(userData, v_idx, f_idx, mv[ml->v].co, no);
+ }
+ }
+ }
+ else {
+ for (p_idx = 0; p_idx < mesh->totpoly; p_idx++, mp++) {
+ for (i = 0; i < mp->totloop; i++, ml++) {
+ const int v_idx = ml->v;
+ const int f_idx = p_idx;
+ const float *no = lnors ? *lnors++ : NULL;
func(userData, v_idx, f_idx, mv[ml->v].co, no);
}
}
@@ -123,38 +142,39 @@ void BKE_mesh_foreach_mapped_face_center(
void *userData,
MeshForeachFlag flag)
{
- MVert *mvert = mesh->mvert;
- MPoly *mp;
- MLoop *ml;
- int i, orig, *index;
-
- index = CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX);
- mp = mesh->mpoly;
- for (i = 0; i < mesh->totpoly; i++, mp++) {
- float cent[3];
- float *no, _no[3];
-
- if (index) {
- orig = *index++;
- if (orig == ORIGINDEX_NONE) continue;
- }
- else {
- orig = i;
- }
-
- ml = &mesh->mloop[mp->loopstart];
- BKE_mesh_calc_poly_center(mp, ml, mvert, cent);
+ const MVert *mvert = mesh->mvert;
+ const MPoly *mp = mesh->mpoly;
+ const MLoop *ml;
+ float _no_buf[3];
+ float *no = (flag & MESH_FOREACH_USE_NORMAL) ? _no_buf : NULL;
+ const int *index = CustomData_get_layer(&mesh->pdata, CD_ORIGINDEX);
- if (flag & MESH_FOREACH_USE_NORMAL) {
- BKE_mesh_calc_poly_normal(mp, ml, mvert, (no = _no));
+ if (index) {
+ for (int i = 0; i < mesh->totpoly; i++, mp++) {
+ const int orig = *index++;
+ if (orig == ORIGINDEX_NONE) {
+ continue;
+ }
+ float cent[3];
+ ml = &mesh->mloop[mp->loopstart];
+ BKE_mesh_calc_poly_center(mp, ml, mvert, cent);
+ if (flag & MESH_FOREACH_USE_NORMAL) {
+ BKE_mesh_calc_poly_normal(mp, ml, mvert, no);
+ }
+ func(userData, orig, cent, no);
}
- else {
- no = NULL;
+ }
+ else {
+ for (int i = 0; i < mesh->totpoly; i++, mp++) {
+ float cent[3];
+ ml = &mesh->mloop[mp->loopstart];
+ BKE_mesh_calc_poly_center(mp, ml, mvert, cent);
+ if (flag & MESH_FOREACH_USE_NORMAL) {
+ BKE_mesh_calc_poly_normal(mp, ml, mvert, no);
+ }
+ func(userData, i, cent, no);
}
-
- func(userData, orig, cent, no);
}
-
}
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 1863e454397..41c35de8aea 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -826,58 +826,59 @@ void modifier_path_init(char *path, int path_maxlen, const char *name)
/* wrapper around ModifierTypeInfo.applyModifier that ensures valid normals */
-struct DerivedMesh *modwrap_applyModifier(
+struct Mesh *modwrap_applyModifier(
ModifierData *md, const ModifierEvalContext *ctx,
- struct DerivedMesh *dm)
+ struct Mesh *me)
{
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- BLI_assert(CustomData_has_layer(&dm->polyData, CD_NORMAL) == false);
+ BLI_assert(CustomData_has_layer(&me->pdata, CD_NORMAL) == false);
if (mti->dependsOnNormals && mti->dependsOnNormals(md)) {
- DM_ensure_normals(dm);
+ BKE_mesh_calc_normals(me);
}
- return modifier_applyModifier_DM_deprecated(md, ctx, dm);
+ return mti->applyModifier(md, ctx, me);
}
-struct DerivedMesh *modwrap_applyModifierEM(
+struct Mesh *modwrap_applyModifierEM(
ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *em, DerivedMesh *dm)
+ struct BMEditMesh *em, Mesh *me)
{
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- BLI_assert(CustomData_has_layer(&dm->polyData, CD_NORMAL) == false);
+ BLI_assert(CustomData_has_layer(&me->pdata, CD_NORMAL) == false);
if (mti->dependsOnNormals && mti->dependsOnNormals(md)) {
- DM_ensure_normals(dm);
+ BKE_mesh_calc_normals(me);
}
- return modifier_applyModifierEM_DM_deprecated(md, ctx, em, dm);
+ return mti->applyModifierEM(md, ctx, em, me);
}
void modwrap_deformVerts(
ModifierData *md, const ModifierEvalContext *ctx,
- DerivedMesh *dm, float (*vertexCos)[3], int numVerts)
+ Mesh *me, float (*vertexCos)[3], int numVerts)
{
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- BLI_assert(!dm || CustomData_has_layer(&dm->polyData, CD_NORMAL) == false);
+ BLI_assert(!me || CustomData_has_layer(&me->pdata, CD_NORMAL) == false);
- if (dm && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
- DM_ensure_normals(dm);
+ if (me && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
+ BKE_mesh_calc_normals(me);
}
- modifier_deformVerts_DM_deprecated(md, ctx, dm, vertexCos, numVerts);
+ mti->deformVerts(md, ctx, me, vertexCos, numVerts);
}
void modwrap_deformVertsEM(
ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *em, DerivedMesh *dm,
+ struct BMEditMesh *em, Mesh *me,
float (*vertexCos)[3], int numVerts)
{
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- BLI_assert(!dm || CustomData_has_layer(&dm->polyData, CD_NORMAL) == false);
+ BLI_assert(!me || CustomData_has_layer(&me->pdata, CD_NORMAL) == false);
- if (dm && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
- DM_ensure_normals(dm);
+ if (me && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
+ BKE_mesh_calc_normals(me);
}
- modifier_deformVertsEM_DM_deprecated(md, ctx, em, dm, vertexCos, numVerts);
+ mti->deformVertsEM(md, ctx, em, me, vertexCos, numVerts);
}
+
/* end modifier callback wrappers */
@@ -885,116 +886,11 @@ void modwrap_deformVertsEM(
* depending on if the modifier has been ported to Mesh or is still using DerivedMesh
*/
-void modifier_deformVerts_ensure_normals(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct Mesh *mesh,
- float (*vertexCos)[3], int numVerts)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- BLI_assert(!mesh || CustomData_has_layer(&mesh->pdata, CD_NORMAL) == false);
-
- if (mesh && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
- BKE_mesh_calc_normals(mesh);
- }
- mti->deformVerts(md, ctx, mesh, vertexCos, numVerts);
-}
-
-struct Mesh *modifier_applyModifier_ensure_normals(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct Mesh *mesh)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- BLI_assert(CustomData_has_layer(&mesh->pdata, CD_NORMAL) == false);
-
- if (mti->dependsOnNormals && mti->dependsOnNormals(md)) {
- BKE_mesh_calc_normals(mesh);
- }
- return mti->applyModifier(md, ctx, mesh);
-}
-
/* deprecated variants of above that accept DerivedMesh */
-void modifier_deformVerts_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct DerivedMesh *dm,
- float (*vertexCos)[3], int numVerts)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- /* TODO(sybren): deduplicate all the copies of this code in this file. */
- Mesh *mesh = NULL;
- if (dm != NULL) {
- mesh = BKE_id_new_nomain(ID_ME, NULL);
- DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false);
- }
-
- mti->deformVerts(md, ctx, mesh, vertexCos, numVerts);
-
- if (mesh != NULL) {
- BKE_id_free(NULL, mesh);
- }
-}
-
-void modifier_deformMatrices_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct DerivedMesh *dm,
- float (*vertexCos)[3], float (*defMats)[3][3], int numVerts)
-{
-
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- /* TODO(sybren): deduplicate all the copies of this code in this file. */
- Mesh *mesh = NULL;
- if (dm != NULL) {
- mesh = BKE_id_new_nomain(ID_ME, NULL);
- DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false);
- }
-
- mti->deformMatrices(md, ctx, mesh, vertexCos, defMats, numVerts);
-
- if (mesh != NULL) {
- BKE_id_free(NULL, mesh);
- }
-}
-
-void modifier_deformVertsEM_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct DerivedMesh *dm,
- float (*vertexCos)[3], int numVerts)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- /* TODO(sybren): deduplicate all the copies of this code in this file. */
- Mesh *mesh = NULL;
- if (dm != NULL) {
- mesh = BKE_id_new_nomain(ID_ME, NULL);
- DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false);
- }
-
- mti->deformVertsEM(md, ctx, editData, mesh, vertexCos, numVerts);
-
- if (mesh != NULL) {
- BKE_id_free(NULL, mesh);
- }
-}
-
-void modifier_deformMatricesEM_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *editData, struct DerivedMesh *dm,
- float (*vertexCos)[3], float (*defMats)[3][3], int numVerts)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- /* TODO(sybren): deduplicate all the copies of this code in this file. */
- Mesh *mesh = NULL;
- if (dm != NULL) {
- mesh = BKE_id_new_nomain(ID_ME, NULL);
- DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false);
- }
-
- mti->deformMatricesEM(md, ctx, editData, mesh, vertexCos, defMats, numVerts);
-
- if (mesh != NULL) {
- BKE_id_free(NULL, mesh);
- }
-}
-
-struct DerivedMesh *modifier_applyModifier_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct DerivedMesh *dm)
+struct DerivedMesh *modifier_applyModifier_DM_deprecated(
+ struct ModifierData *md, const ModifierEvalContext *ctx,
+ struct DerivedMesh *dm)
{
const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -1021,35 +917,6 @@ struct DerivedMesh *modifier_applyModifier_DM_deprecated(struct ModifierData *md
}
-struct DerivedMesh *modifier_applyModifierEM_DM_deprecated(struct ModifierData *md, const ModifierEvalContext *ctx,
- struct BMEditMesh *editData,
- struct DerivedMesh *dm)
-{
- const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-
- /* TODO(sybren): deduplicate all the copies of this code in this file. */
- Mesh *mesh = NULL;
- if (dm != NULL) {
- mesh = BKE_id_new_nomain(ID_ME, NULL);
- DM_to_mesh(dm, mesh, ctx->object, CD_MASK_EVERYTHING, false);
- }
-
- struct Mesh *new_mesh = mti->applyModifierEM(md, ctx, editData, mesh);
-
- /* Make a DM that doesn't reference new_mesh so we can free the latter. */
- DerivedMesh *ndm = CDDM_from_mesh_ex(new_mesh, CD_DUPLICATE, CD_MASK_EVERYTHING);
-
- if (new_mesh != mesh) {
- BKE_id_free(NULL, new_mesh);
- }
- if (mesh != NULL) {
- BKE_id_free(NULL, mesh);
- }
-
- return ndm;
-
-}
-
/**
* Get evaluated mesh for other evaluated object, which is used as an operand for the modifier,
* e.g. second operand for boolean modifier.
@@ -1063,7 +930,7 @@ Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval, boo
/* Note: currently we have no equivalent to derived cagemesh or even final dm in BMEditMesh...
* This is TODO in core depsgraph/modifier stack code still. */
BMEditMesh *em = BKE_editmesh_from_object(ob_eval);
- me = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0});
+ me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
*r_free_mesh = true;
}
else {
diff --git a/source/blender/blenkernel/intern/multires_reshape.c b/source/blender/blenkernel/intern/multires_reshape.c
index dcd439e82dc..b14010f3a90 100644
--- a/source/blender/blenkernel/intern/multires_reshape.c
+++ b/source/blender/blenkernel/intern/multires_reshape.c
@@ -944,7 +944,7 @@ bool multiresModifier_reshapeFromDeformModifier(
.depsgraph = depsgraph,
.object = object,
.flag = MOD_APPLY_USECACHE | MOD_APPLY_IGNORE_SIMPLIFY};
- modifier_deformVerts_ensure_normals(
+ modwrap_deformVerts(
md, &modifier_ctx, multires_mesh, deformed_verts,
multires_mesh->totvert);
BKE_id_free(NULL, multires_mesh);
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index cf6f2e5d842..cd564238a20 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -727,7 +727,7 @@ bool BKE_object_is_mode_compat(const struct Object *ob, eObjectMode object_mode)
/**
* Return if the object is visible, as evaluated by depsgraph
*/
-bool BKE_object_is_visible(Object *ob, const eObjectVisibilityCheck mode)
+bool BKE_object_is_visible(const Object *ob, const eObjectVisibilityCheck mode)
{
if ((ob->base_flag & BASE_VISIBLE) == 0) {
return false;
@@ -2052,7 +2052,11 @@ static void give_parvert(Object *par, int nr, float vec[3])
BMEditMesh *em = me->edit_btmesh;
DerivedMesh *dm;
+#if 0 /* FIXME(campbell): use mesh for both. */
dm = (em) ? em->derivedFinal : par->derivedFinal;
+#else
+ dm = par->derivedFinal;
+#endif
if (dm) {
int count = 0;
@@ -3749,12 +3753,12 @@ KDTree *BKE_object_as_kdtree(Object *ob, int *r_tot)
Mesh *me = ob->data;
unsigned int i;
- DerivedMesh *dm = ob->derivedDeform ? ob->derivedDeform : ob->derivedFinal;
+ Mesh *me_eval = ob->runtime.mesh_deform_eval ? ob->runtime.mesh_deform_eval : ob->runtime.mesh_deform_eval;
const int *index;
- if (dm && (index = CustomData_get_layer(&dm->vertData, CD_ORIGINDEX))) {
- MVert *mvert = dm->getVertArray(dm);
- unsigned int totvert = dm->getNumVerts(dm);
+ if (me_eval && (index = CustomData_get_layer(&me_eval->vdata, CD_ORIGINDEX))) {
+ MVert *mvert = me_eval->mvert;
+ uint totvert = me_eval->totvert;
/* tree over-allocs in case where some verts have ORIGINDEX_NONE */
tot = 0;
diff --git a/source/blender/blenkernel/intern/object_dupli.c b/source/blender/blenkernel/intern/object_dupli.c
index 6d9520dad1e..d9aa6407474 100644
--- a/source/blender/blenkernel/intern/object_dupli.c
+++ b/source/blender/blenkernel/intern/object_dupli.c
@@ -488,7 +488,7 @@ static void make_duplis_verts(const DupliContext *ctx)
/* We do not need any render-smecific handling anymore, depsgraph takes care of that. */
if (vdd.edit_btmesh != NULL) {
- /* XXX TODO replace with equivalent of editbmesh_get_derived_cage when available. */
+ /* XXX TODO replace with equivalent of editbmesh_get_eval_cage when available. */
vdd.me_eval = mesh_get_eval_deform(ctx->depsgraph, scene, parent, dm_mask);
}
else {
@@ -758,7 +758,7 @@ static void make_duplis_faces(const DupliContext *ctx)
/* We do not need any render-smecific handling anymore, depsgraph takes care of that. */
if (em != NULL) {
- /* XXX TODO replace with equivalent of editbmesh_get_derived_cage when available. */
+ /* XXX TODO replace with equivalent of editbmesh_get_eval_cage when available. */
fdd.me_eval = mesh_get_eval_deform(ctx->depsgraph, scene, parent, dm_mask);
}
else {
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 070f5daa019..545581e65ec 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -398,10 +398,6 @@ void BKE_palette_clear(Palette *palette)
Palette *BKE_palette_add(Main *bmain, const char *name)
{
Palette *palette = BKE_id_new(bmain, ID_PAL, name);
-
- /* enable fake user by default */
- id_fake_user_set(&palette->id);
-
return palette;
}
@@ -430,6 +426,12 @@ void BKE_palette_make_local(Main *bmain, Palette *palette, const bool lib_local)
BKE_id_make_local_generic(bmain, &palette->id, true, lib_local);
}
+void BKE_palette_init(Palette *palette)
+{
+ /* Enable fake user by default. */
+ id_fake_user_set(&palette->id);
+}
+
/** Free (or release) any data used by this palette (does not free the palette itself). */
void BKE_palette_free(Palette *palette)
{
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 802c1c6b6b9..7a217f59536 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -307,7 +307,7 @@ static PTCacheEdit *psys_orig_edit_get(ParticleSystem *psys)
return psys->orig_psys->edit;
}
-bool psys_in_edit_mode(Depsgraph *depsgraph, ParticleSystem *psys)
+bool psys_in_edit_mode(Depsgraph *depsgraph, const ParticleSystem *psys)
{
const ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph);
if (view_layer->basact == NULL) {
@@ -319,7 +319,7 @@ bool psys_in_edit_mode(Depsgraph *depsgraph, ParticleSystem *psys)
if (object->mode != OB_MODE_PARTICLE_EDIT) {
return false;
}
- ParticleSystem *psys_orig = psys_orig_get(psys);
+ const ParticleSystem *psys_orig = psys_orig_get((ParticleSystem *)psys);
return (psys_orig->edit || psys->pointcache->edit) &&
(use_render_params == false);
}
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index b3f1cbf6a1f..f5dd7ef794b 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -664,6 +664,7 @@ void smokeModifier_copy(const struct SmokeModifierData *smd, struct SmokeModifie
tsds->data_depth = sds->data_depth;
tsds->cache_file_format = sds->cache_file_format;
+ tsds->display_thickness = sds->display_thickness;
tsds->slice_method = sds->slice_method;
tsds->axis_slice_method = sds->axis_slice_method;
tsds->slice_per_voxel = sds->slice_per_voxel;
@@ -673,6 +674,8 @@ void smokeModifier_copy(const struct SmokeModifierData *smd, struct SmokeModifie
tsds->vector_draw_type = sds->vector_draw_type;
tsds->vector_scale = sds->vector_scale;
+ tsds->use_coba = sds->use_coba;
+ tsds->coba_field = sds->coba_field;
if (sds->coba) {
tsds->coba = MEM_dupallocN(sds->coba);
}
diff --git a/source/blender/blenlib/BLI_link_utils.h b/source/blender/blenlib/BLI_link_utils.h
index 5322547ac08..7a1a13a6b31 100644
--- a/source/blender/blenlib/BLI_link_utils.h
+++ b/source/blender/blenlib/BLI_link_utils.h
@@ -47,6 +47,15 @@
(list)->last = link; \
} (void)0
+/* Use for inserting after a certain element. */
+#define BLI_LINKS_INSERT_AFTER(list, node, link) { \
+ if ((node)->next == NULL) { \
+ (list)->last = link; \
+ } \
+ (link)->next = (node)->next; \
+ (node)->next = link; \
+} (void)0
+
#define BLI_LINKS_FREE(list) { \
while (list) { \
void *next = list->next; \
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index b3ab33312ba..52bc27caa1f 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -1202,12 +1202,12 @@ bool BLI_path_program_search(
do {
temp = strchr(path, separator);
if (temp) {
- strncpy(filename, path, temp - path);
+ memcpy(filename, path, temp - path);
filename[temp - path] = 0;
path = temp + 1;
}
else {
- strncpy(filename, path, sizeof(filename));
+ BLI_strncpy(filename, path, sizeof(filename));
}
BLI_path_append(filename, maxlen, name);
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 275d14dbca3..bae71fba036 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5168,6 +5168,9 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
smd->domain->tex = NULL;
smd->domain->tex_shadow = NULL;
smd->domain->tex_flame = NULL;
+ smd->domain->tex_flame_coba = NULL;
+ smd->domain->tex_coba = NULL;
+ smd->domain->tex_field = NULL;
smd->domain->tex_velocity_x = NULL;
smd->domain->tex_velocity_y = NULL;
smd->domain->tex_velocity_z = NULL;
diff --git a/source/blender/blenloader/intern/versioning_userdef.c b/source/blender/blenloader/intern/versioning_userdef.c
index cf5087b848b..b04acf6016c 100644
--- a/source/blender/blenloader/intern/versioning_userdef.c
+++ b/source/blender/blenloader/intern/versioning_userdef.c
@@ -57,6 +57,14 @@ static void do_versions_theme(UserDef *userdef, bTheme *btheme)
copy_v4_v4_char(btheme->tnla.anim_preview_range, btheme->tnla.anim_active);
copy_v4_v4_char(btheme->tipo.anim_preview_range, btheme->tact.anim_active);
}
+
+ if (!USER_VERSION_ATLEAST(280, 26)) {
+ copy_v4_v4_char(btheme->tui.icon_collection, U_theme_default.tui.icon_collection);
+ copy_v4_v4_char(btheme->tui.icon_object, U_theme_default.tui.icon_object);
+ copy_v4_v4_char(btheme->tui.icon_object_data, U_theme_default.tui.icon_object_data);
+ copy_v4_v4_char(btheme->tui.icon_modifier, U_theme_default.tui.icon_modifier);
+ copy_v4_v4_char(btheme->tui.icon_shading, U_theme_default.tui.icon_shading);
+ }
#undef USER_VERSION_ATLEAST
}
diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.c b/source/blender/bmesh/intern/bmesh_mesh_conv.c
index 7e1e1c53a8f..52d9d2cf445 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_conv.c
+++ b/source/blender/bmesh/intern/bmesh_mesh_conv.c
@@ -946,3 +946,152 @@ void BM_mesh_bm_to_me(
/* to be removed as soon as COW is enabled by default. */
BKE_mesh_runtime_clear_geometry(me);
}
+
+/**
+ * A version of #BM_mesh_bm_to_me intended for getting the mesh to pass to the modifier stack for evaluation,
+ * instad of mode switching (where we make sure all data is kept and do expensive lookups to maintain shape keys).
+ *
+ * Key differences:
+ *
+ * - Don't support merging with existing mesh.
+ * - Ignore shape-keys.
+ * - Ignore vertex-parents.
+ * - Ignore selection history.
+ * - Uses simpler method to calculate #ME_EDGEDRAW
+ * - Uses #CD_MASK_DERIVEDMESH instead of #CD_MASK_MESH.
+ *
+ * \note Was `cddm_from_bmesh_ex` in 2.7x, removed `MFace` support.
+ */
+void BM_mesh_bm_to_me_for_eval(BMesh *bm, Mesh *dm, const int64_t cd_mask_extra)
+{
+ /* must be an empty mesh. */
+ BLI_assert(dm->totvert == 0);
+ BLI_assert((cd_mask_extra & CD_MASK_SHAPEKEY) == 0);
+
+ dm->totvert = bm->totvert;
+ dm->totedge = bm->totedge;
+ dm->totface = 0;
+ dm->totloop = bm->totloop;
+ dm->totpoly = bm->totface;
+
+ CustomData_add_layer(&dm->vdata, CD_ORIGINDEX, CD_CALLOC, NULL, bm->totvert);
+ CustomData_add_layer(&dm->edata, CD_ORIGINDEX, CD_CALLOC, NULL, bm->totedge);
+ CustomData_add_layer(&dm->pdata, CD_ORIGINDEX, CD_CALLOC, NULL, bm->totface);
+
+ CustomData_add_layer(&dm->vdata, CD_MVERT, CD_CALLOC, NULL, bm->totvert);
+ CustomData_add_layer(&dm->edata, CD_MEDGE, CD_CALLOC, NULL, bm->totedge);
+ CustomData_add_layer(&dm->ldata, CD_MLOOP, CD_CALLOC, NULL, bm->totloop);
+ CustomData_add_layer(&dm->pdata, CD_MPOLY, CD_CALLOC, NULL, bm->totface);
+
+ BKE_mesh_update_customdata_pointers(dm, false);
+
+ BMIter iter;
+ BMVert *eve;
+ BMEdge *eed;
+ BMFace *efa;
+ MVert *mvert = dm->mvert;
+ MEdge *medge = dm->medge;
+ MLoop *mloop = dm->mloop;
+ MPoly *mpoly = dm->mpoly;
+ int *index, add_orig;
+ unsigned int i, j;
+
+ const int cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT);
+ const int cd_edge_bweight_offset = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
+ const int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
+
+ dm->runtime.deformed_only = true;
+
+ /* don't add origindex layer if one already exists */
+ add_orig = !CustomData_has_layer(&bm->pdata, CD_ORIGINDEX);
+
+ /* don't process shapekeys, we only feed them through the modifier stack as needed,
+ * e.g. for applying modifiers or the like*/
+ const CustomDataMask mask = (CD_MASK_DERIVEDMESH | cd_mask_extra) & ~CD_MASK_SHAPEKEY;
+ CustomData_merge(&bm->vdata, &dm->vdata, mask, CD_CALLOC, dm->totvert);
+ CustomData_merge(&bm->edata, &dm->edata, mask, CD_CALLOC, dm->totedge);
+ CustomData_merge(&bm->ldata, &dm->ldata, mask, CD_CALLOC, dm->totloop);
+ CustomData_merge(&bm->pdata, &dm->pdata, mask, CD_CALLOC, dm->totpoly);
+
+ index = CustomData_get_layer(&dm->vdata, CD_ORIGINDEX);
+
+ BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
+ MVert *mv = &mvert[i];
+
+ copy_v3_v3(mv->co, eve->co);
+
+ BM_elem_index_set(eve, i); /* set_inline */
+
+ normal_float_to_short_v3(mv->no, eve->no);
+
+ mv->flag = BM_vert_flag_to_mflag(eve);
+
+ if (cd_vert_bweight_offset != -1) mv->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eve, cd_vert_bweight_offset);
+
+ if (add_orig) *index++ = i;
+
+ CustomData_from_bmesh_block(&bm->vdata, &dm->vdata, eve->head.data, i);
+ }
+ bm->elem_index_dirty &= ~BM_VERT;
+
+ index = CustomData_get_layer(&dm->edata, CD_ORIGINDEX);
+ BM_ITER_MESH_INDEX (eed, &iter, bm, BM_EDGES_OF_MESH, i) {
+ MEdge *med = &medge[i];
+
+ BM_elem_index_set(eed, i); /* set_inline */
+
+ med->v1 = BM_elem_index_get(eed->v1);
+ med->v2 = BM_elem_index_get(eed->v2);
+
+ med->flag = BM_edge_flag_to_mflag(eed);
+
+ /* handle this differently to editmode switching,
+ * only enable draw for single user edges rather then calculating angle */
+ if ((med->flag & ME_EDGEDRAW) == 0) {
+ if (eed->l && eed->l == eed->l->radial_next) {
+ med->flag |= ME_EDGEDRAW;
+ }
+ }
+
+ if (cd_edge_crease_offset != -1) med->crease = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_crease_offset);
+ if (cd_edge_bweight_offset != -1) med->bweight = BM_ELEM_CD_GET_FLOAT_AS_UCHAR(eed, cd_edge_bweight_offset);
+
+ CustomData_from_bmesh_block(&bm->edata, &dm->edata, eed->head.data, i);
+ if (add_orig) *index++ = i;
+ }
+ bm->elem_index_dirty &= ~BM_EDGE;
+
+ index = CustomData_get_layer(&dm->pdata, CD_ORIGINDEX);
+ j = 0;
+ BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, i) {
+ BMLoop *l_iter;
+ BMLoop *l_first;
+ MPoly *mp = &mpoly[i];
+
+ BM_elem_index_set(efa, i); /* set_inline */
+
+ mp->totloop = efa->len;
+ mp->flag = BM_face_flag_to_mflag(efa);
+ mp->loopstart = j;
+ mp->mat_nr = efa->mat_nr;
+
+ l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
+ do {
+ mloop->v = BM_elem_index_get(l_iter->v);
+ mloop->e = BM_elem_index_get(l_iter->e);
+ CustomData_from_bmesh_block(&bm->ldata, &dm->ldata, l_iter->head.data, j);
+
+ BM_elem_index_set(l_iter, j); /* set_inline */
+
+ j++;
+ mloop++;
+ } while ((l_iter = l_iter->next) != l_first);
+
+ CustomData_from_bmesh_block(&bm->pdata, &dm->pdata, efa->head.data, i);
+
+ if (add_orig) *index++ = i;
+ }
+ bm->elem_index_dirty &= ~(BM_FACE | BM_LOOP);
+
+ dm->cd_flag = BM_mesh_cd_flag_from_bmesh(bm);
+}
diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.h b/source/blender/bmesh/intern/bmesh_mesh_conv.h
index 008960e7f6e..a8bef1ee2a2 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_conv.h
+++ b/source/blender/bmesh/intern/bmesh_mesh_conv.h
@@ -65,4 +65,9 @@ void BM_mesh_bm_to_me(
const struct BMeshToMeshParams *params)
ATTR_NONNULL(2, 3, 4);
+void BM_mesh_bm_to_me_for_eval(
+ BMesh *bm, struct Mesh *me, const int64_t cd_mask_extra)
+ATTR_NONNULL(1, 2);
+
+
#endif /* __BMESH_MESH_CONV_H__ */
diff --git a/source/blender/bmesh/operators/bmo_subdivide.c b/source/blender/bmesh/operators/bmo_subdivide.c
index c8ba2134a73..66730f8c837 100644
--- a/source/blender/bmesh/operators/bmo_subdivide.c
+++ b/source/blender/bmesh/operators/bmo_subdivide.c
@@ -182,15 +182,12 @@ static void interp_slerp_co_no_v3(
/* calculate sphere 'center' */
{
/* use point on plane to */
- float plane_a[4], plane_b[4], plane_c[4];
float no_mid[3], no_ortho[3];
/* pass this as an arg instead */
#if 0
float no_dir[3];
#endif
- float v_a_no_ortho[3], v_b_no_ortho[3];
-
add_v3_v3v3(no_mid, no_a, no_b);
normalize_v3(no_mid);
@@ -200,24 +197,28 @@ static void interp_slerp_co_no_v3(
#endif
/* axis of slerp */
+ bool center_ok = false;
cross_v3_v3v3(no_ortho, no_mid, no_dir);
- normalize_v3(no_ortho);
-
- /* create planes */
- cross_v3_v3v3(v_a_no_ortho, no_ortho, no_a);
- cross_v3_v3v3(v_b_no_ortho, no_ortho, no_b);
- project_v3_plane(v_a_no_ortho, no_ortho, v_a_no_ortho);
- project_v3_plane(v_b_no_ortho, no_ortho, v_b_no_ortho);
-
- plane_from_point_normal_v3(plane_a, co_a, v_a_no_ortho);
- plane_from_point_normal_v3(plane_b, co_b, v_b_no_ortho);
- plane_from_point_normal_v3(plane_c, co_b, no_ortho);
-
- /* find the sphere center from 3 planes */
- if (isect_plane_plane_plane_v3(plane_a, plane_b, plane_c, center)) {
- /* pass */
+ if (normalize_v3(no_ortho) != 0.0f) {
+ float plane_a[4], plane_b[4], plane_c[4];
+ float v_a_no_ortho[3], v_b_no_ortho[3];
+
+ /* create planes */
+ cross_v3_v3v3(v_a_no_ortho, no_ortho, no_a);
+ cross_v3_v3v3(v_b_no_ortho, no_ortho, no_b);
+ project_v3_plane(v_a_no_ortho, no_ortho, v_a_no_ortho);
+ project_v3_plane(v_b_no_ortho, no_ortho, v_b_no_ortho);
+
+ plane_from_point_normal_v3(plane_a, co_a, v_a_no_ortho);
+ plane_from_point_normal_v3(plane_b, co_b, v_b_no_ortho);
+ plane_from_point_normal_v3(plane_c, co_b, no_ortho);
+
+ /* find the sphere center from 3 planes */
+ if (isect_plane_plane_plane_v3(plane_a, plane_b, plane_c, center)) {
+ center_ok = true;
+ }
}
- else {
+ if (center_ok == false) {
mid_v3_v3v3(center, co_a, co_b);
}
}
diff --git a/source/blender/collada/AnimationImporter.h b/source/blender/collada/AnimationImporter.h
index f63329158f0..ff49bc369cf 100644
--- a/source/blender/collada/AnimationImporter.h
+++ b/source/blender/collada/AnimationImporter.h
@@ -181,11 +181,12 @@ public:
// prerequisites:
// animlist_map - map animlist id -> animlist
// curve_map - map anim id -> curve(s)
- Object * translate_animation_OLD(Main *bmain, COLLADAFW::Node *node,
- std::map<COLLADAFW::UniqueId, Object*>& object_map,
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
- COLLADAFW::Transformation::TransformationType tm_type,
- Object *par_job = NULL);
+ Object *translate_animation_OLD(
+ Main *bmain, COLLADAFW::Node *node,
+ std::map<COLLADAFW::UniqueId, Object*>& object_map,
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*>& root_map,
+ COLLADAFW::Transformation::TransformationType tm_type,
+ Object *par_job = NULL);
void find_frames( std::vector<float>* frames, std::vector<FCurve*>* curves );
void find_frames_old( std::vector<float>* frames, COLLADAFW::Node * node, COLLADAFW::Transformation::TransformationType tm_type );
diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp
index 85b9d3297ca..a77385c8d00 100644
--- a/source/blender/collada/ArmatureExporter.cpp
+++ b/source/blender/collada/ArmatureExporter.cpp
@@ -69,7 +69,7 @@ void ArmatureExporter::add_armature_bones(bContext *C, Depsgraph *depsgraph, Obj
Main *bmain = CTX_data_main(C);
// write bone nodes
- bArmature * armature = (bArmature *)ob_arm->data;
+ bArmature *armature = (bArmature *)ob_arm->data;
bool is_edited = armature->edbo != NULL;
if (!is_edited)
diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp
index a2c367e5076..32c7363a994 100644
--- a/source/blender/collada/ArmatureImporter.cpp
+++ b/source/blender/collada/ArmatureImporter.cpp
@@ -463,11 +463,11 @@ void ArmatureImporter::create_armature_bones(Main *bmain, std::vector<Object *>
if (!ob_arm)
continue;
- bArmature * armature = (bArmature *)ob_arm->data;
+ bArmature *armature = (bArmature *)ob_arm->data;
if (!armature)
continue;
- char * bone_name = (char *)bc_get_joint_name(*ri);
+ char *bone_name = (char *)bc_get_joint_name(*ri);
Bone *bone = BKE_armature_find_bone_name(armature, bone_name);
if (bone) {
fprintf(stderr, "Reuse of child bone [%s] as root bone in same Armature is not supported.\n", bone_name);
@@ -592,7 +592,7 @@ Object *ArmatureImporter::create_armature_bones(Main *bmain, SkinInfo& skin)
}
// enter armature edit mode
- bArmature * armature = (bArmature *)ob_arm->data;
+ bArmature *armature = (bArmature *)ob_arm->data;
ED_armature_to_edit(armature);
totbone = 0;
diff --git a/source/blender/collada/ControllerExporter.cpp b/source/blender/collada/ControllerExporter.cpp
index cb8903200f1..84812451c05 100644
--- a/source/blender/collada/ControllerExporter.cpp
+++ b/source/blender/collada/ControllerExporter.cpp
@@ -403,7 +403,7 @@ void ControllerExporter::add_weight_extras(Key *key)
// can also try the base element and param alternative
COLLADASW::BaseExtraTechnique extra;
- KeyBlock * kb = (KeyBlock *)key->block.first;
+ KeyBlock *kb = (KeyBlock *)key->block.first;
//skip the basis
kb = kb->next;
for (; kb; kb = kb->next) {
diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp
index 0beded56b3b..b155160697b 100644
--- a/source/blender/collada/GeometryExporter.cpp
+++ b/source/blender/collada/GeometryExporter.cpp
@@ -151,9 +151,9 @@ void GeometryExporter::operator()(Object *ob)
closeGeometry();
if (this->export_settings->include_shapekeys) {
- Key * key = BKE_key_from_object(ob);
+ Key *key = BKE_key_from_object(ob);
if (key) {
- KeyBlock * kb = (KeyBlock *)key->block.first;
+ KeyBlock *kb = (KeyBlock *)key->block.first;
//skip the basis
kb = kb->next;
for (; kb; kb = kb->next) {
diff --git a/source/blender/collada/GeometryExporter.h b/source/blender/collada/GeometryExporter.h
index 5d74124b07a..e47b3f4eee8 100644
--- a/source/blender/collada/GeometryExporter.h
+++ b/source/blender/collada/GeometryExporter.h
@@ -128,7 +128,7 @@ private:
const ExportSettings *export_settings;
- Mesh * get_mesh(Scene *sce, Object *ob, int apply_modifiers);
+ Mesh *get_mesh(Scene *sce, Object *ob, int apply_modifiers);
};
struct GeometryFunctor {
diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp
index aa97622cd66..4fae65fab38 100644
--- a/source/blender/collada/collada_utils.cpp
+++ b/source/blender/collada/collada_utils.cpp
@@ -610,7 +610,7 @@ inline bool isInteger(const std::string & s)
{
if (s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) return false;
- char * p;
+ char *p;
strtol(s.c_str(), &p, 10);
return (*p == 0);
diff --git a/source/blender/compositor/intern/COM_NodeOperation.cpp b/source/blender/compositor/intern/COM_NodeOperation.cpp
index 1063386aa58..09b05313898 100644
--- a/source/blender/compositor/intern/COM_NodeOperation.cpp
+++ b/source/blender/compositor/intern/COM_NodeOperation.cpp
@@ -171,7 +171,7 @@ bool NodeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOper
rcti tempOutput;
bool first = true;
for (int i = 0; i < getNumberOfInputSockets(); i ++) {
- NodeOperation * inputOperation = this->getInputOperation(i);
+ NodeOperation *inputOperation = this->getInputOperation(i);
if (inputOperation && inputOperation->determineDependingAreaOfInterest(input, readOperation, &tempOutput)) {
if (first) {
output->xmin = tempOutput.xmin;
diff --git a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
index a252af053cc..b40051440af 100644
--- a/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
+++ b/source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cpp
@@ -288,7 +288,7 @@ void InverseSearchRadiusOperation::initExecution()
void *InverseSearchRadiusOperation::initializeTileData(rcti *rect)
{
- MemoryBuffer * data = new MemoryBuffer(COM_DT_COLOR, rect);
+ MemoryBuffer *data = new MemoryBuffer(COM_DT_COLOR, rect);
float *buffer = data->getBuffer();
int x, y;
int width = this->m_inputRadius->getWidth();
diff --git a/source/blender/datatoc/datatoc_icon_split.py b/source/blender/datatoc/datatoc_icon_split.py
index 87f3fdae478..44fedca4398 100755
--- a/source/blender/datatoc/datatoc_icon_split.py
+++ b/source/blender/datatoc/datatoc_icon_split.py
@@ -140,6 +140,7 @@ def dice_icon_name(
if match:
if l.find('DEF_ICON_BLANK') == -1:
icon_name = match.group(1).lower()
+ print(icon_name)
_dice_icon_name_cache[count] = icon_name
count += 1
# ---- Done with icon cache
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
index 5b52843c1fe..d7575c35e45 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
@@ -466,8 +466,8 @@ void update_mesh_edit_mode_pointers(const Depsgraph *depsgraph,
mesh_cow->edit_btmesh = (BMEditMesh *)MEM_dupallocN(mesh_orig->edit_btmesh);
mesh_cow->edit_btmesh->ob =
(Object *)depsgraph->get_cow_id(&mesh_orig->edit_btmesh->ob->id);
- mesh_cow->edit_btmesh->derivedFinal = NULL;
- mesh_cow->edit_btmesh->derivedCage = NULL;
+ mesh_cow->edit_btmesh->mesh_eval_cage = NULL;
+ mesh_cow->edit_btmesh->mesh_eval_final = NULL;
}
/* Edit data is stored and owned by original datablocks, copied ones
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 4f9a90ba4f0..be742868cd6 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -269,7 +269,7 @@ data_to_c_simple(modes/shaders/edit_mesh_overlay_frag.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_vert.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_geom_tri.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_geom_edge.glsl SRC)
-data_to_c_simple(modes/shaders/edit_mesh_overlay_loosevert_vert.glsl SRC)
+data_to_c_simple(modes/shaders/edit_mesh_overlay_points_vert.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_facedot_frag.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_facedot_vert.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_ghost_clear_vert.glsl SRC)
@@ -337,6 +337,8 @@ data_to_c_simple(engines/gpencil/shaders/gpencil_edit_point_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_colorize_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_flip_frag.glsl SRC)
+data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl SRC)
+data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_light_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_pixel_frag.glsl SRC)
data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_rim_prepare_frag.glsl SRC)
diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c
index 2e3fdf37bdb..9dc8c8f2f34 100644
--- a/source/blender/draw/engines/basic/basic_engine.c
+++ b/source/blender/draw/engines/basic/basic_engine.c
@@ -112,7 +112,9 @@ static void basic_cache_populate(void *vedata, Object *ob)
{
BASIC_StorageList *stl = ((BASIC_Data *)vedata)->stl;
- if (!DRW_object_is_renderable(ob)) {
+ /* TODO(fclem) fix selection of smoke domains. */
+
+ if (!DRW_object_is_renderable(ob) || (ob->dt < OB_SOLID)) {
return;
}
@@ -125,7 +127,7 @@ static void basic_cache_populate(void *vedata, Object *ob)
if (!psys_check_enabled(ob, psys, false)) {
continue;
}
- if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+ if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) {
continue;
}
ParticleSettings *part = psys->part;
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 32de4266c82..bea7d000181 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -137,7 +137,7 @@ void EEVEE_cache_populate(void *vedata, Object *ob)
}
if (DRW_object_is_renderable(ob) &&
- DRW_check_object_visible_within_active_context(ob))
+ DRW_object_is_visible_in_active_context(ob))
{
if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) {
EEVEE_materials_cache_populate(vedata, sldata, ob, &cast_shadow);
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index a458be040fc..7319572d7eb 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -628,12 +628,12 @@ static void eevee_light_setup(Object *ob, EEVEE_Light *evli)
evli->radius = max_ff(0.001f, la->area_size);
}
else if (la->type == LA_AREA) {
- evli->sizex = max_ff(0.0001f, la->area_size * scale[0] * 0.5f);
+ evli->sizex = max_ff(0.003f, la->area_size * scale[0] * 0.5f);
if (ELEM(la->area_shape, LA_AREA_RECT, LA_AREA_ELLIPSE)) {
- evli->sizey = max_ff(0.0001f, la->area_sizey * scale[1] * 0.5f);
+ evli->sizey = max_ff(0.003f, la->area_sizey * scale[1] * 0.5f);
}
else {
- evli->sizey = max_ff(0.0001f, la->area_size * scale[1] * 0.5f);
+ evli->sizey = max_ff(0.003f, la->area_size * scale[1] * 0.5f);
}
}
else {
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 2d27bb8e705..38c2fb50f81 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -1080,23 +1080,23 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
}
}
-#define ADD_SHGROUP_CALL(shgrp, ob, geom, oedata) do { \
+#define ADD_SHGROUP_CALL(shgrp, ob, ma, geom, oedata) do { \
if (is_sculpt_mode_draw) { \
DRW_shgroup_call_sculpt_add(shgrp, ob, ob->obmat); \
} \
else { \
if (oedata) { \
- DRW_shgroup_call_object_add_with_callback(shgrp, geom, ob, EEVEE_lightprobes_obj_visibility_cb, oedata); \
+ DRW_shgroup_call_object_add_with_callback(shgrp, geom, ob, ma, EEVEE_lightprobes_obj_visibility_cb, oedata); \
} \
else { \
- DRW_shgroup_call_object_add(shgrp, geom, ob); \
+ DRW_shgroup_call_object_add_ex(shgrp, geom, ob, ma, false); \
} \
} \
} while (0)
-#define ADD_SHGROUP_CALL_SAFE(shgrp, ob, geom, oedata) do { \
+#define ADD_SHGROUP_CALL_SAFE(shgrp, ob, ma, geom, oedata) do { \
if (shgrp) { \
- ADD_SHGROUP_CALL(shgrp, ob, geom, oedata); \
+ ADD_SHGROUP_CALL(shgrp, ob, ma, geom, oedata); \
} \
} while (0)
@@ -1498,95 +1498,97 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sld
*/
bool use_volume_material = (gpumat_array[0] && GPU_material_use_domain_volume(gpumat_array[0]));
- /* Get per-material split surface */
- char *auto_layer_names;
- int *auto_layer_is_srgb;
- int auto_layer_count;
- struct GPUBatch **mat_geom = DRW_cache_object_surface_material_get(
- ob, gpumat_array, materials_len,
- &auto_layer_names,
- &auto_layer_is_srgb,
- &auto_layer_count);
- if (mat_geom) {
- for (int i = 0; i < materials_len; ++i) {
- if (mat_geom[i] == NULL) {
- continue;
- }
- EEVEE_ObjectEngineData *oedata = NULL;
- Material *ma = give_current_material(ob, i + 1);
-
- if (ma == NULL)
- ma = &defmaterial;
-
- /* Do not render surface if we are rendering a volume object
- * and do not have a surface closure. */
- if (use_volume_material &&
- (gpumat_array[i] && !GPU_material_use_domain_surface(gpumat_array[i])))
- {
- continue;
- }
+ if (ob->dt >= OB_SOLID) {
+ /* Get per-material split surface */
+ char *auto_layer_names;
+ int *auto_layer_is_srgb;
+ int auto_layer_count;
+ struct GPUBatch **mat_geom = DRW_cache_object_surface_material_get(
+ ob, gpumat_array, materials_len,
+ &auto_layer_names,
+ &auto_layer_is_srgb,
+ &auto_layer_count);
+ if (mat_geom) {
+ for (int i = 0; i < materials_len; ++i) {
+ if (mat_geom[i] == NULL) {
+ continue;
+ }
+ EEVEE_ObjectEngineData *oedata = NULL;
+ Material *ma = give_current_material(ob, i + 1);
+
+ if (ma == NULL)
+ ma = &defmaterial;
+
+ /* Do not render surface if we are rendering a volume object
+ * and do not have a surface closure. */
+ if (use_volume_material &&
+ (gpumat_array[i] && !GPU_material_use_domain_surface(gpumat_array[i])))
+ {
+ continue;
+ }
- /* XXX TODO rewrite this to include the dupli objects.
- * This means we cannot exclude dupli objects from reflections!!! */
- if ((ob->base_flag & BASE_FROMDUPLI) == 0) {
- oedata = EEVEE_object_data_ensure(ob);
- oedata->ob = ob;
- oedata->test_data = &sldata->probes->vis_data;
- }
+ /* XXX TODO rewrite this to include the dupli objects.
+ * This means we cannot exclude dupli objects from reflections!!! */
+ if ((ob->base_flag & BASE_FROMDUPLI) == 0) {
+ oedata = EEVEE_object_data_ensure(ob);
+ oedata->ob = ob;
+ oedata->test_data = &sldata->probes->vis_data;
+ }
- /* Shading pass */
- ADD_SHGROUP_CALL(shgrp_array[i], ob, mat_geom[i], oedata);
+ /* Shading pass */
+ ADD_SHGROUP_CALL(shgrp_array[i], ob, ma, mat_geom[i], oedata);
- /* Depth Prepass */
- ADD_SHGROUP_CALL_SAFE(shgrp_depth_array[i], ob, mat_geom[i], oedata);
- ADD_SHGROUP_CALL_SAFE(shgrp_depth_clip_array[i], ob, mat_geom[i], oedata);
+ /* Depth Prepass */
+ ADD_SHGROUP_CALL_SAFE(shgrp_depth_array[i], ob, ma, mat_geom[i], oedata);
+ ADD_SHGROUP_CALL_SAFE(shgrp_depth_clip_array[i], ob, ma, mat_geom[i], oedata);
- char *name = auto_layer_names;
- for (int j = 0; j < auto_layer_count; ++j) {
- /* TODO don't add these uniform when not needed (default pass shaders). */
- if (shgrp_array[i]) {
- DRW_shgroup_uniform_bool(shgrp_array[i], name, &auto_layer_is_srgb[j], 1);
- }
- if (shgrp_depth_array[i]) {
- DRW_shgroup_uniform_bool(shgrp_depth_array[i], name, &auto_layer_is_srgb[j], 1);
- }
- if (shgrp_depth_clip_array[i]) {
- DRW_shgroup_uniform_bool(shgrp_depth_clip_array[i], name, &auto_layer_is_srgb[j], 1);
+ char *name = auto_layer_names;
+ for (int j = 0; j < auto_layer_count; ++j) {
+ /* TODO don't add these uniform when not needed (default pass shaders). */
+ if (shgrp_array[i]) {
+ DRW_shgroup_uniform_bool(shgrp_array[i], name, &auto_layer_is_srgb[j], 1);
+ }
+ if (shgrp_depth_array[i]) {
+ DRW_shgroup_uniform_bool(shgrp_depth_array[i], name, &auto_layer_is_srgb[j], 1);
+ }
+ if (shgrp_depth_clip_array[i]) {
+ DRW_shgroup_uniform_bool(shgrp_depth_clip_array[i], name, &auto_layer_is_srgb[j], 1);
+ }
+ /* Go to next layer name. */
+ while (*name != '\0') { name++; }
+ name += 1;
}
- /* Go to next layer name. */
- while (*name != '\0') { name++; }
- name += 1;
- }
- /* Shadow Pass */
- if (ma->use_nodes && ma->nodetree && (ma->blend_method != MA_BM_SOLID)) {
- struct GPUMaterial *gpumat;
- switch (ma->blend_shadow) {
- case MA_BS_SOLID:
- EEVEE_lights_cache_shcaster_add(
- sldata, stl, mat_geom[i], ob);
- *cast_shadow = true;
- break;
- case MA_BS_CLIP:
- gpumat = EEVEE_material_mesh_depth_get(scene, ma, false, true);
- EEVEE_lights_cache_shcaster_material_add(
- sldata, psl, gpumat, mat_geom[i], ob, &ma->alpha_threshold);
- *cast_shadow = true;
- break;
- case MA_BS_HASHED:
- gpumat = EEVEE_material_mesh_depth_get(scene, ma, true, true);
- EEVEE_lights_cache_shcaster_material_add(
- sldata, psl, gpumat, mat_geom[i], ob, NULL);
- *cast_shadow = true;
- break;
- case MA_BS_NONE:
- default:
- break;
+ /* Shadow Pass */
+ if (ma->use_nodes && ma->nodetree && (ma->blend_method != MA_BM_SOLID)) {
+ struct GPUMaterial *gpumat;
+ switch (ma->blend_shadow) {
+ case MA_BS_SOLID:
+ EEVEE_lights_cache_shcaster_add(
+ sldata, stl, mat_geom[i], ob);
+ *cast_shadow = true;
+ break;
+ case MA_BS_CLIP:
+ gpumat = EEVEE_material_mesh_depth_get(scene, ma, false, true);
+ EEVEE_lights_cache_shcaster_material_add(
+ sldata, psl, gpumat, mat_geom[i], ob, &ma->alpha_threshold);
+ *cast_shadow = true;
+ break;
+ case MA_BS_HASHED:
+ gpumat = EEVEE_material_mesh_depth_get(scene, ma, true, true);
+ EEVEE_lights_cache_shcaster_material_add(
+ sldata, psl, gpumat, mat_geom[i], ob, NULL);
+ *cast_shadow = true;
+ break;
+ case MA_BS_NONE:
+ default:
+ break;
+ }
+ }
+ else {
+ EEVEE_lights_cache_shcaster_add(sldata, stl, mat_geom[i], ob);
+ *cast_shadow = true;
}
- }
- else {
- EEVEE_lights_cache_shcaster_add(sldata, stl, mat_geom[i], ob);
- *cast_shadow = true;
}
}
}
@@ -1617,7 +1619,7 @@ void EEVEE_hair_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sldata,
if (!psys_check_enabled(ob, psys, false)) {
continue;
}
- if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+ if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) {
continue;
}
ParticleSettings *part = psys->part;
diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c
index 80d8c066a44..e24142e3f71 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -163,7 +163,7 @@ void EEVEE_render_cache(
EEVEE_hair_cache_populate(vedata, sldata, ob, &cast_shadow);
}
- if (DRW_check_object_visible_within_active_context(ob)) {
+ if (DRW_object_is_visible_in_active_context(ob)) {
if (ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL)) {
EEVEE_materials_cache_populate(vedata, sldata, ob, &cast_shadow);
}
@@ -191,6 +191,12 @@ static void eevee_render_result_combined(
rect->xmin, rect->ymin,
BLI_rcti_size_x(rect), BLI_rcti_size_y(rect),
4, 0, rp->rect);
+
+ /* Premult alpha */
+ int pixels_len = BLI_rcti_size_x(rect) * BLI_rcti_size_y(rect);
+ for (int i = 0; i < pixels_len * 4; i += 4) {
+ mul_v3_fl(rp->rect + i, rp->rect[i + 3]);
+ }
}
static void eevee_render_result_subsurface(
@@ -543,6 +549,9 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl
/* Post Process */
EEVEE_draw_effects(sldata, vedata);
+ /* XXX Seems to fix TDR issue with NVidia drivers on linux. */
+ glFinish();
+
RE_engine_update_progress(engine, (float)(render_samples++) / (float)tot_sample);
}
diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c
index 256838609a6..4fffa3f285c 100644
--- a/source/blender/draw/engines/eevee/eevee_volumes.c
+++ b/source/blender/draw/engines/eevee/eevee_volumes.c
@@ -46,6 +46,7 @@
#include "eevee_private.h"
#include "GPU_draw.h"
#include "GPU_texture.h"
+#include "GPU_material.h"
static struct {
char *volumetric_common_lib;
@@ -471,13 +472,13 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata, EEVEE_Data *ved
struct GPUMaterial *mat = EEVEE_material_mesh_volume_get(scene, ma);
- DRWShadingGroup *grp = DRW_shgroup_material_empty_tri_batch_create(mat, vedata->psl->volumetric_objects_ps, sldata->common_data.vol_tex_size[2]);
-
/* If shader failed to compile or is currently compiling. */
- if (grp == NULL) {
+ if (GPU_material_status(mat) != GPU_MAT_SUCCESS) {
return;
}
+ DRWShadingGroup *grp = DRW_shgroup_material_empty_tri_batch_create(mat, vedata->psl->volumetric_objects_ps, sldata->common_data.vol_tex_size[2]);
+
/* Making sure it's updated. */
invert_m4_m4(ob->imat, ob->obmat);
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl
index 5f641c5d490..36c4562e137 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_lib.glsl
@@ -75,10 +75,11 @@ vec3 light_volume(LightData ld, vec4 l_vector)
}
else if (ld.l_type == SUN) {
power = (4.0f * ld.l_radius * ld.l_radius * M_2PI) * (1.0 / 12.5); /* Removing area light power*/
- power *= M_2PI * 0.78; /* Matching cycles with point light. */
+ power *= M_PI * 0.5; /* Matching cycles. */
}
else {
power = (4.0 * ld.l_radius * ld.l_radius) * (1.0 /10.0);
+ power *= M_2PI; /* Matching cycles with point light. */
}
/* OPTI: find a better way than calculating this on the fly */
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index 40245810f42..8e7d16e60ba 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -414,7 +414,7 @@ GPUBatch *DRW_gpencil_get_fill_geom(Object *ob, bGPDstroke *gps, const float col
/* Calculate triangles cache for filling area (must be done only after changes) */
if ((gps->flag & GP_STROKE_RECALC_CACHES) || (gps->tot_triangles == 0) || (gps->triangles == NULL)) {
- DRW_gpencil_triangulate_stroke_fill(gps);
+ DRW_gpencil_triangulate_stroke_fill(ob, gps);
ED_gpencil_calc_stroke_uv(ob, gps);
}
@@ -703,6 +703,7 @@ GPUBatch *DRW_gpencil_get_grid(Object *ob)
const float grid_h = gpd->grid.scale[1] * ED_scene_grid_scale(scene, &grid_unit);
const float space_w = (grid_w / gridlines);
const float space_h = (grid_h / gridlines);
+ const float offset[2] = { gpd->grid.offset[0], gpd->grid.offset[1] };
const uint vertex_len = 2 * (gridlines * 4 + 2);
@@ -722,34 +723,34 @@ GPUBatch *DRW_gpencil_get_grid(Object *ob)
const float line_w = a * space_w;
const float line_h = a * space_h;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w, -line_h, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w + offset[0], -line_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w, -line_h, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w + offset[0], -line_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w, +line_h, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w + offset[0], +line_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w, +line_h, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w + offset[0], +line_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line_w, -grid_h, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line_w + offset[0], -grid_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line_w, +grid_h, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, -line_w + offset[0], +grid_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line_w, -grid_h, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line_w + offset[0], -grid_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line_w, +grid_h, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, +line_w + offset[0], +grid_h + offset[1], axis);
idx++;
}
/* center lines */
if (do_center) {
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w, 0.0f, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, -grid_w + offset[0], 0.0f + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w, 0.0f, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, +grid_w + offset[0], 0.0f + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f, -grid_h, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f + offset[0], -grid_h + offset[1], axis);
idx++;
- set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f, +grid_h, axis);
+ set_grid_point(vbo, idx, col_grid, pos_id, color_id, 0.0f + offset[0], +grid_h + offset[1], axis);
idx++;
}
return GPU_batch_create_ex(GPU_PRIM_LINES, vbo, NULL, GPU_BATCH_OWNS_VBO);
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
index f7823a2fced..03a6f7342ab 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
@@ -92,7 +92,7 @@ static bool gpencil_can_draw_stroke(
/* calc bounding box in 2d using flat projection data */
static void gpencil_calc_2d_bounding_box(
- const float(*points2d)[2], int totpoints, float minv[2], float maxv[2], bool expand)
+ const float(*points2d)[2], int totpoints, float minv[2], float maxv[2])
{
minv[0] = points2d[0][0];
minv[1] = points2d[0][1];
@@ -115,14 +115,12 @@ static void gpencil_calc_2d_bounding_box(
maxv[1] = points2d[i][1];
}
}
- /* If not expanded, use a perfect square */
- if (expand == false) {
- if (maxv[0] > maxv[1]) {
- maxv[1] = maxv[0];
- }
- else {
- maxv[0] = maxv[1];
- }
+ /* use a perfect square */
+ if (maxv[0] > maxv[1]) {
+ maxv[1] = maxv[0];
+ }
+ else {
+ maxv[0] = maxv[1];
}
}
@@ -184,10 +182,12 @@ static void gpencil_stroke_2d_flat(const bGPDspoint *points, int totpoints, floa
}
/* Triangulate stroke for high quality fill (this is done only if cache is null or stroke was modified) */
-void DRW_gpencil_triangulate_stroke_fill(bGPDstroke *gps)
+void DRW_gpencil_triangulate_stroke_fill(Object *ob, bGPDstroke *gps)
{
BLI_assert(gps->totpoints >= 3);
+ bGPdata *gpd = (bGPdata *)ob->data;
+
/* allocate memory for temporary areas */
gps->tot_triangles = gps->totpoints - 2;
uint(*tmp_triangles)[3] = MEM_mallocN(sizeof(*tmp_triangles) * gps->tot_triangles, "GP Stroke temp triangulation");
@@ -204,7 +204,14 @@ void DRW_gpencil_triangulate_stroke_fill(bGPDstroke *gps)
float minv[2];
float maxv[2];
/* first needs bounding box data */
- gpencil_calc_2d_bounding_box(points2d, gps->totpoints, minv, maxv, false);
+ if (gpd->flag & GP_DATA_UV_ADAPTATIVE) {
+ gpencil_calc_2d_bounding_box(points2d, gps->totpoints, minv, maxv);
+ }
+ else {
+ ARRAY_SET_ITEMS(minv, -1.0f, -1.0f);
+ ARRAY_SET_ITEMS(maxv, 1.0f, 1.0f);
+ }
+
/* calc uv data */
gpencil_calc_stroke_fill_uv(points2d, gps->totpoints, minv, maxv, uv);
@@ -256,7 +263,7 @@ static void DRW_gpencil_recalc_geometry_caches(Object *ob, MaterialGPencilStyle
if ((gps->totpoints > 2) &&
((gp_style->fill_rgba[3] > GPENCIL_ALPHA_OPACITY_THRESH) || (gp_style->fill_style > 0)))
{
- DRW_gpencil_triangulate_stroke_fill(gps);
+ DRW_gpencil_triangulate_stroke_fill(ob, gps);
}
}
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 0b318bd974e..d854336cfd0 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -549,7 +549,7 @@ static void gpencil_add_draw_data(void *vedata, Object *ob)
void GPENCIL_cache_populate(void *vedata, Object *ob)
{
/* object must be visible */
- if (!DRW_check_object_visible_within_active_context(ob)) {
+ if (!DRW_object_is_visible_in_active_context(ob)) {
return;
}
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index df051f4697b..b8844d3c3e9 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -73,6 +73,7 @@ typedef struct tGPencilObjectCache {
DRWShadingGroup *fx_pixel_sh;
DRWShadingGroup *fx_rim_sh;
DRWShadingGroup *fx_shadow_sh;
+ DRWShadingGroup *fx_glow_sh;
DRWShadingGroup *fx_swirl_sh;
DRWShadingGroup *fx_flip_sh;
DRWShadingGroup *fx_light_sh;
@@ -231,6 +232,8 @@ typedef struct GPENCIL_e_data {
struct GPUShader *gpencil_fx_blur_sh;
struct GPUShader *gpencil_fx_colorize_sh;
struct GPUShader *gpencil_fx_flip_sh;
+ struct GPUShader *gpencil_fx_glow_prepare_sh;
+ struct GPUShader *gpencil_fx_glow_resolve_sh;
struct GPUShader *gpencil_fx_light_sh;
struct GPUShader *gpencil_fx_pixel_sh;
struct GPUShader *gpencil_fx_rim_prepare_sh;
@@ -303,7 +306,7 @@ void DRW_gpencil_populate_buffer_strokes(
void DRW_gpencil_populate_multiedit(
struct GPENCIL_e_data *e_data, void *vedata,
struct Scene *scene, struct Object *ob, struct tGPencilObjectCache *cache_ob);
-void DRW_gpencil_triangulate_stroke_fill(struct bGPDstroke *gps);
+void DRW_gpencil_triangulate_stroke_fill(struct Object *ob, struct bGPDstroke *gps);
void DRW_gpencil_multisample_ensure(struct GPENCIL_Data *vedata, int rect_w, int rect_h);
diff --git a/source/blender/draw/engines/gpencil/gpencil_render.c b/source/blender/draw/engines/gpencil/gpencil_render.c
index 41f0c601a13..8dc15472a20 100644
--- a/source/blender/draw/engines/gpencil/gpencil_render.c
+++ b/source/blender/draw/engines/gpencil/gpencil_render.c
@@ -130,7 +130,7 @@ static void GPENCIL_render_cache(
void *vedata, struct Object *ob,
struct RenderEngine *UNUSED(engine), struct Depsgraph *UNUSED(depsgraph))
{
- if ((ob == NULL) || (DRW_check_object_visible_within_active_context(ob) == false)) {
+ if ((ob == NULL) || (DRW_object_is_visible_in_active_context(ob) == false)) {
return;
}
diff --git a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
index 9e04365fe1d..2165fb251dc 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
@@ -50,6 +50,8 @@ extern char datatoc_gpencil_fx_rim_prepare_frag_glsl[];
extern char datatoc_gpencil_fx_rim_resolve_frag_glsl[];
extern char datatoc_gpencil_fx_shadow_prepare_frag_glsl[];
extern char datatoc_gpencil_fx_shadow_resolve_frag_glsl[];
+extern char datatoc_gpencil_fx_glow_prepare_frag_glsl[];
+extern char datatoc_gpencil_fx_glow_resolve_frag_glsl[];
extern char datatoc_gpencil_fx_swirl_frag_glsl[];
extern char datatoc_gpencil_fx_wave_frag_glsl[];
@@ -208,7 +210,7 @@ static void DRW_gpencil_fx_blur(
}
}
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
fx_shgrp = DRW_shgroup_create(
e_data->gpencil_fx_blur_sh,
@@ -236,7 +238,7 @@ static void DRW_gpencil_fx_colorize(
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
DRWShadingGroup *fx_shgrp;
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_colorize_sh, psl->fx_shader_pass);
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
@@ -269,7 +271,7 @@ static void DRW_gpencil_fx_flip(
fxd->flipmode += 1;
}
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_flip_sh, psl->fx_shader_pass);
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
@@ -298,7 +300,7 @@ static void DRW_gpencil_fx_light(
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
DRWShadingGroup *fx_shgrp;
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_light_sh, psl->fx_shader_pass);
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
@@ -351,7 +353,7 @@ static void DRW_gpencil_fx_pixel(
fxd->size[2] = (int)fxd->flag & FX_PIXEL_USE_LINES;
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_pixel_sh, psl->fx_shader_pass);
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
@@ -380,7 +382,7 @@ static void DRW_gpencil_fx_rim(
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
DRWShadingGroup *fx_shgrp;
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
/* prepare pass */
fx_shgrp = DRW_shgroup_create(
e_data->gpencil_fx_rim_prepare_sh,
@@ -431,8 +433,8 @@ static void DRW_gpencil_fx_rim(
/* Shadow FX */
static void DRW_gpencil_fx_shadow(
- ShaderFxData *fx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata,
- tGPencilObjectCache *cache)
+ ShaderFxData *fx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata,
+ tGPencilObjectCache *cache)
{
if (fx == NULL) {
return;
@@ -446,7 +448,7 @@ static void DRW_gpencil_fx_shadow(
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
DRWShadingGroup *fx_shgrp;
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
/* prepare pass */
fx_shgrp = DRW_shgroup_create(
e_data->gpencil_fx_shadow_prepare_sh,
@@ -512,10 +514,71 @@ static void DRW_gpencil_fx_shadow(
fxd->runtime.fx_sh_c = fx_shgrp;
}
+/* Glow FX */
+static void DRW_gpencil_fx_glow(
+ ShaderFxData *fx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata,
+ tGPencilObjectCache *cache)
+{
+ if (fx == NULL) {
+ return;
+ }
+ GlowShaderFxData *fxd = (GlowShaderFxData *)fx;
+
+ GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+ GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
+ DRWShadingGroup *fx_shgrp;
+
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ /* prepare pass */
+ fx_shgrp = DRW_shgroup_create(
+ e_data->gpencil_fx_glow_prepare_sh,
+ psl->fx_shader_pass_blend);
+ DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_a);
+
+ DRW_shgroup_uniform_vec3(fx_shgrp, "glow_color", &fxd->glow_color[0], 1);
+ DRW_shgroup_uniform_vec3(fx_shgrp, "select_color", &fxd->select_color[0], 1);
+ DRW_shgroup_uniform_int(fx_shgrp, "mode", &fxd->mode, 1);
+ DRW_shgroup_uniform_float(fx_shgrp, "threshold", &fxd->threshold, 1);
+
+ fxd->runtime.fx_sh = fx_shgrp;
+
+ /* blur pass */
+ fx_shgrp = DRW_shgroup_create(
+ e_data->gpencil_fx_blur_sh,
+ psl->fx_shader_pass_blend);
+ DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_fx);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_fx);
+ DRW_shgroup_uniform_int(fx_shgrp, "blur", &fxd->blur[0], 2);
+
+ DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &cache->loc[0], 1);
+ DRW_shgroup_uniform_float(fx_shgrp, "pixsize", stl->storage->pixsize, 1);
+ DRW_shgroup_uniform_float(fx_shgrp, "pixfactor", &cache->pixfactor, 1);
+
+ fxd->runtime.fx_sh_b = fx_shgrp;
+
+ /* resolve pass */
+ fx_shgrp = DRW_shgroup_create(
+ e_data->gpencil_fx_glow_resolve_sh,
+ psl->fx_shader_pass_blend);
+ DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_a);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "glowColor", &e_data->temp_color_tx_fx);
+ DRW_shgroup_uniform_texture_ref(fx_shgrp, "glowDepth", &e_data->temp_depth_tx_fx);
+
+ /* reuse field */
+ DRW_shgroup_uniform_int(fx_shgrp, "alpha_mode", &fxd->blur[1], 1);
+
+ fxd->runtime.fx_sh_c = fx_shgrp;
+}
+
/* Swirl FX */
static void DRW_gpencil_fx_swirl(
ShaderFxData *fx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata,
- tGPencilObjectCache *cache)
+ tGPencilObjectCache *cache)
{
if (fx == NULL) {
return;
@@ -531,7 +594,7 @@ static void DRW_gpencil_fx_swirl(
fxd->transparent = (int)fxd->flag & FX_SWIRL_MAKE_TRANSPARENT;
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_swirl_sh, psl->fx_shader_pass);
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
@@ -562,7 +625,7 @@ static void DRW_gpencil_fx_wave(
WaveShaderFxData *fxd = (WaveShaderFxData *)fx;
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
- struct GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
+ GPUBatch *fxquad = DRW_cache_fullscreen_quad_get();
DRWShadingGroup *fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_wave_sh, psl->fx_shader_pass);
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
@@ -617,6 +680,13 @@ void GPENCIL_create_fx_shaders(GPENCIL_e_data *e_data)
e_data->gpencil_fx_shadow_resolve_sh = DRW_shader_create_fullscreen(
datatoc_gpencil_fx_shadow_resolve_frag_glsl, NULL);
}
+ if (!e_data->gpencil_fx_glow_prepare_sh) {
+ e_data->gpencil_fx_glow_prepare_sh = DRW_shader_create_fullscreen(
+ datatoc_gpencil_fx_glow_prepare_frag_glsl, NULL);
+
+ e_data->gpencil_fx_glow_resolve_sh = DRW_shader_create_fullscreen(
+ datatoc_gpencil_fx_glow_resolve_frag_glsl, NULL);
+ }
if (!e_data->gpencil_fx_swirl_sh) {
e_data->gpencil_fx_swirl_sh = DRW_shader_create_fullscreen(
datatoc_gpencil_fx_swirl_frag_glsl, NULL);
@@ -639,6 +709,8 @@ void GPENCIL_delete_fx_shaders(GPENCIL_e_data *e_data)
DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_rim_resolve_sh);
DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_shadow_prepare_sh);
DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_shadow_resolve_sh);
+ DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_glow_prepare_sh);
+ DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_glow_resolve_sh);
DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_swirl_sh);
DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_wave_sh);
}
@@ -659,8 +731,8 @@ void GPENCIL_create_fx_passes(GPENCIL_PassList *psl)
/* prepare fx shading groups */
void DRW_gpencil_fx_prepare(
- struct GPENCIL_e_data *e_data, struct GPENCIL_Data *vedata,
- struct tGPencilObjectCache *cache)
+ GPENCIL_e_data *e_data, GPENCIL_Data *vedata,
+ tGPencilObjectCache *cache)
{
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
int ob_idx = cache->idx;
@@ -693,6 +765,9 @@ void DRW_gpencil_fx_prepare(
case eShaderFxType_Shadow:
DRW_gpencil_fx_shadow(fx, e_data, vedata, cache);
break;
+ case eShaderFxType_Glow:
+ DRW_gpencil_fx_glow(fx, e_data, vedata, cache);
+ break;
case eShaderFxType_Swirl:
DRW_gpencil_fx_swirl(fx, e_data, vedata, cache);
break;
@@ -718,8 +793,7 @@ static void gpencil_draw_fx_pass(
return;
}
- static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
-
+ const float clearcol[4] = {0.0f};
GPU_framebuffer_bind(fbl->temp_fb_b);
GPU_framebuffer_clear_color_depth(fbl->temp_fb_b, clearcol, 1.0f);
@@ -743,9 +817,9 @@ static void gpencil_draw_fx_pass(
/* helper to manage gaussian blur passes */
static void draw_gpencil_blur_passes(
- struct GPENCIL_e_data *e_data,
- struct GPENCIL_Data *vedata,
- struct BlurShaderFxData *fxd)
+ GPENCIL_e_data *e_data,
+ GPENCIL_Data *vedata,
+ BlurShaderFxData *fxd)
{
if (fxd->runtime.fx_sh == NULL) {
return;
@@ -782,19 +856,19 @@ static void draw_gpencil_blur_passes(
}
}
-static void draw_gpencil_rim_blur(
- struct GPENCIL_e_data *UNUSED(e_data),
- struct GPENCIL_Data *vedata,
- struct RimShaderFxData *fxd)
+/* blur intermediate pass */
+static void draw_gpencil_midpass_blur(
+ GPENCIL_Data *vedata,
+ ShaderFxData_Runtime *runtime)
{
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
- static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
+ const float clearcol[4] = {0.0f};
GPU_framebuffer_bind(fbl->temp_fb_b);
GPU_framebuffer_clear_color_depth(fbl->temp_fb_b, clearcol, 1.0f);
DRW_draw_pass_subset(psl->fx_shader_pass_blend,
- fxd->runtime.fx_sh_b, fxd->runtime.fx_sh_b);
+ runtime->fx_sh_b, runtime->fx_sh_b);
/* copy pass from b for ping-pong frame buffers */
GPU_framebuffer_bind(fbl->temp_fb_fx);
@@ -802,11 +876,40 @@ static void draw_gpencil_rim_blur(
DRW_draw_pass(psl->mix_pass_noblend);
}
+/* do blur of mid passes */
+static void draw_gpencil_do_blur(
+ GPENCIL_e_data *e_data,
+ GPENCIL_Data *vedata,
+ ShaderFxData_Runtime *runtime,
+ int samples, int bx, int by, int blur[2])
+{
+ e_data->input_depth_tx = e_data->temp_depth_tx_b;
+ e_data->input_color_tx = e_data->temp_color_tx_b;
+
+ if ((samples > 0) && ((bx > 0) || (by > 0))) {
+ for (int x = 0; x < samples * 4; x++) {
+
+ /* horizontal */
+ blur[0] = bx;
+ blur[1] = 0;
+ draw_gpencil_midpass_blur(vedata, runtime);
+
+ /* Vertical */
+ blur[0] = 0;
+ blur[1] = by;
+ draw_gpencil_midpass_blur(vedata, runtime);
+
+ blur[0] = bx;
+ blur[1] = by;
+ }
+ }
+}
+
/* helper to draw RIM passes */
static void draw_gpencil_rim_passes(
- struct GPENCIL_e_data *e_data,
- struct GPENCIL_Data *vedata,
- struct RimShaderFxData *fxd)
+ GPENCIL_e_data *e_data,
+ GPENCIL_Data *vedata,
+ RimShaderFxData *fxd)
{
if (fxd->runtime.fx_sh_b == NULL) {
return;
@@ -815,9 +918,7 @@ static void draw_gpencil_rim_passes(
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
- static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- int bx = fxd->blur[0];
- int by = fxd->blur[1];
+ const float clearcol[4] = {0.0f};
/* prepare mask */
GPU_framebuffer_bind(fbl->temp_fb_fx);
@@ -827,26 +928,11 @@ static void draw_gpencil_rim_passes(
fxd->runtime.fx_sh, fxd->runtime.fx_sh);
/* blur rim */
- e_data->input_depth_tx = e_data->temp_depth_tx_b;
- e_data->input_color_tx = e_data->temp_color_tx_b;
-
- if ((fxd->samples > 0) && ((bx > 0) || (by > 0))) {
- for (int x = 0; x < fxd->samples; x++) {
-
- /* horizontal */
- fxd->blur[0] = bx;
- fxd->blur[1] = 0;
- draw_gpencil_rim_blur(e_data, vedata, fxd);
-
- /* Vertical */
- fxd->blur[0] = 0;
- fxd->blur[1] = by;
- draw_gpencil_rim_blur(e_data, vedata, fxd);
-
- fxd->blur[0] = bx;
- fxd->blur[1] = by;
- }
- }
+ draw_gpencil_do_blur(
+ e_data, vedata, &fxd->runtime,
+ fxd->samples,
+ fxd->blur[0], fxd->blur[1],
+ &fxd->blur[0]);
/* resolve */
GPU_framebuffer_bind(fbl->temp_fb_b);
@@ -864,32 +950,55 @@ static void draw_gpencil_rim_passes(
DRW_draw_pass(psl->mix_pass_noblend);
}
-/* blur shadow */
-static void draw_gpencil_shadow_blur(
- struct GPENCIL_e_data *UNUSED(e_data),
- struct GPENCIL_Data *vedata,
- struct ShadowShaderFxData *fxd)
+/* helper to draw SHADOW passes */
+static void draw_gpencil_shadow_passes(
+ GPENCIL_e_data *e_data,
+ GPENCIL_Data *vedata,
+ ShadowShaderFxData *fxd)
{
+ if (fxd->runtime.fx_sh_b == NULL) {
+ return;
+ }
+
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
- static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
+ const float clearcol[4] = {0.0f};
+
+ /* prepare shadow */
+ GPU_framebuffer_bind(fbl->temp_fb_fx);
+ GPU_framebuffer_clear_color_depth(fbl->temp_fb_fx, clearcol, 1.0f);
+ DRW_draw_pass_subset(
+ psl->fx_shader_pass_blend,
+ fxd->runtime.fx_sh, fxd->runtime.fx_sh);
+
+ /* blur shadow */
+ draw_gpencil_do_blur(
+ e_data, vedata, &fxd->runtime,
+ fxd->samples,
+ fxd->blur[0], fxd->blur[1],
+ &fxd->blur[0]);
+ /* resolve */
GPU_framebuffer_bind(fbl->temp_fb_b);
GPU_framebuffer_clear_color_depth(fbl->temp_fb_b, clearcol, 1.0f);
- DRW_draw_pass_subset(psl->fx_shader_pass_blend,
- fxd->runtime.fx_sh_b, fxd->runtime.fx_sh_b);
+ DRW_draw_pass_subset(
+ psl->fx_shader_pass_blend,
+ fxd->runtime.fx_sh_c, fxd->runtime.fx_sh_c);
- /* copy pass from b for ping-pong frame buffers */
- GPU_framebuffer_bind(fbl->temp_fb_fx);
- GPU_framebuffer_clear_color_depth(fbl->temp_fb_fx, clearcol, 1.0f);
+ /* copy pass from b to a for ping-pong frame buffers */
+ e_data->input_depth_tx = e_data->temp_depth_tx_b;
+ e_data->input_color_tx = e_data->temp_color_tx_b;
+
+ GPU_framebuffer_bind(fbl->temp_fb_a);
+ GPU_framebuffer_clear_color_depth(fbl->temp_fb_a, clearcol, 1.0f);
DRW_draw_pass(psl->mix_pass_noblend);
}
-/* helper to draw SHADOW passes */
-static void draw_gpencil_shadow_passes(
- struct GPENCIL_e_data *e_data,
- struct GPENCIL_Data *vedata,
- struct ShadowShaderFxData *fxd)
+/* helper to draw GLOW passes */
+static void draw_gpencil_glow_passes(
+ GPENCIL_e_data *e_data,
+ GPENCIL_Data *vedata,
+ GlowShaderFxData *fxd)
{
if (fxd->runtime.fx_sh_b == NULL) {
return;
@@ -898,42 +1007,29 @@ static void draw_gpencil_shadow_passes(
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
GPENCIL_FramebufferList *fbl = ((GPENCIL_Data *)vedata)->fbl;
- static float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
- int bx = fxd->blur[0];
- int by = fxd->blur[1];
+ const float clearcol[4] = {0.0f};
- /* prepare shadow */
+ /* prepare glow */
GPU_framebuffer_bind(fbl->temp_fb_fx);
GPU_framebuffer_clear_color_depth(fbl->temp_fb_fx, clearcol, 1.0f);
DRW_draw_pass_subset(
psl->fx_shader_pass_blend,
fxd->runtime.fx_sh, fxd->runtime.fx_sh);
- /* blur shadow */
- e_data->input_depth_tx = e_data->temp_depth_tx_b;
- e_data->input_color_tx = e_data->temp_color_tx_b;
-
- if ((fxd->samples > 0) && ((bx > 0) || (by > 0))) {
- for (int x = 0; x < fxd->samples; x++) {
-
- /* horizontal */
- fxd->blur[0] = bx;
- fxd->blur[1] = 0;
- draw_gpencil_shadow_blur(e_data, vedata, fxd);
-
- /* Vertical */
- fxd->blur[0] = 0;
- fxd->blur[1] = by;
- draw_gpencil_shadow_blur(e_data, vedata, fxd);
-
- fxd->blur[0] = bx;
- fxd->blur[1] = by;
- }
- }
+ /* blur glow */
+ draw_gpencil_do_blur(
+ e_data, vedata, &fxd->runtime,
+ fxd->samples,
+ fxd->blur[0], fxd->blur[0],
+ &fxd->blur[0]);
/* resolve */
GPU_framebuffer_bind(fbl->temp_fb_b);
GPU_framebuffer_clear_color_depth(fbl->temp_fb_b, clearcol, 1.0f);
+
+ /* reuses blur field to keep alpha mode */
+ fxd->blur[1] = (fxd->flag & FX_GLOW_USE_ALPHA) ? 1 : 0;
+
DRW_draw_pass_subset(
psl->fx_shader_pass_blend,
fxd->runtime.fx_sh_c, fxd->runtime.fx_sh_c);
@@ -949,8 +1045,8 @@ static void draw_gpencil_shadow_passes(
/* apply all object fx effects */
void DRW_gpencil_fx_draw(
- struct GPENCIL_e_data *e_data,
- struct GPENCIL_Data *vedata, struct tGPencilObjectCache *cache)
+ GPENCIL_e_data *e_data,
+ GPENCIL_Data *vedata, tGPencilObjectCache *cache)
{
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
@@ -1003,6 +1099,12 @@ void DRW_gpencil_fx_draw(
draw_gpencil_shadow_passes(e_data, vedata, fxd);
break;
}
+ case eShaderFxType_Glow:
+ {
+ GlowShaderFxData *fxd = (GlowShaderFxData *)fx;
+ draw_gpencil_glow_passes(e_data, vedata, fxd);
+ break;
+ }
case eShaderFxType_Swirl:
{
SwirlShaderFxData *fxd = (SwirlShaderFxData *)fx;
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl
index c2bf1dbc1a7..c8bc5e1fe91 100644
--- a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl
@@ -56,4 +56,7 @@ void main()
outcolor += texelFetch(strokeColor, ivec2(uv.x + 1.0 * dx, uv.y - 1.0 * dy), 0) * 0.0947416;
FragColor = clamp(outcolor, 0, 1.0);
+
+ if (outcolor.a < 0.02f)
+ discard;
}
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl
new file mode 100644
index 00000000000..237cdf15627
--- /dev/null
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_prepare_frag.glsl
@@ -0,0 +1,68 @@
+uniform mat4 ProjectionMatrix;
+uniform mat4 ViewMatrix;
+
+/* ******************************************************************* */
+/* create glow mask */
+/* ******************************************************************* */
+uniform sampler2D strokeColor;
+uniform sampler2D strokeDepth;
+
+uniform vec3 glow_color;
+uniform vec3 select_color;
+uniform float threshold;
+uniform int mode;
+
+out vec4 FragColor;
+
+#define MODE_LUMINANCE 0
+#define MODE_COLOR 1
+
+/* calc luminance */
+float luma( vec3 color ) {
+ /* the color is linear, so do not apply tonemapping */
+ return (color.r + color.g + color.b) / 3.0;
+}
+
+bool check_color(vec3 color_a, vec3 color_b)
+{
+ /* need round the number to avoid precision errors */
+ if ((floor(color_a.r * 100) == floor(color_b.r * 100)) &&
+ (floor(color_a.g * 100) == floor(color_b.g * 100)) &&
+ (floor(color_a.b * 100) == floor(color_b.b * 100)))
+ {
+ return true;
+ }
+
+ return false;
+}
+
+void main()
+{
+ vec2 uv = vec2(gl_FragCoord.xy);
+
+ float stroke_depth = texelFetch(strokeDepth, ivec2(uv.xy), 0).r;
+ vec4 src_pixel= texelFetch(strokeColor, ivec2(uv.xy), 0);
+ vec4 outcolor;
+
+ /* is transparent */
+ if (src_pixel.a == 0.0f) {
+ discard;
+ }
+
+ if (mode == MODE_LUMINANCE) {
+ if (luma(src_pixel.rgb) < threshold) {
+ discard;
+ }
+ }
+ else if (mode == MODE_COLOR) {
+ if (!check_color(src_pixel.rgb, select_color.rgb)) {
+ discard;
+ }
+ }
+ else {
+ discard;
+ }
+
+ gl_FragDepth = stroke_depth;
+ FragColor = vec4(glow_color.rgb, 1.0);
+}
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl
new file mode 100644
index 00000000000..010c4ef4a88
--- /dev/null
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_glow_resolve_frag.glsl
@@ -0,0 +1,46 @@
+/* ******************************************************************* */
+/* Resolve GLOW pass */
+/* ******************************************************************* */
+uniform sampler2D strokeColor;
+uniform sampler2D strokeDepth;
+uniform sampler2D glowColor;
+uniform sampler2D glowDepth;
+uniform int alpha_mode;
+
+out vec4 FragColor;
+
+void main()
+{
+ vec4 outcolor;
+ ivec2 uv = ivec2(gl_FragCoord.xy);
+
+ float stroke_depth = texelFetch(strokeDepth, uv.xy, 0).r;
+ vec4 src_pixel= texelFetch(strokeColor, uv.xy, 0);
+ vec4 glow_pixel= texelFetch(glowColor, uv.xy, 0);
+ float glow_depth = texelFetch(glowDepth, uv.xy, 0).r;
+
+ if (alpha_mode == 0) {
+ outcolor = src_pixel + glow_pixel;
+ }
+ else {
+ if ((src_pixel.a < 0.1) || (glow_pixel.a < 0.1)) {
+ outcolor = src_pixel + glow_pixel;
+ }
+ else {
+ outcolor = src_pixel;
+ }
+ }
+
+ if (src_pixel.a < glow_pixel.a) {
+ gl_FragDepth = glow_depth;
+ }
+ else {
+ gl_FragDepth = stroke_depth;
+ }
+
+ if (outcolor.a < 0.001) {
+ discard;
+ }
+
+ FragColor = outcolor;
+}
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl
index 882b2cf59f1..df5248c7791 100644
--- a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl
@@ -37,4 +37,7 @@ void main()
FragColor = outcolor;
gl_FragDepth = stroke_depth;
+
+ if (outcolor.a < 0.02f)
+ discard;
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
index 1f14e506dcf..5b949a6d952 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -3,9 +3,15 @@ uniform mat4 ProjectionMatrix;
uniform mat4 ModelMatrixInverse;
uniform mat4 ModelViewMatrixInverse;
uniform mat4 ModelMatrix;
+uniform vec3 OrcoTexCoFactors[2];
uniform sampler2D depthBuffer;
+
uniform sampler3D densityTexture;
+uniform sampler3D shadowTexture;
+uniform sampler3D flameTexture;
+uniform sampler1D flameColorTexture;
+uniform sampler1D transferTexture;
uniform int samplesLen = 256;
uniform float stepLength; /* Step length in local space. */
@@ -62,15 +68,35 @@ float line_unit_box_intersect_dist(vec3 lineorigin, vec3 linedirection)
void volume_properties(vec3 ls_pos, out vec3 scattering, out float extinction)
{
- scattering = vec3(0.0);
- extinction = 1e-8;
+ vec3 co = ls_pos * 0.5 + 0.5;
+#ifdef USE_COBA
+ float val = texture(densityTexture, co).r;
+ vec4 tval = texture(transferTexture, val) * densityScale;
+ tval.rgb = pow(tval.rgb, vec3(2.2));
+ scattering = tval.rgb * 1500.0;
+ extinction = max(1e-4, tval.a * 50.0);
+#else
+ float flame = texture(flameTexture, co).r;
+ vec4 emission = texture(flameColorTexture, flame);
+ float shadows = texture(shadowTexture, co).r;
+ vec4 density = texture(densityTexture, co); /* rgb: color, a: density */
+
+ scattering = density.rgb * density.a * densityScale;
+ extinction = max(1e-4, dot(scattering, vec3(0.33333)));
- vec4 density = texture(densityTexture, ls_pos * 0.5 + 0.5);
- density.rgb /= density.a;
- density *= densityScale;
+ scattering *= shadows * M_PI;
+ /* 800 is arbitrary and here to mimic old viewport. TODO make it a parameter */
+ scattering += pow(emission.rgb, vec3(2.2)) * emission.a * 800.0;
+#endif
+}
- scattering = density.rgb;
- extinction = max(1e-8, density.a);
+void eval_volume_step(inout vec3 Lscat, float extinction, float step_len, out float Tr)
+{
+ Lscat *= phase_function_isotropic();
+ /* Evaluate Scattering */
+ Tr = exp(-extinction * step_len);
+ /* integrate along the current step segment */
+ Lscat = (Lscat - Lscat * Tr) / extinction;
}
#define P(x) ((x + 0.5) * (1.0 / 16.0))
@@ -96,18 +122,15 @@ vec4 volume_integration(
vec3 ls_pos = ray_ori + ray_dir * ray_len;
vec3 Lscat;
- float s_extinction;
+ float s_extinction, Tr;
volume_properties(ls_pos, Lscat, s_extinction);
- /* Evaluate Scattering */
- float Tr = exp(-s_extinction * step_len);
- /* integrate along the current step segment */
- Lscat = (Lscat - Lscat * Tr) / s_extinction;
+ eval_volume_step(Lscat, s_extinction, step_len, Tr);
/* accumulate and also take into account the transmittance from previous steps */
final_scattering += final_transmittance * Lscat;
final_transmittance *= Tr;
}
- return vec4(final_scattering, 1.0 - final_transmittance);
+ return vec4(final_scattering, final_transmittance);
}
void main()
@@ -134,15 +157,11 @@ void main()
step_len = 1.0 / step_len;
vec3 Lscat;
- float s_extinction;
+ float s_extinction, Tr;
volume_properties(localPos, Lscat, s_extinction);
- /* Evaluate Scattering */
- float Tr = exp(-s_extinction * step_len);
- /* integrate along the current step segment */
- Lscat = (Lscat - Lscat * Tr) / s_extinction;
-
- fragColor = vec4(Lscat, 1.0 - Tr);
+ eval_volume_step(Lscat, s_extinction, step_len, Tr);
+ fragColor = vec4(Lscat, Tr);
#else
vec2 screen_uv = gl_FragCoord.xy / vec2(textureSize(depthBuffer, 0).xy);
bool is_persp = ProjectionMatrix[3][3] == 0.0;
@@ -156,10 +175,13 @@ void main()
vec3 vs_ray_dir = (is_persp) ? (vs_ray_end - vs_ray_ori) : vec3(0.0, 0.0, -1.0);
vs_ray_dir /= abs(vs_ray_dir.z);
- vec3 ls_ray_dir = mat3(ModelViewMatrixInverse) * vs_ray_dir;
+ vec3 ls_ray_dir = mat3(ModelViewMatrixInverse) * vs_ray_dir * OrcoTexCoFactors[1] * 2.0;
vec3 ls_ray_ori = (ModelViewMatrixInverse * vec4(vs_ray_ori, 1.0)).xyz;
vec3 ls_ray_end = (ModelViewMatrixInverse * vec4(vs_ray_end, 1.0)).xyz;
+ ls_ray_ori = (OrcoTexCoFactors[0] + ls_ray_ori * OrcoTexCoFactors[1]) * 2.0 - 1.0;
+ ls_ray_end = (OrcoTexCoFactors[0] + ls_ray_end * OrcoTexCoFactors[1]) * 2.0 - 1.0;
+
/* TODO: Align rays to volume center so that it mimics old behaviour of slicing the volume. */
float dist = line_unit_box_intersect_dist(ls_ray_ori, ls_ray_dir);
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
index 90a22d9d02f..7ce21c3d5ca 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
@@ -1,5 +1,6 @@
uniform mat4 ModelViewProjectionMatrix;
+uniform vec3 OrcoTexCoFactors[2];
uniform float slicePosition;
uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */
@@ -23,9 +24,10 @@ void main()
else {
localPos = vec3(pos.xy, slicePosition * 2.0 - 1.0);
}
-
- gl_Position = ModelViewProjectionMatrix * vec4(localPos, 1.0);
+ vec3 final_pos = localPos;
#else
- gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ vec3 final_pos = pos;
#endif
+ final_pos = ((final_pos * 0.5 + 0.5) - OrcoTexCoFactors[0]) / OrcoTexCoFactors[1];
+ gl_Position = ModelViewProjectionMatrix * vec4(final_pos, 1.0);
}
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 7fbe928d29e..a1345afcf11 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -649,7 +649,7 @@ static void workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *o
if (!psys_check_enabled(ob, psys, false)) {
continue;
}
- if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+ if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) {
continue;
}
ParticleSettings *part = psys->part;
@@ -701,7 +701,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob)
return; /* Do not draw solid in this case. */
}
- if (!DRW_check_object_visible_within_active_context(ob)) {
+ if (!DRW_object_is_visible_in_active_context(ob) || (ob->dt < OB_SOLID)) {
return;
}
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index 0d4329c9699..cb11864df54 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -420,7 +420,7 @@ static void workbench_forward_cache_populate_particles(WORKBENCH_Data *vedata, O
if (!psys_check_enabled(ob, psys, false)) {
continue;
}
- if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+ if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) {
continue;
}
ParticleSettings *part = psys->part;
@@ -487,7 +487,7 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob)
return; /* Do not draw solid in this case. */
}
- if (!DRW_check_object_visible_within_active_context(ob)) {
+ if (!DRW_object_is_visible_in_active_context(ob) || (ob->dt < OB_SOLID)) {
return;
}
diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c
index ea4152486af..b0c08a2dc28 100644
--- a/source/blender/draw/engines/workbench/workbench_volume.c
+++ b/source/blender/draw/engines/workbench/workbench_volume.c
@@ -35,7 +35,11 @@
static struct {
struct GPUShader *volume_sh;
+ struct GPUShader *volume_coba_sh;
struct GPUShader *volume_slice_sh;
+ struct GPUShader *volume_slice_coba_sh;
+ struct GPUTexture *dummy_tex;
+ struct GPUTexture *dummy_coba_tex;
} e_data = {NULL};
extern char datatoc_workbench_volume_vert_glsl[];
@@ -47,21 +51,39 @@ void workbench_volume_engine_init(void)
e_data.volume_sh = DRW_shader_create(
datatoc_workbench_volume_vert_glsl, NULL,
datatoc_workbench_volume_frag_glsl, NULL);
+ e_data.volume_coba_sh = DRW_shader_create(
+ datatoc_workbench_volume_vert_glsl, NULL,
+ datatoc_workbench_volume_frag_glsl,
+ "#define USE_COBA\n");
e_data.volume_slice_sh = DRW_shader_create(
datatoc_workbench_volume_vert_glsl, NULL,
- datatoc_workbench_volume_frag_glsl, "#define VOLUME_SLICE");
+ datatoc_workbench_volume_frag_glsl,
+ "#define VOLUME_SLICE\n");
+ e_data.volume_slice_coba_sh = DRW_shader_create(
+ datatoc_workbench_volume_vert_glsl, NULL,
+ datatoc_workbench_volume_frag_glsl,
+ "#define VOLUME_SLICE\n"
+ "#define USE_COBA\n");
+
+ float pixel[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ e_data.dummy_tex = GPU_texture_create_3D(1, 1, 1, GPU_RGBA8, pixel, NULL);
+ e_data.dummy_coba_tex = GPU_texture_create_1D(1, GPU_RGBA8, pixel, NULL);
}
}
void workbench_volume_engine_free(void)
{
DRW_SHADER_FREE_SAFE(e_data.volume_sh);
+ DRW_SHADER_FREE_SAFE(e_data.volume_coba_sh);
DRW_SHADER_FREE_SAFE(e_data.volume_slice_sh);
+ DRW_SHADER_FREE_SAFE(e_data.volume_slice_coba_sh);
+ DRW_TEXTURE_FREE_SAFE(e_data.dummy_tex);
+ DRW_TEXTURE_FREE_SAFE(e_data.dummy_coba_tex);
}
void workbench_volume_cache_init(WORKBENCH_Data *vedata)
{
- vedata->psl->volume_pass = DRW_pass_create("Volumes", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_PREMUL | DRW_STATE_CULL_FRONT);
+ vedata->psl->volume_pass = DRW_pass_create("Volumes", DRW_STATE_WRITE_COLOR | DRW_STATE_TRANSMISSION | DRW_STATE_CULL_FRONT);
}
void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Object *ob, ModifierData *md)
@@ -70,6 +92,7 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec
SmokeDomainSettings *sds = smd->domain;
WORKBENCH_PrivateData *wpd = vedata->stl->g_data;
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+ DRWShadingGroup *grp = NULL;
/* Don't show smoke before simulation starts, this could be made an option in the future. */
if (!sds->fluid || CFRA < sds->point_cache[0]->startframe) {
@@ -77,21 +100,26 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec
}
wpd->volumes_do = true;
-
- if (!sds->wt || !(sds->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) {
+ if (sds->use_coba) {
+ GPU_create_smoke_coba_field(smd);
+ }
+ else if (!sds->wt || !(sds->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) {
GPU_create_smoke(smd, 0);
}
else if (sds->wt && (sds->viewsettings & MOD_SMOKE_VIEW_SHOWBIG)) {
GPU_create_smoke(smd, 1);
}
- if (sds->tex == NULL) {
+ if ((!sds->use_coba && sds->tex == NULL) ||
+ (sds->use_coba && sds->tex_field == NULL))
+ {
return;
}
- if (sds->slice_method == MOD_SMOKE_SLICE_AXIS_ALIGNED &&
- sds->axis_slice_method == AXIS_SLICE_SINGLE)
- {
+ const bool use_slice = (sds->slice_method == MOD_SMOKE_SLICE_AXIS_ALIGNED &&
+ sds->axis_slice_method == AXIS_SLICE_SINGLE);
+
+ if (use_slice) {
float invviewmat[4][4];
DRW_viewport_matrix_get(invviewmat, DRW_MAT_VIEWINV);
@@ -99,41 +127,46 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, Scene *scene, Objec
? axis_dominant_v3_single(invviewmat[2])
: sds->slice_axis - 1;
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.volume_slice_sh, vedata->psl->volume_pass);
- DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex);
- DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
- DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness);
+ GPUShader *sh = (sds->use_coba) ? e_data.volume_slice_coba_sh : e_data.volume_slice_sh;
+ grp = DRW_shgroup_create(sh, vedata->psl->volume_pass);
DRW_shgroup_uniform_float_copy(grp, "slicePosition", sds->slice_depth);
DRW_shgroup_uniform_int_copy(grp, "sliceAxis", axis);
- DRW_shgroup_state_disable(grp, DRW_STATE_CULL_FRONT);
- BLI_addtail(&wpd->smoke_domains, BLI_genericNodeN(smd));
-
- /* TODO Flame rendering */
- /* TODO COBA Rendering */
-
- DRW_shgroup_call_object_add(grp, DRW_cache_quad_get(), ob);
}
else {
int max_slices = max_iii(sds->res[0], sds->res[1], sds->res[2]) * sds->slice_per_voxel;
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.volume_sh, vedata->psl->volume_pass);
+ GPUShader *sh = (sds->use_coba) ? e_data.volume_coba_sh : e_data.volume_sh;
+ grp = DRW_shgroup_create(sh, vedata->psl->volume_pass);
DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)wpd->viewvecs, 3);
- DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
- DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex);
- DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness);
DRW_shgroup_uniform_int_copy(grp, "samplesLen", max_slices);
/* TODO FIXME : This step size is in object space but the ray itself
* is NOT unit length in object space so the required number of subdivisions
* is tricky to get. */
DRW_shgroup_uniform_float_copy(grp, "stepLength", 8.0f / max_slices);
- DRW_shgroup_state_enable(grp, DRW_STATE_CULL_FRONT);
- BLI_addtail(&wpd->smoke_domains, BLI_genericNodeN(smd));
+ }
- /* TODO Flame rendering */
- /* TODO COBA Rendering */
+ if (sds->use_coba) {
+ DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex_field);
+ DRW_shgroup_uniform_texture(grp, "transferTexture", sds->tex_coba);
+ }
+ else {
+ DRW_shgroup_uniform_texture(grp, "densityTexture", sds->tex);
+ DRW_shgroup_uniform_texture(grp, "shadowTexture", sds->tex_shadow);
+ DRW_shgroup_uniform_texture(grp, "flameTexture", (sds->tex_flame) ? sds->tex_flame : e_data.dummy_tex);
+ DRW_shgroup_uniform_texture(grp, "flameColorTexture", (sds->tex_flame) ? sds->tex_flame_coba : e_data.dummy_coba_tex);
+ }
+ DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
+ DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness);
+ DRW_shgroup_state_disable(grp, DRW_STATE_CULL_FRONT);
+ if (use_slice) {
+ DRW_shgroup_call_object_add(grp, DRW_cache_quad_get(), ob);
+ }
+ else {
DRW_shgroup_call_object_add(grp, DRW_cache_cube_get(), ob);
}
+
+ BLI_addtail(&wpd->smoke_domains, BLI_genericNodeN(smd));
}
void workbench_volume_smoke_textures_free(WORKBENCH_PrivateData *wpd)
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 193c2416215..17304dde802 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -325,6 +325,7 @@ struct GPUVertFormat *DRW_shgroup_instance_format_array(const DRWInstanceAttribF
} while (0)
DRWShadingGroup *DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass);
+DRWShadingGroup *DRW_shgroup_create_sub(DRWShadingGroup *shgroup);
DRWShadingGroup *DRW_shgroup_material_create(struct GPUMaterial *material, DRWPass *pass);
DRWShadingGroup *DRW_shgroup_material_instance_create(
struct GPUMaterial *material, DRWPass *pass, struct GPUBatch *geom, struct Object *ob,
@@ -363,11 +364,12 @@ void DRW_shgroup_call_procedural_points_add(DRWShadingGroup *shgroup, uint point
void DRW_shgroup_call_procedural_lines_add(DRWShadingGroup *shgroup, uint line_count, float (*obmat)[4]);
void DRW_shgroup_call_procedural_triangles_add(DRWShadingGroup *shgroup, uint tria_count, float (*obmat)[4]);
void DRW_shgroup_call_object_procedural_triangles_culled_add(DRWShadingGroup *shgroup, uint tria_count, struct Object *ob);
-void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob, bool bypass_culling);
-#define DRW_shgroup_call_object_add(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, false)
-#define DRW_shgroup_call_object_add_no_cull(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, true)
+void DRW_shgroup_call_object_add_ex(
+ DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob, struct Material *ma, bool bypass_culling);
+#define DRW_shgroup_call_object_add(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, NULL, false)
+#define DRW_shgroup_call_object_add_no_cull(shgroup, geom, ob) DRW_shgroup_call_object_add_ex(shgroup, geom, ob, NULL, true)
void DRW_shgroup_call_object_add_with_callback(
- DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob,
+ DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob, struct Material *ma,
DRWCallVisibilityFn *callback, void *user_data);
/* Used for drawing a batch with instancing without instance attribs. */
void DRW_shgroup_call_instances_add(
@@ -507,11 +509,11 @@ DrawData *DRW_drawdata_ensure(
DrawDataFreeCb free_cb);
/* Settings */
-bool DRW_object_is_renderable(struct Object *ob);
-bool DRW_check_object_visible_within_active_context(struct Object *ob);
+bool DRW_object_is_renderable(const struct Object *ob);
+bool DRW_object_is_visible_in_active_context(const struct Object *ob);
bool DRW_object_is_flat_normal(const struct Object *ob);
-bool DRW_check_psys_visible_within_active_context(struct Object *object, struct ParticleSystem *psys);
+bool DRW_object_is_visible_psys_in_active_context(const struct Object *object, const struct ParticleSystem *psys);
/* Draw commands */
void DRW_draw_pass(DRWPass *pass);
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index 9f0306f32a3..20ead73e0f5 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -2986,7 +2986,8 @@ GPUBatch *DRW_cache_mesh_surface_overlay_get(Object *ob)
void DRW_cache_mesh_wire_overlay_get(
Object *ob,
- GPUBatch **r_tris, GPUBatch **r_ledges, GPUBatch **r_lverts)
+ GPUBatch **r_tris, GPUBatch **r_ledges, GPUBatch **r_lverts,
+ struct GPUTexture **r_data_tex)
{
BLI_assert(ob->type == OB_MESH);
@@ -2995,6 +2996,7 @@ void DRW_cache_mesh_wire_overlay_get(
*r_tris = DRW_mesh_batch_cache_get_overlay_triangles(me);
*r_ledges = DRW_mesh_batch_cache_get_overlay_loose_edges(me);
*r_lverts = DRW_mesh_batch_cache_get_overlay_loose_verts(me);
+ *r_data_tex = DRW_mesh_batch_cache_get_overlay_data_tex(me);
}
void DRW_cache_mesh_normals_overlay_get(
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 5999dc25338..4860b438bb1 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -128,7 +128,8 @@ struct GPUBatch *DRW_cache_bone_dof_lines_get(void);
struct GPUBatch *DRW_cache_mesh_surface_overlay_get(struct Object *ob);
void DRW_cache_mesh_wire_overlay_get(
struct Object *ob,
- struct GPUBatch **r_tris, struct GPUBatch **r_ledges, struct GPUBatch **r_lverts);
+ struct GPUBatch **r_tris, struct GPUBatch **r_ledges, struct GPUBatch **r_lverts,
+ struct GPUTexture **r_data_tex);
void DRW_cache_mesh_normals_overlay_get(
struct Object *ob,
struct GPUBatch **r_tris, struct GPUBatch **r_ledges, struct GPUBatch **r_lverts);
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index 1aaedd39c85..575670319d8 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -143,10 +143,12 @@ struct GPUBatch *DRW_mesh_batch_cache_get_fancy_edges(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_edge_detection(struct Mesh *me, bool *r_is_manifold);
struct GPUBatch *DRW_mesh_batch_cache_get_overlay_triangles(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_overlay_triangles_nor(struct Mesh *me);
+struct GPUBatch *DRW_mesh_batch_cache_get_overlay_verts(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_overlay_loose_edges(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_overlay_loose_edges_nor(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_overlay_loose_verts(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_overlay_facedots(struct Mesh *me);
+struct GPUTexture *DRW_mesh_batch_cache_get_overlay_data_tex(struct Mesh *me);
/* edit-mesh selection (use generic function for faces) */
struct GPUBatch *DRW_mesh_batch_cache_get_facedots_with_select_id(struct Mesh *me, uint select_id_offset);
struct GPUBatch *DRW_mesh_batch_cache_get_edges_with_select_id(struct Mesh *me, uint select_id_offset);
@@ -178,9 +180,10 @@ void DRW_mesh_cache_uvedit(
enum {
VFLAG_VERTEX_ACTIVE = 1 << 0,
VFLAG_VERTEX_SELECTED = 1 << 1,
- VFLAG_FACE_ACTIVE = 1 << 2,
- VFLAG_FACE_SELECTED = 1 << 3,
- VFLAG_FACE_FREESTYLE = 1 << 4,
+ VFLAG_VERTEX_EXISTS = 1 << 2,
+ VFLAG_FACE_ACTIVE = 1 << 3,
+ VFLAG_FACE_SELECTED = 1 << 4,
+ VFLAG_FACE_FREESTYLE = 1 << 5,
/* Beware to not go over 1 << 7 (it's a byte flag)
* (see gpu_shader_edit_mesh_overlay_geom.glsl) */
};
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index b2ec0632db2..6013c8eef91 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -48,10 +48,13 @@
#include "BKE_customdata.h"
#include "BKE_deform.h"
#include "BKE_editmesh.h"
+#include "BKE_editmesh_cache.h"
#include "BKE_editmesh_tangent.h"
#include "BKE_mesh.h"
#include "BKE_mesh_tangent.h"
+#include "BKE_mesh_runtime.h"
#include "BKE_colorband.h"
+#include "BKE_cdderivedmesh.h"
#include "bmesh.h"
@@ -142,13 +145,40 @@ typedef struct MeshRenderData {
int loose_vert_len;
int loose_edge_len;
+ /* Support for mapped mesh data. */
+ struct {
+ /* Must be set if we want to get mapped data. */
+ bool use;
+ bool supported;
+
+ Mesh *me_cage;
+
+ int vert_len;
+ int edge_len;
+ int tri_len;
+ int loop_len;
+ int poly_len;
+
+ int *loose_verts;
+ int loose_vert_len;
+
+ int *loose_edges;
+ int loose_edge_len;
+
+ /* origindex layers */
+ int *v_origindex;
+ int *e_origindex;
+ int *l_origindex;
+ int *p_origindex;
+ } mapped;
+
BMEditMesh *edit_bmesh;
struct EditMeshData *edit_data;
MVert *mvert;
- MEdge *medge;
- MLoop *mloop;
- MPoly *mpoly;
+ const MEdge *medge;
+ const MLoop *mloop;
+ const MPoly *mpoly;
float (*orco)[3]; /* vertex coordinates normalized to bounding box */
bool is_orco_allocated;
MDeformVert *dvert;
@@ -180,6 +210,10 @@ typedef struct MeshRenderData {
int bweight;
int *uv;
int *vcol;
+#ifdef WITH_FREESTYLE
+ int freestyle_edge;
+ int freestyle_face;
+#endif
} offset;
struct {
@@ -409,6 +443,36 @@ static MeshRenderData *mesh_render_data_create_ex(
rdata->edit_bmesh = embm;
rdata->edit_data = me->runtime.edit_data;
+ if (embm->mesh_eval_cage && (embm->mesh_eval_cage->runtime.is_original == false)) {
+ Mesh *me_cage = embm->mesh_eval_cage;
+
+ rdata->mapped.me_cage = me_cage;
+ if (types & MR_DATATYPE_VERT) {
+ rdata->mapped.vert_len = me_cage->totvert;
+ }
+ if (types & MR_DATATYPE_EDGE) {
+ rdata->mapped.edge_len = me_cage->totedge;
+ }
+ if (types & MR_DATATYPE_LOOP) {
+ rdata->mapped.loop_len = me_cage->totloop;
+ }
+ if (types & MR_DATATYPE_POLY) {
+ rdata->mapped.poly_len = me_cage->totpoly;
+ }
+ if (types & MR_DATATYPE_LOOPTRI) {
+ rdata->mapped.tri_len = poly_to_tri_count(me_cage->totpoly, me_cage->totloop);
+ }
+
+ rdata->mapped.v_origindex = CustomData_get_layer(&me_cage->vdata, CD_ORIGINDEX);
+ rdata->mapped.e_origindex = CustomData_get_layer(&me_cage->edata, CD_ORIGINDEX);
+ rdata->mapped.l_origindex = CustomData_get_layer(&me_cage->ldata, CD_ORIGINDEX);
+ rdata->mapped.p_origindex = CustomData_get_layer(&me_cage->pdata, CD_ORIGINDEX);
+ rdata->mapped.supported = (
+ rdata->mapped.v_origindex &&
+ rdata->mapped.e_origindex &&
+ rdata->mapped.p_origindex);
+ }
+
int bm_ensure_types = 0;
if (types & MR_DATATYPE_VERT) {
rdata->vert_len = bm->totvert;
@@ -419,17 +483,7 @@ static MeshRenderData *mesh_render_data_create_ex(
bm_ensure_types |= BM_EDGE;
}
if (types & MR_DATATYPE_LOOPTRI) {
- BKE_editmesh_tessface_calc(embm);
- int tottri = embm->tottri;
- rdata->mlooptri = MEM_mallocN(sizeof(*rdata->mlooptri) * embm->tottri, __func__);
- for (int index = 0; index < tottri ; index ++ ) {
- BMLoop **bmtri = embm->looptris[index];
- MLoopTri *mtri = &rdata->mlooptri[index];
- mtri->tri[0] = BM_elem_index_get(bmtri[0]);
- mtri->tri[1] = BM_elem_index_get(bmtri[1]);
- mtri->tri[2] = BM_elem_index_get(bmtri[2]);
- }
- rdata->tri_len = tottri;
+ bm_ensure_types |= BM_LOOP;
}
if (types & MR_DATATYPE_LOOP) {
int totloop = bm->totloop;
@@ -453,6 +507,11 @@ static MeshRenderData *mesh_render_data_create_ex(
rdata->eve_act = BM_mesh_active_vert_get(bm);
rdata->cd.offset.crease = CustomData_get_offset(&bm->edata, CD_CREASE);
rdata->cd.offset.bweight = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
+
+#ifdef WITH_FREESTYLE
+ rdata->cd.offset.freestyle_edge = CustomData_get_offset(&bm->edata, CD_FREESTYLE_EDGE);
+ rdata->cd.offset.freestyle_face = CustomData_get_offset(&bm->pdata, CD_FREESTYLE_FACE);
+#endif
}
if (types & (MR_DATATYPE_DVERT)) {
bm_ensure_types |= BM_VERT;
@@ -463,13 +522,28 @@ static MeshRenderData *mesh_render_data_create_ex(
BM_mesh_elem_index_ensure(bm, bm_ensure_types);
BM_mesh_elem_table_ensure(bm, bm_ensure_types & ~BM_LOOP);
+
+ if (types & MR_DATATYPE_LOOPTRI) {
+ /* Edit mode ensures this is valid, no need to calculate. */
+ BLI_assert((bm->totloop == 0) || (embm->looptris != NULL));
+ int tottri = embm->tottri;
+ MLoopTri *mlooptri = MEM_mallocN(sizeof(*rdata->mlooptri) * embm->tottri, __func__);
+ for (int index = 0; index < tottri ; index ++ ) {
+ BMLoop **bmtri = embm->looptris[index];
+ MLoopTri *mtri = &mlooptri[index];
+ mtri->tri[0] = BM_elem_index_get(bmtri[0]);
+ mtri->tri[1] = BM_elem_index_get(bmtri[1]);
+ mtri->tri[2] = BM_elem_index_get(bmtri[2]);
+ }
+ rdata->mlooptri = mlooptri;
+ rdata->tri_len = tottri;
+ }
+
if (types & MR_DATATYPE_OVERLAY) {
rdata->loose_vert_len = rdata->loose_edge_len = 0;
- int *lverts = rdata->loose_verts = MEM_mallocN(rdata->vert_len * sizeof(int), "Loose Vert");
- int *ledges = rdata->loose_edges = MEM_mallocN(rdata->edge_len * sizeof(int), "Loose Edges");
-
{
+ int *lverts = MEM_mallocN(rdata->vert_len * sizeof(int), __func__);
BLI_assert((bm->elem_table_dirty & BM_VERT) == 0);
BMVert **vtable = bm->vtable;
for (int i = 0; i < bm->totvert; i++) {
@@ -481,9 +555,11 @@ static MeshRenderData *mesh_render_data_create_ex(
}
}
}
+ rdata->loose_verts = MEM_reallocN(lverts, rdata->loose_vert_len * sizeof(int));
}
{
+ int *ledges = MEM_mallocN(rdata->edge_len * sizeof(int), __func__);
BLI_assert((bm->elem_table_dirty & BM_EDGE) == 0);
BMEdge **etable = bm->etable;
for (int i = 0; i < bm->totedge; i++) {
@@ -495,10 +571,49 @@ static MeshRenderData *mesh_render_data_create_ex(
}
}
}
+ rdata->loose_edges = MEM_reallocN(ledges, rdata->loose_edge_len * sizeof(int));
}
- rdata->loose_verts = MEM_reallocN(rdata->loose_verts, rdata->loose_vert_len * sizeof(int));
- rdata->loose_edges = MEM_reallocN(rdata->loose_edges, rdata->loose_edge_len * sizeof(int));
+ if (rdata->mapped.supported) {
+ Mesh *me_cage = embm->mesh_eval_cage;
+ rdata->mapped.loose_vert_len = rdata->mapped.loose_edge_len = 0;
+
+ if (rdata->loose_vert_len) {
+ int *lverts = MEM_mallocN(me_cage->totvert * sizeof(int), __func__);
+ const int *v_origindex = rdata->mapped.v_origindex;
+ for (int i = 0; i < me_cage->totvert; i++) {
+ const int v_orig = v_origindex[i];
+ if (v_orig != ORIGINDEX_NONE) {
+ BMVert *eve = BM_vert_at_index(bm, v_orig);
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ /* Loose vert */
+ if (eve->e == NULL || !bm_vert_has_visible_edge(eve)) {
+ lverts[rdata->mapped.loose_vert_len++] = i;
+ }
+ }
+ }
+ }
+ rdata->mapped.loose_verts = MEM_reallocN(lverts, rdata->mapped.loose_vert_len * sizeof(int));
+ }
+
+ if (rdata->loose_edge_len) {
+ int *ledges = MEM_mallocN(me_cage->totedge * sizeof(int), __func__);
+ const int *e_origindex = rdata->mapped.e_origindex;
+ for (int i = 0; i < me_cage->totedge; i++) {
+ const int e_orig = e_origindex[i];
+ if (e_orig != ORIGINDEX_NONE) {
+ BMEdge *eed = BM_edge_at_index(bm, e_orig);
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ /* Loose edge */
+ if (eed->l == NULL || !bm_edge_has_visible_face(eed)) {
+ ledges[rdata->mapped.loose_edge_len++] = i;
+ }
+ }
+ }
+ }
+ rdata->mapped.loose_edges = MEM_reallocN(ledges, rdata->mapped.loose_edge_len * sizeof(int));
+ }
+ }
}
}
else {
@@ -512,8 +627,9 @@ static MeshRenderData *mesh_render_data_create_ex(
}
if (types & MR_DATATYPE_LOOPTRI) {
const int tri_len = rdata->tri_len = poly_to_tri_count(me->totpoly, me->totloop);
- rdata->mlooptri = MEM_mallocN(sizeof(*rdata->mlooptri) * tri_len, __func__);
- BKE_mesh_recalc_looptri(me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, rdata->mlooptri);
+ MLoopTri *mlooptri = MEM_mallocN(sizeof(*mlooptri) * tri_len, __func__);
+ BKE_mesh_recalc_looptri(me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, mlooptri);
+ rdata->mlooptri = mlooptri;
}
if (types & MR_DATATYPE_LOOP) {
rdata->loop_len = me->totloop;
@@ -856,6 +972,9 @@ static void mesh_render_data_free(MeshRenderData *rdata)
MEM_SAFE_FREE(rdata->edge_select_bool);
MEM_SAFE_FREE(rdata->vert_color);
+ MEM_SAFE_FREE(rdata->mapped.loose_verts);
+ MEM_SAFE_FREE(rdata->mapped.loose_edges);
+
CustomData_free(&rdata->cd.output.ldata, rdata->loop_len);
MEM_freeN(rdata);
@@ -909,30 +1028,55 @@ static int mesh_render_data_verts_len_get(const MeshRenderData *rdata)
BLI_assert(rdata->types & MR_DATATYPE_VERT);
return rdata->vert_len;
}
+static int mesh_render_data_verts_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_VERT);
+ return ((rdata->mapped.use == false) ? rdata->vert_len : rdata->mapped.vert_len);
+}
-static int mesh_render_data_loose_verts_len_get(const MeshRenderData *rdata)
+static int UNUSED_FUNCTION(mesh_render_data_loose_verts_len_get)(const MeshRenderData *rdata)
{
BLI_assert(rdata->types & MR_DATATYPE_OVERLAY);
return rdata->loose_vert_len;
}
+static int mesh_render_data_loose_verts_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_OVERLAY);
+ return ((rdata->mapped.use == false) ? rdata->loose_vert_len : rdata->mapped.loose_vert_len);
+}
static int mesh_render_data_edges_len_get(const MeshRenderData *rdata)
{
BLI_assert(rdata->types & MR_DATATYPE_EDGE);
return rdata->edge_len;
}
+static int mesh_render_data_edges_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_EDGE);
+ return ((rdata->mapped.use == false) ? rdata->edge_len : rdata->mapped.edge_len);
+}
-static int mesh_render_data_loose_edges_len_get(const MeshRenderData *rdata)
+static int UNUSED_FUNCTION(mesh_render_data_loose_edges_len_get)(const MeshRenderData *rdata)
{
BLI_assert(rdata->types & MR_DATATYPE_OVERLAY);
return rdata->loose_edge_len;
}
+static int mesh_render_data_loose_edges_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_OVERLAY);
+ return ((rdata->mapped.use == false) ? rdata->loose_edge_len : rdata->mapped.loose_edge_len);
+}
static int mesh_render_data_looptri_len_get(const MeshRenderData *rdata)
{
BLI_assert(rdata->types & MR_DATATYPE_LOOPTRI);
return rdata->tri_len;
}
+static int mesh_render_data_looptri_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_LOOPTRI);
+ return ((rdata->mapped.use == false) ? rdata->tri_len : rdata->mapped.tri_len);
+}
static int mesh_render_data_mat_len_get(const MeshRenderData *rdata)
{
@@ -951,6 +1095,11 @@ static int mesh_render_data_polys_len_get(const MeshRenderData *rdata)
BLI_assert(rdata->types & MR_DATATYPE_POLY);
return rdata->poly_len;
}
+static int mesh_render_data_polys_len_get_maybe_mapped(const MeshRenderData *rdata)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_POLY);
+ return ((rdata->mapped.use == false) ? rdata->poly_len : rdata->mapped.poly_len);
+}
/** \} */
@@ -972,8 +1121,17 @@ static void mesh_render_data_ensure_poly_normals_pack(MeshRenderData *rdata)
int i;
pnors_pack = rdata->poly_normals_pack = MEM_mallocN(sizeof(*pnors_pack) * rdata->poly_len, __func__);
- BM_ITER_MESH_INDEX(efa, &fiter, bm, BM_FACES_OF_MESH, i) {
- pnors_pack[i] = GPU_normal_convert_i10_v3(efa->no);
+ if (rdata->edit_data && rdata->edit_data->vertexCos != NULL) {
+ BKE_editmesh_cache_ensure_poly_normals(rdata->edit_bmesh, rdata->edit_data);
+ const float (*pnors)[3] = rdata->edit_data->polyNos;
+ for (i = 0; i < bm->totface; i++) {
+ pnors_pack[i] = GPU_normal_convert_i10_v3(pnors[i]);
+ }
+ }
+ else {
+ BM_ITER_MESH_INDEX(efa, &fiter, bm, BM_FACES_OF_MESH, i) {
+ pnors_pack[i] = GPU_normal_convert_i10_v3(efa->no);
+ }
}
}
else {
@@ -1177,11 +1335,11 @@ static void mesh_render_data_ensure_edge_select_bool(MeshRenderData *rdata, bool
MEM_callocN(sizeof(*edge_select_bool) * rdata->edge_len, __func__);
for (int i = 0; i < rdata->poly_len; i++) {
- MPoly *poly = &rdata->mpoly[i];
+ const MPoly *poly = &rdata->mpoly[i];
if (poly->flag & ME_FACE_SEL) {
for (int j = 0; j < poly->totloop; j++) {
- MLoop *loop = &rdata->mloop[poly->loopstart + j];
+ const MLoop *loop = &rdata->mloop[poly->loopstart + j];
if (use_wire) {
edge_select_bool[loop->e] = true;
}
@@ -1213,8 +1371,14 @@ static bool mesh_render_data_pnors_pcenter_select_get(
if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
return false;
}
- BM_face_calc_center_mean(efa, r_center);
- copy_v3_v3(r_pnors, efa->no);
+ if (rdata->edit_data && rdata->edit_data->vertexCos) {
+ copy_v3_v3(r_center, rdata->edit_data->polyCos[poly]);
+ copy_v3_v3(r_pnors, rdata->edit_data->polyNos[poly]);
+ }
+ else {
+ BM_face_calc_center_mean(efa, r_center);
+ copy_v3_v3(r_pnors, efa->no);
+ }
*r_selected = (BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0) ? true : false;
}
else {
@@ -1230,6 +1394,40 @@ static bool mesh_render_data_pnors_pcenter_select_get(
return true;
}
+static bool mesh_render_data_pnors_pcenter_select_get_mapped(
+ MeshRenderData *rdata, const int poly,
+ float r_pnors[3], float r_center[3], bool *r_selected)
+{
+ BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_POLY));
+ const int *p_origindex = rdata->mapped.p_origindex;
+ const int p_orig = p_origindex[poly];
+ if (p_orig == ORIGINDEX_NONE) {
+ return false;
+ }
+ BMEditMesh *em = rdata->edit_bmesh;
+ const BMFace *efa = BM_face_at_index(rdata->edit_bmesh->bm, p_orig);
+ if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
+ return false;
+ }
+
+ Mesh *me_cage = em->mesh_eval_cage;
+ const MVert *mvert = me_cage->mvert;
+#if 0
+ const MEdge *medge = me_cage->medge;
+#endif
+ const MLoop *mloop = me_cage->mloop;
+ const MPoly *mpoly = me_cage->mpoly;
+
+ const MPoly *mp = mpoly + poly;
+ const MLoop *ml = mloop + mp->loopstart;
+
+ BKE_mesh_calc_poly_center(mp, ml, mvert, r_center);
+ BKE_mesh_calc_poly_normal(mp, ml, mvert, r_pnors);
+
+ *r_selected = (BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0) ? true : false;
+
+ return true;
+}
static bool mesh_render_data_edge_vcos_manifold_pnors(
MeshRenderData *rdata, const int edge_index,
@@ -1263,7 +1461,7 @@ static bool mesh_render_data_edge_vcos_manifold_pnors(
}
else {
MVert *mvert = rdata->mvert;
- MEdge *medge = rdata->medge;
+ const MEdge *medge = rdata->medge;
EdgeAdjacentPolys *eap = rdata->edges_adjacent_polys;
float (*pnors)[3] = rdata->poly_normals;
@@ -1349,12 +1547,11 @@ static uchar mesh_render_data_looptri_flag(MeshRenderData *rdata, const BMFace *
fflag |= VFLAG_FACE_SELECTED;
#ifdef WITH_FREESTYLE
- BMesh *bm = rdata->edit_bmesh->bm;
- if (CustomData_has_layer(&bm->pdata, CD_FREESTYLE_FACE)) {
- FreestyleFace *ffa = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_FREESTYLE_FACE);
-
- if (ffa->flag & FREESTYLE_FACE_MARK)
+ if (rdata->cd.offset.freestyle_face != -1) {
+ const FreestyleFace *ffa = BM_ELEM_CD_GET_VOID_P(efa, rdata->cd.offset.freestyle_face);
+ if (ffa->flag & FREESTYLE_FACE_MARK) {
fflag |= VFLAG_FACE_FREESTYLE;
+ }
}
#endif
@@ -1379,16 +1576,6 @@ static void mesh_render_data_edge_flag(
if (!BM_elem_flag_test(eed, BM_ELEM_SMOOTH))
eattr->e_flag |= VFLAG_EDGE_SHARP;
-#ifdef WITH_FREESTYLE
- BMesh *bm = rdata->edit_bmesh->bm;
- if (CustomData_has_layer(&bm->edata, CD_FREESTYLE_EDGE)) {
- FreestyleEdge *fed = CustomData_bmesh_get(&bm->edata, eed->head.data, CD_FREESTYLE_EDGE);
-
- if (fed->flag & FREESTYLE_EDGE_MARK)
- eattr->e_flag |= VFLAG_EDGE_FREESTYLE;
- }
-#endif
-
/* Use a byte for value range */
if (rdata->cd.offset.crease != -1) {
float crease = BM_ELEM_CD_GET_FLOAT(eed, rdata->cd.offset.crease);
@@ -1404,11 +1591,20 @@ static void mesh_render_data_edge_flag(
eattr->bweight = (uchar)(bweight * 255.0f);
}
}
+
+#ifdef WITH_FREESTYLE
+ if (rdata->cd.offset.freestyle_edge != -1) {
+ const FreestyleEdge *fed = BM_ELEM_CD_GET_VOID_P(eed, rdata->cd.offset.freestyle_edge);
+ if (fed->flag & FREESTYLE_EDGE_MARK) {
+ eattr->e_flag |= VFLAG_EDGE_FREESTYLE;
+ }
+ }
+#endif
}
static uchar mesh_render_data_vertex_flag(MeshRenderData *rdata, const BMVert *eve)
{
- uchar vflag = 0;
+ uchar vflag = VFLAG_VERTEX_EXISTS;
/* Current vertex */
if (eve == rdata->eve_act)
@@ -1421,13 +1617,20 @@ static uchar mesh_render_data_vertex_flag(MeshRenderData *rdata, const BMVert *e
}
static void add_overlay_tri(
- MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data,
+ MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data, GPUIndexBufBuilder *elb,
const uint pos_id, const uint vnor_id, const uint lnor_id, const uint data_id,
const BMLoop **bm_looptri, const int base_vert_idx)
{
uchar fflag;
uchar vflag;
+ for (int i = 0; i < 3; ++i) {
+ if (!BM_elem_flag_test(bm_looptri[i]->v, BM_ELEM_TAG)) {
+ BM_elem_flag_enable(bm_looptri[i]->v, BM_ELEM_TAG);
+ GPU_indexbuf_add_generic_vert(elb, base_vert_idx + i);
+ }
+ }
+
if (vbo_pos) {
/* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
if (rdata->edit_data && rdata->edit_data->vertexCos) {
@@ -1457,18 +1660,109 @@ static void add_overlay_tri(
if (vbo_data) {
fflag = mesh_render_data_looptri_flag(rdata, bm_looptri[0]->f);
- uint i_prev = 1, i = 2;
- for (uint i_next = 0; i_next < 3; i_next++) {
+ for (uint i = 0; i < 3; i++) {
+ const int i_next = (i + 1) % 3;
+ const int i_prev = (i + 2) % 3;
vflag = mesh_render_data_vertex_flag(rdata, bm_looptri[i]->v);
+ /* Opposite edge to the vertex at 'i'. */
EdgeDrawAttr eattr = {0};
- if (bm_looptri[i_next] == bm_looptri[i_prev]->prev) {
+ const bool is_edge_real = (bm_looptri[i_next] == bm_looptri[i_prev]->prev);
+ if (is_edge_real) {
mesh_render_data_edge_flag(rdata, bm_looptri[i_next]->e, &eattr);
}
eattr.v_flag = fflag | vflag;
GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx + i, &eattr);
+ }
+ }
+}
+static void add_overlay_tri_mapped(
+ MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data, GPUIndexBufBuilder *elb,
+ const uint pos_id, const uint vnor_id, const uint lnor_id, const uint data_id,
+ BMFace *efa, const MLoopTri *mlt, const float poly_normal[3], const int base_vert_idx)
+{
+ BMEditMesh *embm = rdata->edit_bmesh;
+ BMesh *bm = embm->bm;
+ Mesh *me_cage = embm->mesh_eval_cage;
+
+ const MVert *mvert = me_cage->mvert;
+ const MEdge *medge = me_cage->medge;
+ const MLoop *mloop = me_cage->mloop;
+#if 0
+ const MPoly *mpoly = me_cage->mpoly;
+#endif
- i_prev = i;
- i = i_next;
+ const int *v_origindex = rdata->mapped.v_origindex;
+ const int *e_origindex = rdata->mapped.e_origindex;
+#if 0
+ const int *l_origindex = rdata->mapped.l_origindex;
+ const int *p_origindex = rdata->mapped.p_origindex;
+#endif
+
+ uchar fflag;
+ uchar vflag;
+
+ if (elb) {
+ for (int i = 0; i < 3; ++i) {
+ const int v_orig = v_origindex[mloop[mlt->tri[i]].v];
+ if (v_orig == ORIGINDEX_NONE) {
+ continue;
+ }
+ BMVert *v = BM_vert_at_index(bm, v_orig);
+ if (!BM_elem_flag_test(v, BM_ELEM_TAG)) {
+ BM_elem_flag_enable(v, BM_ELEM_TAG);
+ GPU_indexbuf_add_generic_vert(elb, base_vert_idx + i);
+ }
+ }
+ }
+
+ if (vbo_pos) {
+ for (uint i = 0; i < 3; i++) {
+ const float *pos = mvert[mloop[mlt->tri[i]].v].co;
+ GPU_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+ }
+ }
+
+ if (vbo_nor) {
+ /* TODO real loop normal */
+ GPUPackedNormal lnor = GPU_normal_convert_i10_v3(poly_normal);
+ for (uint i = 0; i < 3; i++) {
+ GPUPackedNormal vnor = GPU_normal_convert_i10_s3(mvert[mloop[mlt->tri[i]].v].no);
+ GPU_vertbuf_attr_set(vbo_nor, vnor_id, base_vert_idx + i, &vnor);
+ GPU_vertbuf_attr_set(vbo_nor, lnor_id, base_vert_idx + i, &lnor);
+ }
+ }
+
+ if (vbo_data) {
+ fflag = mesh_render_data_looptri_flag(rdata, efa);
+ for (uint i = 0; i < 3; i++) {
+ const int i_next = (i + 1) % 3;
+ const int i_prev = (i + 2) % 3;
+ const int v_orig = v_origindex[mloop[mlt->tri[i]].v];
+ if (v_orig != ORIGINDEX_NONE) {
+ BMVert *v = BM_vert_at_index(bm, v_orig);
+ vflag = mesh_render_data_vertex_flag(rdata, v);
+ }
+ else {
+ /* Importantly VFLAG_VERTEX_EXISTS is not set. */
+ vflag = 0;
+ }
+ /* Opposite edge to the vertex at 'i'. */
+ EdgeDrawAttr eattr = {0};
+ const int e_idx = mloop[mlt->tri[i_next]].e;
+ const int e_orig = e_origindex[e_idx];
+ if (e_orig != ORIGINDEX_NONE) {
+ const MEdge *ed = &medge[e_idx];
+ const uint tri_edge[2] = {mloop[mlt->tri[i_prev]].v, mloop[mlt->tri[i_next]].v};
+ const bool is_edge_real = (
+ ((ed->v1 == tri_edge[0]) && (ed->v2 == tri_edge[1])) ||
+ ((ed->v1 == tri_edge[1]) && (ed->v2 == tri_edge[0])));
+ if (is_edge_real) {
+ BMEdge *eed = BM_edge_at_index(bm, e_orig);
+ mesh_render_data_edge_flag(rdata, eed, &eattr);
+ }
+ }
+ eattr.v_flag = fflag | vflag;
+ GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx + i, &eattr);
}
}
}
@@ -1488,7 +1782,7 @@ static void add_overlay_loose_edge(
}
}
else {
- for (int i = 0; i < 2; ++i) {
+ for (int i = 0; i < 2; i++) {
const float *pos = (&eed->v1)[i]->co;
GPU_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
}
@@ -1496,7 +1790,7 @@ static void add_overlay_loose_edge(
}
if (vbo_nor) {
- for (int i = 0; i < 2; ++i) {
+ for (int i = 0; i < 2; i++) {
GPUPackedNormal vnor = GPU_normal_convert_i10_v3((&eed->v1)[i]->no);
GPU_vertbuf_attr_set(vbo_nor, vnor_id, base_vert_idx + i, &vnor);
}
@@ -1505,12 +1799,42 @@ static void add_overlay_loose_edge(
if (vbo_data) {
EdgeDrawAttr eattr = {0};
mesh_render_data_edge_flag(rdata, eed, &eattr);
- for (int i = 0; i < 2; ++i) {
+ for (int i = 0; i < 2; i++) {
eattr.v_flag = mesh_render_data_vertex_flag(rdata, (&eed->v1)[i]);
GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx + i, &eattr);
}
}
}
+static void add_overlay_loose_edge_mapped(
+ MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data,
+ const uint pos_id, const uint vnor_id, const uint data_id,
+ BMEdge *eed, const MVert *mvert, const MEdge *ed, const int base_vert_idx)
+{
+ if (vbo_pos) {
+ /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
+ for (int i = 0; i < 2; i++) {
+ const float *pos = mvert[*(&ed->v1 + i)].co;
+ GPU_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+ }
+ }
+
+ if (vbo_nor) {
+ for (int i = 0; i < 2; i++) {
+ GPUPackedNormal vnor = GPU_normal_convert_i10_s3(mvert[*(&ed->v1 + i)].no);
+ GPU_vertbuf_attr_set(vbo_nor, vnor_id, base_vert_idx + i, &vnor);
+ }
+ }
+
+ if (vbo_data) {
+ EdgeDrawAttr eattr = {0};
+ mesh_render_data_edge_flag(rdata, eed, &eattr);
+ for (int i = 0; i < 2; i++) {
+ const int v_orig = rdata->mapped.v_origindex[*(&ed->v1 + i)];
+ eattr.v_flag = (v_orig != ORIGINDEX_NONE) ? mesh_render_data_vertex_flag(rdata, (&eed->v1)[i]) : 0;
+ GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx + i, &eattr);
+ }
+ }
+}
static void add_overlay_loose_vert(
MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data,
@@ -1541,6 +1865,27 @@ static void add_overlay_loose_vert(
GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx, vflag);
}
}
+static void add_overlay_loose_vert_mapped(
+ MeshRenderData *rdata, GPUVertBuf *vbo_pos, GPUVertBuf *vbo_nor, GPUVertBuf *vbo_data,
+ const uint pos_id, const uint vnor_id, const uint data_id,
+ const BMVert *eve, const MVert *mv, const int base_vert_idx)
+{
+ if (vbo_pos) {
+ const float *pos = mv->co;
+ GPU_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx, pos);
+ }
+
+ if (vbo_nor) {
+ GPUPackedNormal vnor = GPU_normal_convert_i10_s3(mv->no);
+ GPU_vertbuf_attr_set(vbo_nor, vnor_id, base_vert_idx, &vnor);
+ }
+
+ if (vbo_data) {
+ uchar vflag[4] = {0, 0, 0, 0};
+ vflag[0] = mesh_render_data_vertex_flag(rdata, eve);
+ GPU_vertbuf_attr_set(vbo_data, data_id, base_vert_idx, vflag);
+ }
+}
/** \} */
@@ -1659,6 +2004,8 @@ typedef struct MeshBatchCache {
GPUVertBuf *ed_tri_pos;
GPUVertBuf *ed_tri_nor; /* LoopNor, VertNor */
GPUVertBuf *ed_tri_data;
+ GPUTexture *ed_tri_data_tx;
+ GPUIndexBuf *ed_tri_verts;
GPUVertBuf *ed_ledge_pos;
GPUVertBuf *ed_ledge_nor; /* VertNor */
@@ -1817,18 +2164,24 @@ static void mesh_batch_cache_discard_shaded_tri(MeshBatchCache *cache)
{
GPU_VERTBUF_DISCARD_SAFE(cache->shaded_triangles_data);
if (cache->shaded_triangles_in_order) {
- for (int i = 0; i < cache->mat_len; ++i) {
+ for (int i = 0; i < cache->mat_len; i++) {
GPU_INDEXBUF_DISCARD_SAFE(cache->shaded_triangles_in_order[i]);
}
}
if (cache->shaded_triangles) {
- for (int i = 0; i < cache->mat_len; ++i) {
+ for (int i = 0; i < cache->mat_len; i++) {
GPU_BATCH_DISCARD_SAFE(cache->shaded_triangles[i]);
}
}
-
+ if (cache->texpaint_triangles) {
+ for (int i = 0; i < cache->mat_len; i++) {
+ /* They use shaded_triangles_in_order */
+ GPU_BATCH_DISCARD_SAFE(cache->texpaint_triangles[i]);
+ }
+ }
MEM_SAFE_FREE(cache->shaded_triangles_in_order);
MEM_SAFE_FREE(cache->shaded_triangles);
+ MEM_SAFE_FREE(cache->texpaint_triangles);
MEM_SAFE_FREE(cache->auto_layer_names);
MEM_SAFE_FREE(cache->auto_layer_is_srgb);
@@ -1882,11 +2235,15 @@ void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode)
GPU_VERTBUF_DISCARD_SAFE(cache->ed_fcenter_pos_with_nor_and_sel); /* Contains select flag */
GPU_VERTBUF_DISCARD_SAFE(cache->ed_edge_pos);
GPU_VERTBUF_DISCARD_SAFE(cache->ed_vert_pos);
+ GPU_INDEXBUF_DISCARD_SAFE(cache->ed_tri_verts);
+ DRW_TEXTURE_FREE_SAFE(cache->ed_tri_data_tx);
GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles);
GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_verts);
GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_edges);
GPU_BATCH_DISCARD_SAFE(cache->overlay_facedots);
+ GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles_nor);
+ GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_edges_nor);
/* Edit mode selection. */
GPU_BATCH_DISCARD_SAFE(cache->facedot_with_select_id);
GPU_BATCH_DISCARD_SAFE(cache->edges_with_select_id);
@@ -1937,13 +2294,13 @@ static void mesh_batch_cache_clear_selective(Mesh *me, GPUVertBuf *vert)
GPU_BATCH_DISCARD_SAFE(cache->points_with_normals);
GPU_BATCH_DISCARD_SAFE(cache->ledges_with_normals);
if (cache->shaded_triangles) {
- for (int i = 0; i < cache->mat_len; ++i) {
+ for (int i = 0; i < cache->mat_len; i++) {
GPU_BATCH_DISCARD_SAFE(cache->shaded_triangles[i]);
}
}
MEM_SAFE_FREE(cache->shaded_triangles);
if (cache->texpaint_triangles) {
- for (int i = 0; i < cache->mat_len; ++i) {
+ for (int i = 0; i < cache->mat_len; i++) {
GPU_BATCH_DISCARD_SAFE(cache->texpaint_triangles[i]);
}
}
@@ -1983,11 +2340,13 @@ static void mesh_batch_cache_clear(Mesh *me)
GPU_VERTBUF_DISCARD_SAFE(cache->ed_lvert_pos);
GPU_VERTBUF_DISCARD_SAFE(cache->ed_lvert_nor);
GPU_VERTBUF_DISCARD_SAFE(cache->ed_lvert_data);
+ GPU_INDEXBUF_DISCARD_SAFE(cache->ed_tri_verts);
GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles);
GPU_BATCH_DISCARD_SAFE(cache->overlay_triangles_nor);
GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_verts);
GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_edges);
GPU_BATCH_DISCARD_SAFE(cache->overlay_loose_edges_nor);
+ DRW_TEXTURE_FREE_SAFE(cache->ed_tri_data_tx);
GPU_BATCH_DISCARD_SAFE(cache->overlay_weight_faces);
GPU_BATCH_DISCARD_SAFE(cache->overlay_weight_verts);
@@ -2023,7 +2382,7 @@ static void mesh_batch_cache_clear(Mesh *me)
mesh_batch_cache_discard_uvedit(cache);
if (cache->texpaint_triangles) {
- for (int i = 0; i < cache->mat_len; ++i) {
+ for (int i = 0; i < cache->mat_len; i++) {
GPU_BATCH_DISCARD_SAFE(cache->texpaint_triangles[i]);
}
}
@@ -2356,7 +2715,7 @@ static GPUVertBuf *mesh_batch_cache_get_tri_pos_and_normals_ex(
attr_id.nor = GPU_vertformat_attr_add(&format, "nor", GPU_COMP_I10, 3, GPU_FETCH_INT_TO_FLOAT_UNIT);
}
- const int tri_len = mesh_render_data_looptri_len_get(rdata);
+ const int tri_len = mesh_render_data_looptri_len_get_maybe_mapped(rdata);
GPUVertBuf *vbo = *r_vbo = GPU_vertbuf_create_with_format(&format);
@@ -2368,103 +2727,170 @@ static GPUVertBuf *mesh_batch_cache_get_tri_pos_and_normals_ex(
GPU_vertbuf_attr_get_raw_data(vbo, attr_id.pos, &pos_step);
GPU_vertbuf_attr_get_raw_data(vbo, attr_id.nor, &nor_step);
- float (*lnors)[3] = rdata->loop_normals;
-
- if (rdata->edit_bmesh) {
- GPUPackedNormal *pnors_pack, *vnors_pack;
+ if (rdata->mapped.use == false) {
+ float (*lnors)[3] = rdata->loop_normals;
+ if (rdata->edit_bmesh) {
+ GPUPackedNormal *pnors_pack, *vnors_pack;
- if (lnors == NULL) {
- mesh_render_data_ensure_poly_normals_pack(rdata);
- mesh_render_data_ensure_vert_normals_pack(rdata);
+ if (lnors == NULL) {
+ mesh_render_data_ensure_poly_normals_pack(rdata);
+ mesh_render_data_ensure_vert_normals_pack(rdata);
- pnors_pack = rdata->poly_normals_pack;
- vnors_pack = rdata->vert_normals_pack;
- }
+ pnors_pack = rdata->poly_normals_pack;
+ vnors_pack = rdata->vert_normals_pack;
+ }
- for (int i = 0; i < tri_len; i++) {
- const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
- const BMFace *bm_face = bm_looptri[0]->f;
+ for (int i = 0; i < tri_len; i++) {
+ const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
+ const BMFace *bm_face = bm_looptri[0]->f;
- /* use_hide always for edit-mode */
- if (BM_elem_flag_test(bm_face, BM_ELEM_HIDDEN)) {
- continue;
- }
+ /* use_hide always for edit-mode */
+ if (BM_elem_flag_test(bm_face, BM_ELEM_HIDDEN)) {
+ continue;
+ }
- if (lnors) {
- for (uint t = 0; t < 3; t++) {
- const float *nor = lnors[BM_elem_index_get(bm_looptri[t])];
- *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+ if (lnors) {
+ for (uint t = 0; t < 3; t++) {
+ const float *nor = lnors[BM_elem_index_get(bm_looptri[t])];
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+ }
}
- }
- else if (BM_elem_flag_test(bm_face, BM_ELEM_SMOOTH)) {
- for (uint t = 0; t < 3; t++) {
- *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = vnors_pack[BM_elem_index_get(bm_looptri[t]->v)];
+ else if (BM_elem_flag_test(bm_face, BM_ELEM_SMOOTH)) {
+ for (uint t = 0; t < 3; t++) {
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = vnors_pack[BM_elem_index_get(bm_looptri[t]->v)];
+ }
}
- }
- else {
- const GPUPackedNormal *snor_pack = &pnors_pack[BM_elem_index_get(bm_face)];
- for (uint t = 0; t < 3; t++) {
- *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *snor_pack;
+ else {
+ const GPUPackedNormal *snor_pack = &pnors_pack[BM_elem_index_get(bm_face)];
+ for (uint t = 0; t < 3; t++) {
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *snor_pack;
+ }
}
- }
- /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
- if (rdata->edit_data && rdata->edit_data->vertexCos) {
- for (uint t = 0; t < 3; t++) {
- int vidx = BM_elem_index_get(bm_looptri[t]->v);
- const float *pos = rdata->edit_data->vertexCos[vidx];
- copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), pos);
+ /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
+ if (rdata->edit_data && rdata->edit_data->vertexCos) {
+ for (uint t = 0; t < 3; t++) {
+ int vidx = BM_elem_index_get(bm_looptri[t]->v);
+ const float *pos = rdata->edit_data->vertexCos[vidx];
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), pos);
+ }
}
- }
- else {
- for (uint t = 0; t < 3; t++) {
- copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), bm_looptri[t]->v->co);
+ else {
+ for (uint t = 0; t < 3; t++) {
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), bm_looptri[t]->v->co);
+ }
}
}
}
- }
- else {
- if (lnors == NULL) {
- /* Use normals from vertex. */
- mesh_render_data_ensure_poly_normals_pack(rdata);
- }
+ else {
+ if (lnors == NULL) {
+ /* Use normals from vertex. */
+ mesh_render_data_ensure_poly_normals_pack(rdata);
+ }
- for (int i = 0; i < tri_len; i++) {
- const MLoopTri *mlt = &rdata->mlooptri[i];
- const MPoly *mp = &rdata->mpoly[mlt->poly];
+ for (int i = 0; i < tri_len; i++) {
+ const MLoopTri *mlt = &rdata->mlooptri[i];
+ const MPoly *mp = &rdata->mpoly[mlt->poly];
- if (use_hide && (mp->flag & ME_HIDE)) {
- continue;
- }
+ if (use_hide && (mp->flag & ME_HIDE)) {
+ continue;
+ }
- const uint vtri[3] = {
- rdata->mloop[mlt->tri[0]].v,
- rdata->mloop[mlt->tri[1]].v,
- rdata->mloop[mlt->tri[2]].v,
- };
+ const uint vtri[3] = {
+ rdata->mloop[mlt->tri[0]].v,
+ rdata->mloop[mlt->tri[1]].v,
+ rdata->mloop[mlt->tri[2]].v,
+ };
- if (lnors) {
- for (uint t = 0; t < 3; t++) {
- const float *nor = lnors[mlt->tri[t]];
- *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+ if (lnors) {
+ for (uint t = 0; t < 3; t++) {
+ const float *nor = lnors[mlt->tri[t]];
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+ }
}
- }
- else if (mp->flag & ME_SMOOTH) {
- for (uint t = 0; t < 3; t++) {
- const MVert *mv = &rdata->mvert[vtri[t]];
- *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_s3(mv->no);
+ else if (mp->flag & ME_SMOOTH) {
+ for (uint t = 0; t < 3; t++) {
+ const MVert *mv = &rdata->mvert[vtri[t]];
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_s3(mv->no);
+ }
}
- }
- else {
- const GPUPackedNormal *pnors_pack = &rdata->poly_normals_pack[mlt->poly];
+ else {
+ const GPUPackedNormal *pnors_pack = &rdata->poly_normals_pack[mlt->poly];
+ for (uint t = 0; t < 3; t++) {
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *pnors_pack;
+ }
+ }
+
for (uint t = 0; t < 3; t++) {
- *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = *pnors_pack;
+ const MVert *mv = &rdata->mvert[vtri[t]];
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mv->co);
}
}
+ }
+ }
+ else {
+ /* Note: mapped doesn't support lnors yet. */
+ BMesh *bm = rdata->edit_bmesh->bm;
+ Mesh *me_cage = rdata->mapped.me_cage;
+
+ /* TODO(campbell): unlike non-mapped modes we don't generate these on demand, just use if they exist.
+ * this seems like a low priority TODO since mapped meshes typically
+ * use the final mesh evaluated mesh for showing faces. */
+ const float (*lnors)[3] = CustomData_get_layer(&me_cage->ldata, CD_NORMAL);
+
+ /* TODO(campbell): this is quite an expensive operation for something
+ * that's not used unless 'normal' display option is enabled. */
+ if (!CustomData_has_layer(&me_cage->pdata, CD_NORMAL)) {
+ /* TODO(campbell): this is quite an expensive operation for something
+ * that's not used unless 'normal' display option is enabled. */
+ BKE_mesh_ensure_normals_for_display(me_cage);
+ }
+ const float (*polynors)[3] = CustomData_get_layer(&me_cage->pdata, CD_NORMAL);
- for (uint t = 0; t < 3; t++) {
- const MVert *mv = &rdata->mvert[vtri[t]];
- copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mv->co);
+ const MVert *mvert = rdata->mapped.me_cage->mvert;
+ const MLoop *mloop = rdata->mapped.me_cage->mloop;
+ const MPoly *mpoly = rdata->mapped.me_cage->mpoly;
+
+ const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(me_cage);
+ for (int i = 0; i < tri_len; i++) {
+ const MLoopTri *mlt = &mlooptri[i];
+ const int p_orig = rdata->mapped.p_origindex[mlt->poly];
+ if (p_orig != ORIGINDEX_NONE) {
+ /* Assume 'use_hide' */
+ BMFace *efa = BM_face_at_index(bm, p_orig);
+ if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
+ const MPoly *mp = &mpoly[mlt->poly];
+ const uint vtri[3] = {
+ mloop[mlt->tri[0]].v,
+ mloop[mlt->tri[1]].v,
+ mloop[mlt->tri[2]].v,
+ };
+
+ if (lnors) {
+ for (uint t = 0; t < 3; t++) {
+ const float *nor = lnors[mlt->tri[t]];
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_v3(nor);
+ }
+ }
+ else if (mp->flag & ME_SMOOTH) {
+ for (uint t = 0; t < 3; t++) {
+ const MVert *mv = &mvert[vtri[t]];
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = GPU_normal_convert_i10_s3(mv->no);
+ }
+ }
+ else {
+ /* we don't have cached 'rdata->poly_normals_pack'. */
+ const GPUPackedNormal pnor = GPU_normal_convert_i10_v3(polynors[mlt->poly]);
+ for (uint t = 0; t < 3; t++) {
+ *((GPUPackedNormal *)GPU_vertbuf_raw_step(&nor_step)) = pnor;
+ }
+ }
+
+ for (uint t = 0; t < 3; t++) {
+ const MVert *mv = &mvert[vtri[t]];
+ copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mv->co);
+ }
+ }
}
}
}
@@ -2507,26 +2933,43 @@ static GPUVertBuf *mesh_batch_cache_get_facedot_pos_with_normals_and_flag(
attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
attr_id.data = GPU_vertformat_attr_add(&format, "norAndFlag", GPU_COMP_I10, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
}
-
- const int vbo_len_capacity = mesh_render_data_polys_len_get(rdata);
+ const int vbo_len_capacity = mesh_render_data_polys_len_get_maybe_mapped(rdata);
int vidx = 0;
GPUVertBuf *vbo = cache->ed_fcenter_pos_with_nor_and_sel = GPU_vertbuf_create_with_format(&format);
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- for (int i = 0; i < vbo_len_capacity; ++i) {
- float pcenter[3], pnor[3];
- bool selected = false;
-
- if (mesh_render_data_pnors_pcenter_select_get(rdata, i, pnor, pcenter, &selected)) {
-
- GPUPackedNormal nor = { .x = 0, .y = 0, .z = -511 };
- nor = GPU_normal_convert_i10_v3(pnor);
- nor.w = selected ? 1 : 0;
- GPU_vertbuf_attr_set(vbo, attr_id.data, vidx, &nor);
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, pcenter);
+ if (rdata->edit_bmesh) {
+ if (rdata->edit_data && rdata->edit_data->vertexCos != NULL) {
+ BKE_editmesh_cache_ensure_poly_normals(rdata->edit_bmesh, rdata->edit_data);
+ BKE_editmesh_cache_ensure_poly_centers(rdata->edit_bmesh, rdata->edit_data);
+ }
+ }
- vidx += 1;
+ if (rdata->mapped.use == false) {
+ for (int i = 0; i < vbo_len_capacity; i++) {
+ float pcenter[3], pnor[3];
+ bool selected = false;
+ if (mesh_render_data_pnors_pcenter_select_get(rdata, i, pnor, pcenter, &selected)) {
+ GPUPackedNormal nor = GPU_normal_convert_i10_v3(pnor);
+ nor.w = selected ? 1 : 0;
+ GPU_vertbuf_attr_set(vbo, attr_id.data, vidx, &nor);
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, pcenter);
+ vidx += 1;
+ }
+ }
+ }
+ else {
+ for (int i = 0; i < vbo_len_capacity; i++) {
+ float pcenter[3], pnor[3];
+ bool selected = false;
+ if (mesh_render_data_pnors_pcenter_select_get_mapped(rdata, i, pnor, pcenter, &selected)) {
+ GPUPackedNormal nor = GPU_normal_convert_i10_v3(pnor);
+ nor.w = selected ? 1 : 0;
+ GPU_vertbuf_attr_set(vbo, attr_id.data, vidx, &nor);
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, pcenter);
+ vidx += 1;
+ }
}
}
const int vbo_len_used = vidx;
@@ -2551,28 +2994,50 @@ static GPUVertBuf *mesh_batch_cache_get_edges_visible(
attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
}
- const int vbo_len_capacity = mesh_render_data_edges_len_get(rdata) * 2;
+ const int vbo_len_capacity = mesh_render_data_edges_len_get_maybe_mapped(rdata) * 2;
int vidx = 0;
GPUVertBuf *vbo = cache->ed_edge_pos = GPU_vertbuf_create_with_format(&format);
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- if (rdata->edit_bmesh) {
- BMesh *bm = rdata->edit_bmesh->bm;
- BMIter iter;
- BMEdge *eed;
- BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
- if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eed->v1->co);
- vidx += 1;
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eed->v2->co);
- vidx += 1;
+ if (rdata->mapped.use == false) {
+ if (rdata->edit_bmesh) {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter iter;
+ BMEdge *eed;
+
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eed->v1->co);
+ vidx += 1;
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eed->v2->co);
+ vidx += 1;
+ }
}
}
+ else {
+ /* not yet done! */
+ BLI_assert(0);
+ }
}
else {
- /* not yet done! */
- BLI_assert(0);
+ BMesh *bm = rdata->edit_bmesh->bm;
+ const MVert *mvert = rdata->mapped.me_cage->mvert;
+ const MEdge *medge = rdata->mapped.me_cage->medge;
+ const int *e_origindex = rdata->mapped.e_origindex;
+ for (int i = 0; i < rdata->mapped.edge_len; i++) {
+ const int e_orig = e_origindex[i];
+ if (e_orig != ORIGINDEX_NONE) {
+ BMEdge *eed = BM_edge_at_index(bm, e_orig);
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ const MEdge *ed = &medge[i];
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mvert[ed->v1].co);
+ vidx += 1;
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mvert[ed->v2].co);
+ vidx += 1;
+ }
+ }
+ }
}
const int vbo_len_used = vidx;
if (vbo_len_used != vbo_len_capacity) {
@@ -2596,29 +3061,47 @@ static GPUVertBuf *mesh_batch_cache_get_verts_visible(
attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
}
- const int vbo_len_capacity = mesh_render_data_verts_len_get(rdata);
+ const int vbo_len_capacity = mesh_render_data_verts_len_get_maybe_mapped(rdata);
uint vidx = 0;
GPUVertBuf *vbo = cache->ed_vert_pos = GPU_vertbuf_create_with_format(&format);
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- if (rdata->edit_bmesh) {
- BMesh *bm = rdata->edit_bmesh->bm;
- BMIter iter;
- BMVert *eve;
+ if (rdata->mapped.use == false) {
+ if (rdata->edit_bmesh) {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter iter;
+ BMVert *eve;
- BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
- if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eve->co);
- vidx += 1;
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, eve->co);
+ vidx += 1;
+ }
+ }
+ }
+ else {
+ for (int i = 0; i < vbo_len_capacity; i++) {
+ const MVert *mv = &rdata->mvert[i];
+ if (!(mv->flag & ME_HIDE)) {
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mv->co);
+ vidx += 1;
+ }
}
}
}
else {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ const MVert *mvert = rdata->mapped.me_cage->mvert;
+ const int *v_origindex = rdata->mapped.v_origindex;
for (int i = 0; i < vbo_len_capacity; i++) {
- const MVert *mv = &rdata->mvert[i];
- if (!(mv->flag & ME_HIDE)) {
- GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mv->co);
- vidx += 1;
+ const int v_orig = v_origindex[i];
+ if (v_orig != ORIGINDEX_NONE) {
+ BMVert *eve = BM_vert_at_index(bm, v_orig);
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ const MVert *mv = &mvert[i];
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, vidx, mv->co);
+ vidx += 1;
+ }
}
}
}
@@ -2694,33 +3177,54 @@ static GPUVertBuf *mesh_create_edges_select_id(
attr_id.col = GPU_vertformat_attr_add(&format, "color", GPU_COMP_I32, 1, GPU_FETCH_INT);
}
- const int vbo_len_capacity = mesh_render_data_edges_len_get(rdata) * 2;
+ const int vbo_len_capacity = mesh_render_data_edges_len_get_maybe_mapped(rdata) * 2;
int vidx = 0;
vbo = GPU_vertbuf_create_with_format(&format);
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- uint select_index = select_id_offset;
- if (rdata->edit_bmesh) {
- BMesh *bm = rdata->edit_bmesh->bm;
- BMIter iter;
- BMEdge *eed;
+ if (rdata->mapped.use == false) {
+ uint select_index = select_id_offset;
+ if (rdata->edit_bmesh) {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter iter;
+ BMEdge *eed;
- BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
- if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
- int select_id;
- GPU_select_index_get(select_index, &select_id);
- GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
- vidx += 1;
- GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
- vidx += 1;
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ int select_id;
+ GPU_select_index_get(select_index, &select_id);
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ }
+ select_index += 1;
}
- select_index += 1;
+ }
+ else {
+ /* not yet done! */
+ BLI_assert(0);
}
}
else {
- /* not yet done! */
- BLI_assert(0);
+ BMesh *bm = rdata->edit_bmesh->bm;
+ const int *e_origindex = rdata->mapped.e_origindex;
+ for (int i = 0; i < rdata->mapped.edge_len; i++) {
+ const int e_orig = e_origindex[i];
+ if (e_orig != ORIGINDEX_NONE) {
+ BMEdge *eed = BM_edge_at_index(bm, e_orig);
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ uint select_index = select_id_offset + e_orig;
+ int select_id;
+ GPU_select_index_get(select_index, &select_id);
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ }
+ }
+ }
}
const int vbo_len_used = vidx;
if (vbo_len_used != vbo_len_capacity) {
@@ -2744,38 +3248,57 @@ static GPUVertBuf *mesh_create_verts_select_id(
attr_id.col = GPU_vertformat_attr_add(&format, "color", GPU_COMP_I32, 1, GPU_FETCH_INT);
}
- const int vbo_len_capacity = mesh_render_data_verts_len_get(rdata);
+ const int vbo_len_capacity = mesh_render_data_verts_len_get_maybe_mapped(rdata);
int vidx = 0;
vbo = GPU_vertbuf_create_with_format(&format);
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- uint select_index = select_id_offset;
- if (rdata->edit_bmesh) {
- BMesh *bm = rdata->edit_bmesh->bm;
- BMIter iter;
- BMVert *eve;
+ if (rdata->mapped.use == false) {
+ uint select_index = select_id_offset;
+ if (rdata->edit_bmesh) {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter iter;
+ BMVert *eve;
- BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
- if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
- int select_id;
- GPU_select_index_get(select_index, &select_id);
- GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
- vidx += 1;
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ int select_id;
+ GPU_select_index_get(select_index, &select_id);
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ }
+ select_index += 1;
+ }
+ }
+ else {
+ for (int i = 0; i < vbo_len_capacity; i++) {
+ const MVert *mv = &rdata->mvert[i];
+ if (!(mv->flag & ME_HIDE)) {
+ int select_id;
+ GPU_select_index_get(select_index, &select_id);
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ }
+ select_index += 1;
}
- select_index += 1;
}
}
else {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ const int *v_origindex = rdata->mapped.v_origindex;
for (int i = 0; i < vbo_len_capacity; i++) {
- const MVert *mv = &rdata->mvert[i];
- if (!(mv->flag & ME_HIDE)) {
- int select_id;
- GPU_select_index_get(select_index, &select_id);
- GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
- vidx += 1;
+ const int v_orig = v_origindex[i];
+ if (v_orig != ORIGINDEX_NONE) {
+ BMVert *eve = BM_vert_at_index(bm, v_orig);
+ if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ uint select_index = select_id_offset + v_orig;
+ int select_id;
+ GPU_select_index_get(select_index, &select_id);
+ GPU_vertbuf_attr_set(vbo, attr_id.col, vidx, &select_id);
+ vidx += 1;
+ }
}
- select_index += 1;
}
}
const int vbo_len_used = vidx;
@@ -2924,7 +3447,7 @@ static GPUVertBuf *mesh_create_tri_select_id(
attr_id.col = GPU_vertformat_attr_add(&format, "color", GPU_COMP_I32, 1, GPU_FETCH_INT);
}
- const int tri_len = mesh_render_data_looptri_len_get(rdata);
+ const int tri_len = mesh_render_data_looptri_len_get_maybe_mapped(rdata);
vbo = GPU_vertbuf_create_with_format(&format);
@@ -2932,29 +3455,52 @@ static GPUVertBuf *mesh_create_tri_select_id(
int vbo_len_used = 0;
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- if (rdata->edit_bmesh) {
- for (int i = 0; i < tri_len; i++) {
- const BMLoop **ltri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
- /* Assume 'use_hide' */
- if (!BM_elem_flag_test(ltri[0]->f, BM_ELEM_HIDDEN)) {
- const int poly_index = BM_elem_index_get(ltri[0]->f);
- int select_id;
- GPU_select_index_get(poly_index + select_id_offset, &select_id);
- for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
- GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id);
+
+ if (rdata->mapped.use == false) {
+ if (rdata->edit_bmesh) {
+ for (int i = 0; i < tri_len; i++) {
+ const BMLoop **ltri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
+ /* Assume 'use_hide' */
+ if (!BM_elem_flag_test(ltri[0]->f, BM_ELEM_HIDDEN)) {
+ const int poly_index = BM_elem_index_get(ltri[0]->f);
+ int select_id;
+ GPU_select_index_get(poly_index + select_id_offset, &select_id);
+ for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
+ GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id);
+ }
+ }
+ }
+ }
+ else {
+ for (int i = 0; i < tri_len; i++) {
+ const MLoopTri *mlt = &rdata->mlooptri[i];
+ const int poly_index = mlt->poly;
+ if (!(use_hide && (rdata->mpoly[poly_index].flag & ME_HIDE))) {
+ int select_id;
+ GPU_select_index_get(poly_index + select_id_offset, &select_id);
+ for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
+ GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id);
+ }
}
}
}
}
else {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ Mesh *me_cage = rdata->mapped.me_cage;
+ const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(me_cage);
for (int i = 0; i < tri_len; i++) {
- const MLoopTri *mlt = &rdata->mlooptri[i];
- const int poly_index = mlt->poly;
- if (!(use_hide && (rdata->mpoly[poly_index].flag & ME_HIDE))) {
- int select_id;
- GPU_select_index_get(poly_index + select_id_offset, &select_id);
- for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
- GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id);
+ const MLoopTri *mlt = &mlooptri[i];
+ const int p_orig = rdata->mapped.p_origindex[mlt->poly];
+ if (p_orig != ORIGINDEX_NONE) {
+ /* Assume 'use_hide' */
+ BMFace *efa = BM_face_at_index(bm, p_orig);
+ if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
+ int select_id;
+ GPU_select_index_get(select_id_offset + p_orig, &select_id);
+ for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
+ GPU_vertbuf_attr_set(vbo, attr_id.col, cidx++, &select_id);
+ }
}
}
}
@@ -2983,28 +3529,42 @@ static GPUVertBuf *mesh_batch_cache_get_vert_pos_and_nor_in_order(
}
GPUVertBuf *vbo = cache->pos_in_order = GPU_vertbuf_create_with_format(&format);
- const int vbo_len_capacity = mesh_render_data_verts_len_get(rdata);
+ const int vbo_len_capacity = mesh_render_data_verts_len_get_maybe_mapped(rdata);
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- if (rdata->edit_bmesh) {
- BMesh *bm = rdata->edit_bmesh->bm;
- BMIter iter;
- BMVert *eve;
- uint i;
+ if (rdata->mapped.use == false) {
+ if (rdata->edit_bmesh) {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter iter;
+ BMVert *eve;
+ uint i;
- BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
- static short no_short[4];
- normal_float_to_short_v3(no_short, eve->no);
+ BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
+ static short no_short[4];
+ normal_float_to_short_v3(no_short, eve->no);
- GPU_vertbuf_attr_set(vbo, attr_id.pos, i, eve->co);
- GPU_vertbuf_attr_set(vbo, attr_id.nor, i, no_short);
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, i, eve->co);
+ GPU_vertbuf_attr_set(vbo, attr_id.nor, i, no_short);
+ }
+ BLI_assert(i == vbo_len_capacity);
+ }
+ else {
+ for (int i = 0; i < vbo_len_capacity; i++) {
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, i, rdata->mvert[i].co);
+ GPU_vertbuf_attr_set(vbo, attr_id.nor, i, rdata->mvert[i].no); /* XXX actually reading 4 shorts */
+ }
}
- BLI_assert(i == vbo_len_capacity);
}
else {
- for (int i = 0; i < vbo_len_capacity; ++i) {
- GPU_vertbuf_attr_set(vbo, attr_id.pos, i, rdata->mvert[i].co);
- GPU_vertbuf_attr_set(vbo, attr_id.nor, i, rdata->mvert[i].no); /* XXX actually reading 4 shorts */
+ const MVert *mvert = rdata->mapped.me_cage->mvert;
+ const int *v_origindex = rdata->mapped.v_origindex;
+ for (int i = 0; i < vbo_len_capacity; i++) {
+ const int v_orig = v_origindex[i];
+ if (v_orig != ORIGINDEX_NONE) {
+ const MVert *mv = &mvert[i];
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, i, mv->co);
+ GPU_vertbuf_attr_set(vbo, attr_id.nor, i, mv->no); /* XXX actually reading 4 shorts */
+ }
}
}
}
@@ -3059,11 +3619,14 @@ static void mesh_batch_cache_create_overlay_tri_buffers(
MeshRenderData *rdata, MeshBatchCache *cache)
{
BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI));
-
- const int tri_len = mesh_render_data_looptri_len_get(rdata);
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter iter;
+ BMVert *ev;
+ const int tri_len = mesh_render_data_looptri_len_get_maybe_mapped(rdata);
const int vbo_len_capacity = tri_len * 3;
int vbo_len_used = 0;
+ int points_len = bm->totvert;
/* Positions */
GPUVertBuf *vbo_pos = NULL;
@@ -3090,18 +3653,59 @@ static void mesh_batch_cache_create_overlay_tri_buffers(
GPU_vertbuf_data_alloc(vbo_data, vbo_len_capacity);
}
- for (int i = 0; i < tri_len; i++) {
- const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
- if (!BM_elem_flag_test(bm_looptri[0]->f, BM_ELEM_HIDDEN)) {
- add_overlay_tri(
- rdata, vbo_pos, vbo_nor, vbo_data,
- attr_id.pos, attr_id.vnor, attr_id.lnor, attr_id.data,
- bm_looptri, vbo_len_used);
+ /* Verts IBO */
+ GPUIndexBufBuilder elb, *elbp = NULL;
+ if (cache->ed_tri_verts == NULL) {
+ elbp = &elb;
+ GPU_indexbuf_init(elbp, GPU_PRIM_POINTS, points_len, vbo_len_capacity);
+ }
- vbo_len_used += 3;
+ /* Clear tag */
+ BM_ITER_MESH(ev, &iter, bm, BM_VERTS_OF_MESH) {
+ BM_elem_flag_disable(ev, BM_ELEM_TAG);
+ }
+
+ if (rdata->mapped.use == false) {
+ for (int i = 0; i < tri_len; i++) {
+ const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
+ if (!BM_elem_flag_test(bm_looptri[0]->f, BM_ELEM_HIDDEN)) {
+ add_overlay_tri(
+ rdata, vbo_pos, vbo_nor, vbo_data, elbp,
+ attr_id.pos, attr_id.vnor, attr_id.lnor, attr_id.data,
+ bm_looptri, vbo_len_used);
+ vbo_len_used += 3;
+ }
+ }
+ }
+ else {
+ Mesh *me_cage = rdata->mapped.me_cage;
+ const MLoopTri *mlooptri = BKE_mesh_runtime_looptri_ensure(me_cage);
+ if (!CustomData_has_layer(&me_cage->pdata, CD_NORMAL)) {
+ /* TODO(campbell): this is quite an expensive operation for something
+ * that's not used unless 'normal' display option is enabled. */
+ BKE_mesh_ensure_normals_for_display(me_cage);
+ }
+ const float (*polynors)[3] = CustomData_get_layer(&me_cage->pdata, CD_NORMAL);
+ for (int i = 0; i < tri_len; i++) {
+ const MLoopTri *mlt = &mlooptri[i];
+ const int p_orig = rdata->mapped.p_origindex[mlt->poly];
+ if (p_orig != ORIGINDEX_NONE) {
+ BMFace *efa = BM_face_at_index(bm, p_orig);
+ if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
+ add_overlay_tri_mapped(
+ rdata, vbo_pos, vbo_nor, vbo_data, elbp,
+ attr_id.pos, attr_id.vnor, attr_id.lnor, attr_id.data,
+ efa, mlt, polynors[mlt->poly], vbo_len_used);
+ vbo_len_used += 3;
+ }
+ }
}
}
+ if (elbp != NULL) {
+ cache->ed_tri_verts = GPU_indexbuf_build(elbp);
+ }
+
/* Finish */
if (vbo_len_used != vbo_len_capacity) {
if (vbo_pos != NULL) {
@@ -3114,6 +3718,10 @@ static void mesh_batch_cache_create_overlay_tri_buffers(
GPU_vertbuf_data_resize(vbo_data, vbo_len_used);
}
}
+
+ /* Upload data early because we need to create the texture for it. */
+ GPU_vertbuf_use(vbo_data);
+ cache->ed_tri_data_tx = GPU_texture_create_from_vertbuf(vbo_data);
}
static void mesh_batch_cache_create_overlay_ledge_buffers(
@@ -3121,7 +3729,7 @@ static void mesh_batch_cache_create_overlay_ledge_buffers(
{
BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI));
- const int ledge_len = mesh_render_data_loose_edges_len_get(rdata);
+ const int ledge_len = mesh_render_data_loose_edges_len_get_maybe_mapped(rdata);
const int vbo_len_capacity = ledge_len * 2;
int vbo_len_used = 0;
@@ -3151,19 +3759,39 @@ static void mesh_batch_cache_create_overlay_ledge_buffers(
GPU_vertbuf_data_alloc(vbo_data, vbo_len_capacity);
}
- if (rdata->edit_bmesh) {
- BMesh *bm = rdata->edit_bmesh->bm;
- for (uint i = 0; i < ledge_len; i++) {
- const BMEdge *eed = BM_edge_at_index(bm, rdata->loose_edges[i]);
- if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
- add_overlay_loose_edge(
- rdata, vbo_pos, vbo_nor, vbo_data,
- attr_id.pos, attr_id.vnor, attr_id.data,
- eed, vbo_len_used);
- vbo_len_used += 2;
+ if (rdata->mapped.use == false) {
+ if (rdata->edit_bmesh) {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ for (uint i = 0; i < ledge_len; i++) {
+ const BMEdge *eed = BM_edge_at_index(bm, rdata->loose_edges[i]);
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+ add_overlay_loose_edge(
+ rdata, vbo_pos, vbo_nor, vbo_data,
+ attr_id.pos, attr_id.vnor, attr_id.data,
+ eed, vbo_len_used);
+ vbo_len_used += 2;
+ }
}
}
}
+ else {
+ BMesh *bm = rdata->edit_bmesh->bm;
+ Mesh *me_cage = rdata->mapped.me_cage;
+ const MVert *mvert = me_cage->mvert;
+ const MEdge *medge = me_cage->medge;
+ const int *e_origindex = rdata->mapped.e_origindex;
+ for (uint i_iter = 0; i_iter < ledge_len; i_iter++) {
+ const int i = rdata->mapped.loose_edges[i_iter];
+ const int e_orig = e_origindex[i];
+ const MEdge *ed = &medge[i];
+ BMEdge *eed = BM_edge_at_index(bm, e_orig);
+ add_overlay_loose_edge_mapped(
+ rdata, vbo_pos, vbo_nor, vbo_data,
+ attr_id.pos, attr_id.vnor, attr_id.data,
+ eed, mvert, ed, vbo_len_used);
+ vbo_len_used += 2;
+ }
+ }
/* Finish */
if (vbo_len_used != vbo_len_capacity) {
@@ -3185,7 +3813,7 @@ static void mesh_batch_cache_create_overlay_lvert_buffers(
BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI));
BMesh *bm = rdata->edit_bmesh->bm;
- const int lvert_len = mesh_render_data_loose_verts_len_get(rdata);
+ const int lvert_len = mesh_render_data_loose_verts_len_get_maybe_mapped(rdata);
const int vbo_len_capacity = lvert_len;
int vbo_len_used = 0;
@@ -3216,13 +3844,31 @@ static void mesh_batch_cache_create_overlay_lvert_buffers(
GPU_vertbuf_data_alloc(vbo_data, vbo_len_capacity);
}
- for (uint i = 0; i < lvert_len; i++) {
- BMVert *eve = BM_vert_at_index(bm, rdata->loose_verts[i]);
- add_overlay_loose_vert(
- rdata, vbo_pos, vbo_nor, vbo_data,
- attr_id.pos, attr_id.vnor, attr_id.data,
- eve, vbo_len_used);
- vbo_len_used += 1;
+ if (rdata->mapped.use == false) {
+ for (uint i = 0; i < lvert_len; i++) {
+ BMVert *eve = BM_vert_at_index(bm, rdata->loose_verts[i]);
+ add_overlay_loose_vert(
+ rdata, vbo_pos, vbo_nor, vbo_data,
+ attr_id.pos, attr_id.vnor, attr_id.data,
+ eve, vbo_len_used);
+ vbo_len_used += 1;
+ }
+ }
+ else {
+ Mesh *me_cage = rdata->mapped.me_cage;
+ const MVert *mvert = me_cage->mvert;
+ const int *v_origindex = rdata->mapped.v_origindex;
+ for (uint i_iter = 0; i_iter < lvert_len; i_iter++) {
+ const int i = rdata->mapped.loose_verts[i_iter];
+ const int v_orig = v_origindex[i];
+ const MVert *mv = &mvert[i];
+ BMVert *eve = BM_vert_at_index(bm, v_orig);
+ add_overlay_loose_vert_mapped(
+ rdata, vbo_pos, vbo_nor, vbo_data,
+ attr_id.pos, attr_id.vnor, attr_id.data,
+ eve, mv, vbo_len_used);
+ vbo_len_used += 1;
+ }
}
/* Finish */
@@ -3258,6 +3904,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_ledge_pos(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_ledge_pos == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_ledge_buffers(rdata, cache);
}
@@ -3270,12 +3919,28 @@ static GPUVertBuf *mesh_batch_cache_get_edit_lvert_pos(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_lvert_pos == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_lvert_buffers(rdata, cache);
}
return cache->ed_lvert_pos;
}
+/* Indices */
+static GPUIndexBuf *mesh_batch_cache_get_edit_tri_indices(
+ MeshRenderData *rdata, MeshBatchCache *cache)
+{
+ BLI_assert(rdata->types & MR_DATATYPE_VERT);
+
+ if (cache->ed_tri_verts == NULL) {
+ mesh_batch_cache_create_overlay_tri_buffers(rdata, cache);
+ }
+
+ return cache->ed_tri_verts;
+}
+
/* Normal */
static GPUVertBuf *mesh_batch_cache_get_edit_tri_nor(
MeshRenderData *rdata, MeshBatchCache *cache)
@@ -3283,6 +3948,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_tri_nor(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_tri_nor == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_tri_buffers(rdata, cache);
}
@@ -3295,6 +3963,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_ledge_nor(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_ledge_nor == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_ledge_buffers(rdata, cache);
}
@@ -3307,6 +3978,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_lvert_nor(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_lvert_nor == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_lvert_buffers(rdata, cache);
}
@@ -3332,6 +4006,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_ledge_data(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_ledge_data == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_ledge_buffers(rdata, cache);
}
@@ -3344,6 +4021,9 @@ static GPUVertBuf *mesh_batch_cache_get_edit_lvert_data(
BLI_assert(rdata->types & MR_DATATYPE_VERT);
if (cache->ed_lvert_data == NULL) {
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
mesh_batch_cache_create_overlay_lvert_buffers(rdata, cache);
}
@@ -3403,7 +4083,7 @@ static GPUIndexBuf *mesh_batch_cache_get_edges_adjacency(MeshRenderData *rdata,
EdgeHash *eh = BLI_edgehash_new_ex(__func__, tri_len * 3);
/* Create edges for each pair of triangles sharing an edge. */
for (int i = 0; i < tri_len; i++) {
- for (int e = 0; e < 3; ++e) {
+ for (int e = 0; e < 3; e++) {
uint v0, v1, v2;
if (rdata->edit_bmesh) {
const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
@@ -3415,8 +4095,8 @@ static GPUIndexBuf *mesh_batch_cache_get_edges_adjacency(MeshRenderData *rdata,
v2 = BM_elem_index_get(bm_looptri[(e + 2) % 3]->v);
}
else {
- MLoop *mloop = rdata->mloop;
- MLoopTri *mlt = rdata->mlooptri + i;
+ const MLoop *mloop = rdata->mloop;
+ const MLoopTri *mlt = rdata->mlooptri + i;
v0 = mloop[mlt->tri[e]].v;
v1 = mloop[mlt->tri[(e + 1) % 3]].v;
v2 = mloop[mlt->tri[(e + 2) % 3]].v;
@@ -3485,7 +4165,7 @@ static EdgeHash *create_looptri_edge_adjacency_hash(MeshRenderData *rdata)
EdgeHash *eh = BLI_edgehash_new_ex(__func__, tri_len * 3);
/* Create edges for each pair of triangles sharing an edge. */
for (int i = 0; i < tri_len; i++) {
- for (int e = 0; e < 3; ++e) {
+ for (int e = 0; e < 3; e++) {
uint v0, v1, v2;
if (rdata->edit_bmesh) {
const BMLoop **bm_looptri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
@@ -3497,8 +4177,8 @@ static EdgeHash *create_looptri_edge_adjacency_hash(MeshRenderData *rdata)
v2 = BM_elem_index_get(bm_looptri[(e + 2) % 3]->v);
}
else {
- MLoop *mloop = rdata->mloop;
- MLoopTri *mlt = rdata->mlooptri + i;
+ const MLoop *mloop = rdata->mloop;
+ const MLoopTri *mlt = rdata->mlooptri + i;
v0 = mloop[mlt->tri[e]].v;
v1 = mloop[mlt->tri[(e + 1) % 3]].v;
v2 = mloop[mlt->tri[(e + 2) % 3]].v;
@@ -3540,25 +4220,23 @@ static GPUVertBuf *mesh_batch_cache_create_edges_overlay_texture_buf(MeshRenderD
eh = create_looptri_edge_adjacency_hash(rdata);
for (int i = 0; i < tri_len; i++) {
- bool edge_is_real[3] = {false, false, false};
+ bool edge_is_real[3];
- MEdge *medge = rdata->medge;
- MLoop *mloop = rdata->mloop;
- MLoopTri *mlt = rdata->mlooptri + i;
+ const MEdge *medge = rdata->medge;
+ const MLoop *mloop = rdata->mloop;
+ const MLoopTri *mlt = rdata->mlooptri + i;
int j, j_next;
for (j = 2, j_next = 0; j_next < 3; j = j_next++) {
- MEdge *ed = &medge[mloop[mlt->tri[j]].e];
- uint tri_edge[2] = {mloop[mlt->tri[j]].v, mloop[mlt->tri[j_next]].v};
-
- if (((ed->v1 == tri_edge[0]) && (ed->v2 == tri_edge[1])) ||
- ((ed->v1 == tri_edge[1]) && (ed->v2 == tri_edge[0])))
- {
- edge_is_real[j] = true;
- }
+ const MEdge *ed = &medge[mloop[mlt->tri[j]].e];
+ const uint tri_edge[2] = {mloop[mlt->tri[j]].v, mloop[mlt->tri[j_next]].v};
+ const bool is_edge_real = (
+ ((ed->v1 == tri_edge[0]) && (ed->v2 == tri_edge[1])) ||
+ ((ed->v1 == tri_edge[1]) && (ed->v2 == tri_edge[0])));
+ edge_is_real[j] = is_edge_real;
}
- for (int e = 0; e < 3; ++e) {
+ for (int e = 0; e < 3; e++) {
int v0 = mloop[mlt->tri[e]].v;
int v1 = mloop[mlt->tri[(e + 1) % 3]].v;
EdgeAdjacentVerts *eav = BLI_edgehash_lookup(eh, v0, v1);
@@ -3569,7 +4247,7 @@ static GPUVertBuf *mesh_batch_cache_create_edges_overlay_texture_buf(MeshRenderD
}
/* Non-manifold edge */
if (eav->vert_index[1] == -1) {
- value |= (1 << 31);
+ value |= (1u << 31);
}
GPU_vertbuf_attr_set(vbo, index_id, vidx++, &value);
}
@@ -3631,7 +4309,7 @@ static GPUIndexBuf *mesh_batch_cache_get_triangles_in_order(MeshRenderData *rdat
GPU_indexbuf_init(&elb, GPU_PRIM_TRIS, tri_len, vert_len);
if (rdata->edit_bmesh) {
- for (int i = 0; i < tri_len; ++i) {
+ for (int i = 0; i < tri_len; i++) {
const BMLoop **ltri = (const BMLoop **)rdata->edit_bmesh->looptris[i];
if (!BM_elem_flag_test(ltri[0]->f, BM_ELEM_HIDDEN)) {
for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
@@ -3641,7 +4319,7 @@ static GPUIndexBuf *mesh_batch_cache_get_triangles_in_order(MeshRenderData *rdat
}
}
else {
- for (int i = 0; i < tri_len; ++i) {
+ for (int i = 0; i < tri_len; i++) {
const MLoopTri *mlt = &rdata->mlooptri[i];
for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
GPU_indexbuf_add_generic_vert(&elb, mlt->tri[tri_corner]);
@@ -3660,31 +4338,42 @@ static GPUIndexBuf *mesh_batch_cache_get_loose_edges(MeshRenderData *rdata, Mesh
BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI));
if (cache->ledges_in_order == NULL) {
- const int vert_len = mesh_render_data_verts_len_get(rdata);
- const int edge_len = mesh_render_data_edges_len_get(rdata);
+ const int vert_len = mesh_render_data_verts_len_get_maybe_mapped(rdata);
+ const int edge_len = mesh_render_data_edges_len_get_maybe_mapped(rdata);
/* Alloc max (edge_len) and upload only needed range. */
GPUIndexBufBuilder elb;
GPU_indexbuf_init(&elb, GPU_PRIM_LINES, edge_len, vert_len);
- if (rdata->edit_bmesh) {
- /* No need to support since edit mesh already draw them.
- * But some engines may want them ... */
- BMesh *bm = rdata->edit_bmesh->bm;
- BMIter eiter;
- BMEdge *eed;
- BM_ITER_MESH(eed, &eiter, bm, BM_EDGES_OF_MESH) {
- if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) && BM_edge_is_wire(eed)) {
- GPU_indexbuf_add_line_verts(&elb, BM_elem_index_get(eed->v1), BM_elem_index_get(eed->v2));
+ if (rdata->mapped.use == false) {
+ if (rdata->edit_bmesh) {
+ /* No need to support since edit mesh already draw them.
+ * But some engines may want them ... */
+ BMesh *bm = rdata->edit_bmesh->bm;
+ BMIter eiter;
+ BMEdge *eed;
+ BM_ITER_MESH(eed, &eiter, bm, BM_EDGES_OF_MESH) {
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) && !bm_edge_has_visible_face(eed)) {
+ GPU_indexbuf_add_line_verts(&elb, BM_elem_index_get(eed->v1), BM_elem_index_get(eed->v2));
+ }
+ }
+ }
+ else {
+ for (int i = 0; i < edge_len; i++) {
+ const MEdge *medge = &rdata->medge[i];
+ if (medge->flag & ME_LOOSEEDGE) {
+ GPU_indexbuf_add_line_verts(&elb, medge->v1, medge->v2);
+ }
}
}
}
else {
- for (int i = 0; i < edge_len; ++i) {
- const MEdge *medge = &rdata->medge[i];
- if (medge->flag & ME_LOOSEEDGE) {
- GPU_indexbuf_add_line_verts(&elb, medge->v1, medge->v2);
- }
+ /* Hidden checks are already done when creating the loose edge list. */
+ Mesh *me_cage = rdata->mapped.me_cage;
+ for (int i_iter = 0; i_iter < rdata->mapped.loose_edge_len; i_iter++) {
+ const int i = rdata->mapped.loose_edges[i_iter];
+ const MEdge *medge = &me_cage->medge[i];
+ GPU_indexbuf_add_line_verts(&elb, medge->v1, medge->v2);
}
}
cache->ledges_in_order = GPU_indexbuf_build(&elb);
@@ -3730,7 +4419,7 @@ static GPUIndexBuf **mesh_batch_cache_get_triangles_in_order_split_by_material(
}
/* Init ELBs. */
- for (int i = 0; i < mat_len; ++i) {
+ for (int i = 0; i < mat_len; i++) {
GPU_indexbuf_init(&elb[i], GPU_PRIM_TRIS, mat_tri_len[i], tri_len * 3);
}
@@ -3763,7 +4452,7 @@ static GPUIndexBuf **mesh_batch_cache_get_triangles_in_order_split_by_material(
}
/* Build ELBs. */
- for (int i = 0; i < mat_len; ++i) {
+ for (int i = 0; i < mat_len; i++) {
cache->shaded_triangles_in_order[i] = GPU_indexbuf_build(&elb[i]);
}
@@ -3846,7 +4535,7 @@ static GPUIndexBuf *mesh_create_tri_overlay_weight_faces(
GPUIndexBufBuilder elb;
GPU_indexbuf_init(&elb, GPU_PRIM_TRIS, tri_len, vert_len);
- for (int i = 0; i < tri_len; ++i) {
+ for (int i = 0; i < tri_len; i++) {
const MLoopTri *mlt = &rdata->mlooptri[i];
if (!(rdata->mpoly[mlt->poly].flag & (ME_FACE_SEL | ME_HIDE))) {
for (uint tri_corner = 0; tri_corner < 3; tri_corner++) {
@@ -3969,6 +4658,9 @@ GPUBatch *DRW_mesh_batch_cache_get_loose_edges_with_normals(Mesh *me)
if (cache->ledges_with_normals == NULL) {
const int datatype = MR_DATATYPE_VERT | MR_DATATYPE_EDGE | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY;
MeshRenderData *rdata = mesh_render_data_create(me, datatype);
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
cache->ledges_with_normals = GPU_batch_create(
GPU_PRIM_LINES, mesh_batch_cache_get_vert_pos_and_nor_in_order(rdata, cache),
@@ -4049,6 +4741,9 @@ struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_select_id(
const int datatype =
MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY;
MeshRenderData *rdata = mesh_render_data_create(me, datatype);
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
cache->triangles_with_select_id = GPU_batch_create_ex(
GPU_PRIM_TRIS, mesh_create_tri_select_id(rdata, use_hide, select_id_offset), NULL, GPU_BATCH_OWNS_VBO);
@@ -4075,6 +4770,9 @@ struct GPUBatch *DRW_mesh_batch_cache_get_triangles_with_select_mask(struct Mesh
const int datatype =
MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | MR_DATATYPE_LOOP | MR_DATATYPE_POLY;
MeshRenderData *rdata = mesh_render_data_create(me, datatype);
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
GPUVertBuf *vbo_tris = use_hide ?
mesh_create_tri_pos_and_normals_visible_only(rdata) :
@@ -4147,7 +4845,7 @@ GPUBatch *DRW_mesh_batch_cache_get_fancy_edges(Mesh *me)
const int vbo_len_capacity = edge_len * 2; /* these are PRIM_LINE verts, not mesh verts */
int vbo_len_used = 0;
GPU_vertbuf_data_alloc(vbo, vbo_len_capacity);
- for (int i = 0; i < edge_len; ++i) {
+ for (int i = 0; i < edge_len; i++) {
float *vcos1, *vcos2;
float *pnor1 = NULL, *pnor2 = NULL;
bool is_manifold;
@@ -4244,6 +4942,10 @@ static void mesh_batch_cache_create_overlay_batches(Mesh *me)
MeshBatchCache *cache = mesh_batch_cache_get(me);
MeshRenderData *rdata = mesh_render_data_create(me, options);
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
+
if (cache->overlay_triangles == NULL) {
cache->overlay_triangles = GPU_batch_create(
GPU_PRIM_TRIS, mesh_batch_cache_get_edit_tri_pos(rdata, cache), NULL);
@@ -4265,16 +4967,20 @@ static void mesh_batch_cache_create_overlay_batches(Mesh *me)
GPU_batch_vertbuf_add(cache->overlay_loose_verts, mesh_batch_cache_get_edit_lvert_data(rdata, cache));
}
+ /* Also used for vertices display */
if (cache->overlay_triangles_nor == NULL) {
cache->overlay_triangles_nor = GPU_batch_create(
- GPU_PRIM_POINTS, mesh_batch_cache_get_edit_tri_pos(rdata, cache), NULL);
+ GPU_PRIM_POINTS, mesh_batch_cache_get_edit_tri_pos(rdata, cache),
+ mesh_batch_cache_get_edit_tri_indices(rdata, cache));
GPU_batch_vertbuf_add(cache->overlay_triangles_nor, mesh_batch_cache_get_edit_tri_nor(rdata, cache));
+ GPU_batch_vertbuf_add(cache->overlay_triangles_nor, mesh_batch_cache_get_edit_tri_data(rdata, cache));
}
if (cache->overlay_loose_edges_nor == NULL) {
cache->overlay_loose_edges_nor = GPU_batch_create(
GPU_PRIM_POINTS, mesh_batch_cache_get_edit_ledge_pos(rdata, cache), NULL);
GPU_batch_vertbuf_add(cache->overlay_loose_edges_nor, mesh_batch_cache_get_edit_ledge_nor(rdata, cache));
+ GPU_batch_vertbuf_add(cache->overlay_loose_edges_nor, mesh_batch_cache_get_edit_ledge_data(rdata, cache));
}
mesh_render_data_free(rdata);
@@ -4291,6 +4997,17 @@ GPUBatch *DRW_mesh_batch_cache_get_overlay_triangles(Mesh *me)
return cache->overlay_triangles;
}
+GPUTexture *DRW_mesh_batch_cache_get_overlay_data_tex(Mesh *me)
+{
+ MeshBatchCache *cache = mesh_batch_cache_get(me);
+
+ if (cache->ed_tri_data_tx == NULL) {
+ mesh_batch_cache_create_overlay_batches(me);
+ }
+
+ return cache->ed_tri_data_tx;
+}
+
GPUBatch *DRW_mesh_batch_cache_get_overlay_loose_edges(Mesh *me)
{
MeshBatchCache *cache = mesh_batch_cache_get(me);
@@ -4389,6 +5106,9 @@ GPUBatch *DRW_mesh_batch_cache_get_edges_with_select_id(Mesh *me, uint select_id
if (cache->edges_with_select_id == NULL) {
MeshRenderData *rdata = mesh_render_data_create(me, MR_DATATYPE_VERT | MR_DATATYPE_EDGE);
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
cache->edges_with_select_id = GPU_batch_create(
GPU_PRIM_LINES, mesh_batch_cache_get_edges_visible(rdata, cache), NULL);
@@ -4414,6 +5134,9 @@ GPUBatch *DRW_mesh_batch_cache_get_verts_with_select_id(Mesh *me, uint select_id
if (cache->verts_with_select_id == NULL) {
MeshRenderData *rdata = mesh_render_data_create(me, MR_DATATYPE_VERT);
+ if (rdata->mapped.supported) {
+ rdata->mapped.use = true;
+ }
cache->verts_with_select_id = GPU_batch_create(
GPU_PRIM_POINTS, mesh_batch_cache_get_verts_visible(rdata, cache), NULL);
@@ -4435,6 +5158,20 @@ GPUBatch **DRW_mesh_batch_cache_get_surface_shaded(
MeshBatchCache *cache = mesh_batch_cache_get(me);
if (cache->shaded_triangles == NULL) {
+
+ /* Hack to show the final result. */
+ const bool use_em_final = (
+ me->edit_btmesh &&
+ me->edit_btmesh->mesh_eval_final &&
+ (me->edit_btmesh->mesh_eval_final->runtime.is_original == false));
+ Mesh me_fake;
+ if (use_em_final) {
+ me_fake = *me->edit_btmesh->mesh_eval_final;
+ me_fake.mat = me->mat;
+ me_fake.totcol = me->totcol;
+ me = &me_fake;
+ }
+
/* create batch from DM */
const int datatype =
MR_DATATYPE_VERT | MR_DATATYPE_LOOP | MR_DATATYPE_LOOPTRI |
@@ -4450,7 +5187,7 @@ GPUBatch **DRW_mesh_batch_cache_get_surface_shaded(
GPUVertBuf *vbo = mesh_batch_cache_get_tri_pos_and_normals(rdata, cache);
GPUVertBuf *vbo_shading = mesh_batch_cache_get_tri_shading_data(rdata, cache);
- for (int i = 0; i < mat_len; ++i) {
+ for (int i = 0; i < mat_len; i++) {
cache->shaded_triangles[i] = GPU_batch_create(
GPU_PRIM_TRIS, vbo, el[i]);
if (vbo_shading) {
@@ -4487,7 +5224,7 @@ GPUBatch **DRW_mesh_batch_cache_get_surface_texpaint(Mesh *me)
GPUIndexBuf **el = mesh_batch_cache_get_triangles_in_order_split_by_material(rdata, cache);
GPUVertBuf *vbo = mesh_batch_cache_get_tri_pos_and_normals(rdata, cache);
- for (int i = 0; i < mat_len; ++i) {
+ for (int i = 0; i < mat_len; i++) {
cache->texpaint_triangles[i] = GPU_batch_create(
GPU_PRIM_TRIS, vbo, el[i]);
GPUVertBuf *vbo_uv = mesh_batch_cache_get_tri_uv_active(rdata, cache);
@@ -4556,7 +5293,7 @@ GPUBatch *DRW_mesh_batch_cache_get_texpaint_loop_wire(Mesh *me)
GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
GPU_vertbuf_data_alloc(vbo, vert_len);
- MPoly *mpoly = rdata->mpoly;
+ const MPoly *mpoly = rdata->mpoly;
for (int a = 0; a < poly_len; a++, mpoly++) {
const MLoopUV *mloopuv = mloopuv_base + mpoly->loopstart;
for (int b = 0; b < mpoly->totloop; b++, mloopuv++) {
diff --git a/source/blender/draw/intern/draw_debug.c b/source/blender/draw/intern/draw_debug.c
index 053d266ec34..366da92cf50 100644
--- a/source/blender/draw/intern/draw_debug.c
+++ b/source/blender/draw/intern/draw_debug.c
@@ -161,10 +161,10 @@ static void drw_debug_draw_lines(void)
while (DST.debug.lines) {
void *next = DST.debug.lines->next;
- immAttrib4fv(col, DST.debug.lines->color);
+ immAttr4fv(col, DST.debug.lines->color);
immVertex3fv(pos, DST.debug.lines->pos[0]);
- immAttrib4fv(col, DST.debug.lines->color);
+ immAttr4fv(col, DST.debug.lines->color);
immVertex3fv(pos, DST.debug.lines->pos[1]);
MEM_freeN(DST.debug.lines);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 0566abd3436..512100d3ded 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -148,13 +148,10 @@ struct DRWTextStore *DRW_text_cache_ensure(void)
/** \name Settings
* \{ */
-bool DRW_object_is_renderable(Object *ob)
+bool DRW_object_is_renderable(const Object *ob)
{
BLI_assert(BKE_object_is_visible(ob, OB_VISIBILITY_CHECK_UNKNOWN_RENDER_MODE));
- if (ob->dt < OB_SOLID)
- return false;
-
if (ob->type == OB_MESH) {
if ((ob == DST.draw_ctx.object_edit) || BKE_object_is_in_editmode(ob)) {
View3D *v3d = DST.draw_ctx.v3d;
@@ -173,7 +170,7 @@ bool DRW_object_is_renderable(Object *ob)
* Return whether this object is visible depending if
* we are rendering or drawing in the viewport.
*/
-bool DRW_check_object_visible_within_active_context(Object *ob)
+bool DRW_object_is_visible_in_active_context(const Object *ob)
{
const eObjectVisibilityCheck mode = DRW_state_is_scene_render() ?
OB_VISIBILITY_CHECK_FOR_RENDER :
@@ -192,9 +189,9 @@ bool DRW_object_is_flat_normal(const Object *ob)
return true;
}
-bool DRW_check_psys_visible_within_active_context(
- Object *object,
- struct ParticleSystem *psys)
+bool DRW_object_is_visible_psys_in_active_context(
+ const Object *object,
+ const ParticleSystem *psys)
{
const DRWContextState *draw_ctx = DRW_context_state_get();
const Scene *scene = draw_ctx->scene;
@@ -270,13 +267,13 @@ void DRW_transform_to_display(GPUTexture *tex, bool use_view_settings)
/* Full screen triangle */
immBegin(GPU_PRIM_TRIS, 3);
- immAttrib2f(texco, 0.0f, 0.0f);
+ immAttr2f(texco, 0.0f, 0.0f);
immVertex2f(pos, -1.0f, -1.0f);
- immAttrib2f(texco, 2.0f, 0.0f);
+ immAttr2f(texco, 2.0f, 0.0f);
immVertex2f(pos, 3.0f, -1.0f);
- immAttrib2f(texco, 0.0f, 2.0f);
+ immAttr2f(texco, 0.0f, 2.0f);
immVertex2f(pos, -1.0f, 3.0f);
immEnd();
@@ -1284,7 +1281,7 @@ static void drw_engines_enable(ViewLayer *view_layer, RenderEngineType *engine_t
{
Object *obact = OBACT(view_layer);
const int mode = CTX_data_mode_enum_ex(DST.draw_ctx.object_edit, obact, DST.draw_ctx.object_mode);
- View3D * v3d = DST.draw_ctx.v3d;
+ View3D *v3d = DST.draw_ctx.v3d;
const int drawtype = v3d->shading.type;
const bool use_xray = XRAY_ENABLED(v3d);
@@ -1660,7 +1657,7 @@ static bool DRW_render_check_grease_pencil(Depsgraph *depsgraph)
{
DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob)
{
- if ((ob->type == OB_GPENCIL) && (DRW_check_object_visible_within_active_context(ob))) {
+ if ((ob->type == OB_GPENCIL) && (DRW_object_is_visible_in_active_context(ob))) {
return true;
}
}
@@ -2201,16 +2198,16 @@ static void draw_depth_texture_to_screen(GPUTexture *texture)
immBegin(GPU_PRIM_TRI_STRIP, 4);
- immAttrib2f(texcoord, 0.0f, 0.0f);
+ immAttr2f(texcoord, 0.0f, 0.0f);
immVertex2f(pos, 0.0f, 0.0f);
- immAttrib2f(texcoord, 1.0f, 0.0f);
+ immAttr2f(texcoord, 1.0f, 0.0f);
immVertex2f(pos, w, 0.0f);
- immAttrib2f(texcoord, 0.0f, 1.0f);
+ immAttr2f(texcoord, 0.0f, 1.0f);
immVertex2f(pos, 0.0f, h);
- immAttrib2f(texcoord, 1.0f, 1.0f);
+ immAttr2f(texcoord, 1.0f, 1.0f);
immVertex2f(pos, w, h);
immEnd();
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index 5916b45aa27..c8a7816c402 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -101,6 +101,7 @@ enum {
DRW_CALL_NORMALWORLD = (1 << 5),
DRW_CALL_ORCOTEXFAC = (1 << 6),
DRW_CALL_EYEVEC = (1 << 7),
+ DRW_CALL_OBJECTINFO = (1 << 8),
};
typedef struct DRWCallState {
@@ -122,6 +123,7 @@ typedef struct DRWCallState {
float normalview[3][3];
float normalworld[3][3]; /* Not view dependent */
float orcotexfac[2][3]; /* Not view dependent */
+ float objectinfo[2];
float eyevec[3];
} DRWCallState;
@@ -140,6 +142,7 @@ typedef struct DRWCall {
union {
struct { /* type == DRW_CALL_SINGLE */
GPUBatch *geometry;
+ short ma_index;
} single;
struct { /* type == DRW_CALL_RANGE */
GPUBatch *geometry;
@@ -257,14 +260,13 @@ struct DRWShadingGroup {
int orcotexfac;
int eye;
int callid;
+ int objectinfo;
uint16_t matflag; /* Matrices needed, same as DRWCall.flag */
+ DRWPass *pass_parent; /* backlink to pass we're in */
#ifndef NDEBUG
char attribs_count;
#endif
-#if !defined(NDEBUG) || defined(USE_GPU_SELECT)
- DRWPass *pass_parent; /* backlink to pass we're in */
-#endif
#ifdef USE_GPU_SELECT
GPUVertBuf *inst_selectid;
int override_selectid; /* Override for single object instances. */
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 371bd9dd189..3823d081adc 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -36,6 +36,7 @@
#include "DNA_mesh_types.h"
#include "DNA_meta_types.h"
+#include "BLI_hash.h"
#include "BLI_link_utils.h"
#include "BLI_mempool.h"
@@ -344,6 +345,22 @@ static DRWCallState *drw_call_state_create(DRWShadingGroup *shgroup, float (*obm
state->matflag &= ~DRW_CALL_ORCOTEXFAC;
}
+ if ((state->matflag & DRW_CALL_OBJECTINFO) != 0) {
+ state->objectinfo[0] = ob ? ob->index : 0;
+ unsigned int random;
+#if 0 /* TODO(fclem) handle dupli objects */
+ if (GMS.dob) {
+ random = GMS.dob->random_id;
+ }
+ else
+#endif
+ {
+ random = BLI_hash_int_2d(BLI_hash_string(ob->id.name + 2), 0);
+ }
+ state->objectinfo[1] = random * (1.0f / (float)0xFFFFFFFF);
+ state->matflag &= ~DRW_CALL_OBJECTINFO;
+ }
+
return state;
}
@@ -440,7 +457,7 @@ void DRW_shgroup_call_object_procedural_triangles_culled_add(DRWShadingGroup *sh
}
/* These calls can be culled and are optimized for redraw */
-void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob, bool bypass_culling)
+void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob, Material *ma, bool bypass_culling)
{
BLI_assert(geom != NULL);
BLI_assert(ELEM(shgroup->type, DRW_SHG_NORMAL, DRW_SHG_FEEDBACK_TRANSFORM));
@@ -449,6 +466,7 @@ void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, GPUBatch *geom, Ob
call->state = drw_call_state_object(shgroup, ob->obmat, ob);
call->type = DRW_CALL_SINGLE;
call->single.geometry = geom;
+ call->single.ma_index = ma ? ma->index : 0;
#ifdef USE_GPU_SELECT
call->select_id = DST.select_id;
#endif
@@ -460,7 +478,7 @@ void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, GPUBatch *geom, Ob
}
void DRW_shgroup_call_object_add_with_callback(
- DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob,
+ DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob, Material *ma,
DRWCallVisibilityFn *callback, void *user_data)
{
BLI_assert(geom != NULL);
@@ -472,6 +490,7 @@ void DRW_shgroup_call_object_add_with_callback(
call->state->user_data = user_data;
call->type = DRW_CALL_SINGLE;
call->single.geometry = geom;
+ call->single.ma_index = ma ? ma->index : 0;
#ifdef USE_GPU_SELECT
call->select_id = DST.select_id;
#endif
@@ -635,6 +654,7 @@ static void drw_shgroup_init(DRWShadingGroup *shgroup, GPUShader *shader)
shgroup->normalview = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_NORMAL);
shgroup->normalworld = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_WORLDNORMAL);
shgroup->orcotexfac = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_ORCO);
+ shgroup->objectinfo = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_OBJECT_INFO);
shgroup->eye = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_EYE);
shgroup->callid = GPU_shader_get_builtin_uniform(shader, GPU_UNIFORM_CALLID);
@@ -653,6 +673,8 @@ static void drw_shgroup_init(DRWShadingGroup *shgroup, GPUShader *shader)
shgroup->matflag |= DRW_CALL_NORMALWORLD;
if (shgroup->orcotexfac > -1)
shgroup->matflag |= DRW_CALL_ORCOTEXFAC;
+ if (shgroup->objectinfo > -1)
+ shgroup->matflag |= DRW_CALL_OBJECTINFO;
if (shgroup->eye > -1)
shgroup->matflag |= DRW_CALL_EYEVEC;
}
@@ -746,10 +768,7 @@ static DRWShadingGroup *drw_shgroup_create_ex(struct GPUShader *shader, DRWPass
shgroup->instance_geom = NULL;
shgroup->instance_vbo = NULL;
#endif
-
-#if !defined(NDEBUG) || defined(USE_GPU_SELECT)
shgroup->pass_parent = pass;
-#endif
return shgroup;
}
@@ -1013,6 +1032,23 @@ bool DRW_shgroup_is_empty(DRWShadingGroup *shgroup)
return true;
}
+DRWShadingGroup *DRW_shgroup_create_sub(DRWShadingGroup *shgroup)
+{
+ /* Remove this assertion if needed but implement the other cases first! */
+ BLI_assert(shgroup->type == DRW_SHG_NORMAL);
+
+ DRWShadingGroup *shgroup_new = BLI_mempool_alloc(DST.vmempool->shgroups);
+
+ *shgroup_new = *shgroup;
+ shgroup_new->uniforms = NULL; /* Not sure about that.. Should we copy them instead? */
+ shgroup_new->calls.first = NULL;
+ shgroup_new->calls.last = NULL;
+
+ BLI_LINKS_INSERT_AFTER(&shgroup->pass_parent->shgroups, shgroup, shgroup_new);
+
+ return shgroup;
+}
+
/** \} */
/* -------------------------------------------------------------------- */
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 938dda2eec9..7a4edc4e7fe 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -801,10 +801,16 @@ static void draw_matrices_model_prepare(DRWCallState *st)
}
}
-static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCallState *state)
+static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCall *call)
{
/* step 1 : bind object dependent matrices */
- if (state != NULL) {
+ if (call != NULL) {
+ DRWCallState *state = call->state;
+ float objectinfo[3];
+ objectinfo[0] = state->objectinfo[0];
+ objectinfo[1] = call->single.ma_index; /* WATCH this is only valid for single drawcalls. */
+ objectinfo[2] = state->objectinfo[1];
+
GPU_shader_uniform_vector(shgroup->shader, shgroup->model, 16, 1, (float *)state->model);
GPU_shader_uniform_vector(shgroup->shader, shgroup->modelinverse, 16, 1, (float *)state->modelinverse);
GPU_shader_uniform_vector(shgroup->shader, shgroup->modelview, 16, 1, (float *)state->modelview);
@@ -812,6 +818,7 @@ static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCallState *state)
GPU_shader_uniform_vector(shgroup->shader, shgroup->modelviewprojection, 16, 1, (float *)state->modelviewprojection);
GPU_shader_uniform_vector(shgroup->shader, shgroup->normalview, 9, 1, (float *)state->normalview);
GPU_shader_uniform_vector(shgroup->shader, shgroup->normalworld, 9, 1, (float *)state->normalworld);
+ GPU_shader_uniform_vector(shgroup->shader, shgroup->objectinfo, 3, 1, (float *)objectinfo);
GPU_shader_uniform_vector(shgroup->shader, shgroup->orcotexfac, 3, 2, (float *)state->orcotexfac);
GPU_shader_uniform_vector(shgroup->shader, shgroup->eye, 3, 1, (float *)state->eyevec);
}
@@ -825,6 +832,7 @@ static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCallState *state)
GPU_shader_uniform_vector(shgroup->shader, shgroup->modelview, 16, 1, (float *)DST.view_data.matstate.mat[DRW_MAT_VIEW]);
GPU_shader_uniform_vector(shgroup->shader, shgroup->modelviewinverse, 16, 1, (float *)DST.view_data.matstate.mat[DRW_MAT_VIEWINV]);
GPU_shader_uniform_vector(shgroup->shader, shgroup->modelviewprojection, 16, 1, (float *)DST.view_data.matstate.mat[DRW_MAT_PERS]);
+ GPU_shader_uniform_vector(shgroup->shader, shgroup->objectinfo, 3, 1, (float *)unitmat);
GPU_shader_uniform_vector(shgroup->shader, shgroup->orcotexfac, 3, 2, (float *)shgroup->instance_orcofac);
}
}
@@ -1205,7 +1213,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
}
GPU_SELECT_LOAD_IF_PICKSEL_CALL(call);
- draw_geometry_prepare(shgroup, call->state);
+ draw_geometry_prepare(shgroup, call);
switch (call->type) {
case DRW_CALL_SINGLE:
diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c
index d77620bc47b..545c4af878c 100644
--- a/source/blender/draw/intern/draw_view.c
+++ b/source/blender/draw/intern/draw_view.c
@@ -108,11 +108,11 @@ void DRW_draw_background(void)
UI_GetThemeColor3ubv(TH_HIGH_GRAD, col_hi);
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib3ubv(color, col_lo);
+ immAttr3ubv(color, col_lo);
immVertex2f(pos, -1.0f, -1.0f);
immVertex2f(pos, 1.0f, -1.0f);
- immAttrib3ubv(color, col_hi);
+ immAttr3ubv(color, col_hi);
immVertex2f(pos, 1.0f, 1.0f);
immVertex2f(pos, -1.0f, 1.0f);
immEnd();
diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index aa19769bcac..609d6b2edb6 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -56,7 +56,7 @@ extern char datatoc_edit_mesh_overlay_frag_glsl[];
extern char datatoc_edit_mesh_overlay_vert_glsl[];
extern char datatoc_edit_mesh_overlay_geom_tri_glsl[];
extern char datatoc_edit_mesh_overlay_geom_edge_glsl[];
-extern char datatoc_edit_mesh_overlay_loosevert_vert_glsl[];
+extern char datatoc_edit_mesh_overlay_points_vert_glsl[];
extern char datatoc_edit_mesh_overlay_facedot_frag_glsl[];
extern char datatoc_edit_mesh_overlay_facedot_vert_glsl[];
extern char datatoc_edit_mesh_overlay_ghost_clear_vert_glsl[];
@@ -68,6 +68,8 @@ extern char datatoc_edit_normals_geom_glsl[];
extern char datatoc_common_globals_lib_glsl[];
extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
+extern char datatoc_gpu_shader_flat_color_frag_glsl[];
+extern char datatoc_gpu_shader_point_varying_color_frag_glsl[];
/* *********** LISTS *********** */
typedef struct EDIT_MESH_PassList {
@@ -110,6 +112,7 @@ static struct {
GPUShader *overlay_loose_edge_sh_cache[MAX_SHADERS];
GPUShader *overlay_vert_sh;
+ GPUShader *overlay_lvert_sh;
GPUShader *overlay_facedot_sh;
GPUShader *overlay_mix_sh;
GPUShader *overlay_facefill_sh;
@@ -133,11 +136,13 @@ typedef struct EDIT_MESH_PrivateData {
DRWShadingGroup *lnormals_shgrp;
DRWShadingGroup *face_overlay_shgrp;
+ DRWShadingGroup *verts_overlay_shgrp;
DRWShadingGroup *ledges_overlay_shgrp;
DRWShadingGroup *lverts_overlay_shgrp;
DRWShadingGroup *facedot_overlay_shgrp;
DRWShadingGroup *face_occluded_shgrp;
+ DRWShadingGroup *verts_occluded_shgrp;
DRWShadingGroup *ledges_occluded_shgrp;
DRWShadingGroup *lverts_occluded_shgrp;
DRWShadingGroup *facedot_occluded_shgrp;
@@ -182,7 +187,7 @@ static char *EDIT_MESH_sh_defines(ToolSettings *tsettings, RegionView3D *rv3d, b
BLI_dynstr_append(ds, "#define FACE_SELECTION\n");
}
- if (!fast_mode) {
+ if (!fast_mode || looseedge) {
BLI_dynstr_append(ds, "#define EDGE_FIX\n");
}
@@ -211,9 +216,11 @@ static char *EDIT_MESH_sh_lib(void)
return str;
}
-static GPUShader *EDIT_MESH_ensure_shader(ToolSettings *tsettings, RegionView3D *rv3d, bool fast_mode, bool looseedge)
+static GPUShader *EDIT_MESH_ensure_shader(
+ ToolSettings *tsettings, RegionView3D *rv3d, bool supports_fast_mode, bool looseedge)
{
- const int index = EDIT_MESH_sh_index(tsettings, rv3d, fast_mode);
+ const int index = EDIT_MESH_sh_index(tsettings, rv3d, supports_fast_mode);
+ const int fast_mode = rv3d->rflag & RV3D_NAVIGATING;
if (looseedge) {
if (!e_data.overlay_loose_edge_sh_cache[index]) {
char *defines = EDIT_MESH_sh_defines(tsettings, rv3d, true, true);
@@ -235,7 +242,7 @@ static GPUShader *EDIT_MESH_ensure_shader(ToolSettings *tsettings, RegionView3D
char *lib = EDIT_MESH_sh_lib();
e_data.overlay_tri_sh_cache[index] = DRW_shader_create_with_lib(
datatoc_edit_mesh_overlay_vert_glsl,
- datatoc_edit_mesh_overlay_geom_tri_glsl,
+ fast_mode ? NULL : datatoc_edit_mesh_overlay_geom_tri_glsl,
datatoc_edit_mesh_overlay_frag_glsl,
lib,
defines);
@@ -273,10 +280,13 @@ static void EDIT_MESH_engine_init(void *vedata)
if (!e_data.overlay_vert_sh) {
char *lib = EDIT_MESH_sh_lib();
e_data.overlay_vert_sh = DRW_shader_create_with_lib(
- datatoc_edit_mesh_overlay_loosevert_vert_glsl, NULL,
- datatoc_edit_mesh_overlay_frag_glsl,
- lib,
- "#define VERTEX_SELECTION\n");
+ datatoc_edit_mesh_overlay_points_vert_glsl, NULL,
+ datatoc_gpu_shader_point_varying_color_frag_glsl, lib,
+ "#define VERTEX_FACING\n");
+ e_data.overlay_lvert_sh = DRW_shader_create_with_lib(
+ datatoc_edit_mesh_overlay_points_vert_glsl, NULL,
+ datatoc_gpu_shader_point_varying_color_frag_glsl, lib,
+ NULL);
MEM_freeN(lib);
}
if (!e_data.overlay_facedot_sh) {
@@ -328,7 +338,7 @@ static void EDIT_MESH_engine_init(void *vedata)
static DRWPass *edit_mesh_create_overlay_pass(
float *face_alpha, float *edge_width_scale, int *data_mask, bool do_edges,
DRWState statemod,
- DRWShadingGroup **r_face_shgrp, DRWShadingGroup **r_ledges_shgrp,
+ DRWShadingGroup **r_face_shgrp, DRWShadingGroup **r_verts_shgrp, DRWShadingGroup **r_ledges_shgrp,
DRWShadingGroup **r_lverts_shgrp, DRWShadingGroup **r_facedot_shgrp)
{
GPUShader *tri_sh, *ledge_sh;
@@ -360,10 +370,15 @@ static DRWPass *edit_mesh_create_overlay_pass(
DRW_shgroup_uniform_bool_copy(*r_ledges_shgrp, "doEdges", do_edges);
if ((tsettings->selectmode & SCE_SELECT_VERTEX) != 0) {
- *r_lverts_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, pass);
+ *r_lverts_shgrp = DRW_shgroup_create(e_data.overlay_lvert_sh, pass);
DRW_shgroup_uniform_block(*r_lverts_shgrp, "globalsBlock", globals_ubo);
DRW_shgroup_uniform_vec2(*r_lverts_shgrp, "viewportSize", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_float(*r_lverts_shgrp, "edgeScale", edge_width_scale, 1);
+
+ *r_verts_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, pass);
+ DRW_shgroup_uniform_block(*r_verts_shgrp, "globalsBlock", globals_ubo);
+ DRW_shgroup_uniform_vec2(*r_verts_shgrp, "viewportSize", DRW_viewport_size_get(), 1);
+ DRW_shgroup_uniform_float(*r_verts_shgrp, "edgeScale", edge_width_scale, 1);
}
if ((tsettings->selectmode & SCE_SELECT_FACE) != 0) {
@@ -499,16 +514,22 @@ static void EDIT_MESH_cache_init(void *vedata)
psl->edit_face_overlay = edit_mesh_create_overlay_pass(
&face_mod, &stl->g_data->edge_width_scale, stl->g_data->data_mask, stl->g_data->do_edges,
DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND,
- &stl->g_data->face_overlay_shgrp, &stl->g_data->ledges_overlay_shgrp,
- &stl->g_data->lverts_overlay_shgrp, &stl->g_data->facedot_overlay_shgrp);
+ &stl->g_data->face_overlay_shgrp,
+ &stl->g_data->verts_overlay_shgrp,
+ &stl->g_data->ledges_overlay_shgrp,
+ &stl->g_data->lverts_overlay_shgrp,
+ &stl->g_data->facedot_overlay_shgrp);
}
else {
/* We render all wires with depth and opaque to a new fbo and blend the result based on depth values */
psl->edit_face_occluded = edit_mesh_create_overlay_pass(
&zero, &stl->g_data->edge_width_scale, stl->g_data->data_mask, stl->g_data->do_edges,
DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WRITE_DEPTH,
- &stl->g_data->face_occluded_shgrp, &stl->g_data->ledges_occluded_shgrp,
- &stl->g_data->lverts_occluded_shgrp, &stl->g_data->facedot_occluded_shgrp);
+ &stl->g_data->face_occluded_shgrp,
+ &stl->g_data->verts_occluded_shgrp,
+ &stl->g_data->ledges_occluded_shgrp,
+ &stl->g_data->lverts_occluded_shgrp,
+ &stl->g_data->facedot_occluded_shgrp);
/* however we loose the front faces value (because we need the depth of occluded wires and
* faces are alpha blended ) so we recover them in a new pass. */
@@ -535,14 +556,24 @@ static void EDIT_MESH_cache_init(void *vedata)
}
static void edit_mesh_add_ob_to_pass(
- Scene *scene, Object *ob, DRWShadingGroup *face_shgrp, DRWShadingGroup *ledges_shgrp,
- DRWShadingGroup *lverts_shgrp, DRWShadingGroup *facedot_shgrp, DRWShadingGroup *facefill_shgrp)
+ Scene *scene, Object *ob,
+ DRWShadingGroup *face_shgrp,
+ DRWShadingGroup *verts_shgrp,
+ DRWShadingGroup *ledges_shgrp,
+ DRWShadingGroup *lverts_shgrp,
+ DRWShadingGroup *facedot_shgrp,
+ DRWShadingGroup *facefill_shgrp)
{
- struct GPUBatch *geo_ovl_tris, *geo_ovl_ledges, *geo_ovl_lverts, *geo_ovl_fcenter;
+ struct GPUBatch *geo_ovl_tris, *geo_ovl_verts, *geo_ovl_ledges, *geo_ovl_lverts, *geo_ovl_fcenter;
+ struct GPUTexture *data_texture;
ToolSettings *tsettings = scene->toolsettings;
- DRW_cache_mesh_wire_overlay_get(ob, &geo_ovl_tris, &geo_ovl_ledges, &geo_ovl_lverts);
+ DRW_cache_mesh_wire_overlay_get(ob, &geo_ovl_tris, &geo_ovl_ledges, &geo_ovl_lverts, &data_texture);
+
+ face_shgrp = DRW_shgroup_create_sub(face_shgrp);
+ DRW_shgroup_uniform_texture(face_shgrp, "dataBuffer", data_texture);
DRW_shgroup_call_add(face_shgrp, geo_ovl_tris, ob->obmat);
+
DRW_shgroup_call_add(ledges_shgrp, geo_ovl_ledges, ob->obmat);
if (facefill_shgrp) {
@@ -550,6 +581,10 @@ static void edit_mesh_add_ob_to_pass(
}
if ((tsettings->selectmode & SCE_SELECT_VERTEX) != 0) {
+ /* Thoses are point batches. */
+ DRW_cache_mesh_normals_overlay_get(ob, &geo_ovl_verts, &geo_ovl_ledges, &geo_ovl_lverts);
+ DRW_shgroup_call_add(verts_shgrp, geo_ovl_verts, ob->obmat);
+ DRW_shgroup_call_add(lverts_shgrp, geo_ovl_ledges, ob->obmat);
DRW_shgroup_call_add(lverts_shgrp, geo_ovl_lverts, ob->obmat);
}
@@ -631,6 +666,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
edit_mesh_add_ob_to_pass(
scene, ob,
stl->g_data->face_occluded_shgrp,
+ stl->g_data->verts_occluded_shgrp,
stl->g_data->ledges_occluded_shgrp,
stl->g_data->lverts_occluded_shgrp,
stl->g_data->facedot_occluded_shgrp,
@@ -640,6 +676,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
edit_mesh_add_ob_to_pass(
scene, ob,
stl->g_data->face_overlay_shgrp,
+ stl->g_data->verts_overlay_shgrp,
stl->g_data->ledges_overlay_shgrp,
stl->g_data->lverts_overlay_shgrp,
(show_face_dots) ? stl->g_data->facedot_overlay_shgrp : NULL,
@@ -727,6 +764,7 @@ static void EDIT_MESH_engine_free(void)
DRW_SHADER_FREE_SAFE(e_data.weight_face_shader);
DRW_SHADER_FREE_SAFE(e_data.overlay_vert_sh);
+ DRW_SHADER_FREE_SAFE(e_data.overlay_lvert_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_facedot_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_mix_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_facefill_sh);
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index 2df2ad57073..20abfbf3348 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -634,7 +634,7 @@ static void OBJECT_engine_init(void *vedata)
}
float dist;
- if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
+ if (rv3d->persp == RV3D_CAMOB && v3d->camera && v3d->camera->type == OB_CAMERA) {
Object *camera_object = DEG_get_evaluated_object(draw_ctx->depsgraph, v3d->camera);
dist = ((Camera *)(camera_object->data))->clipend;
}
@@ -2040,7 +2040,7 @@ static void volumes_free_smoke_textures(void)
* all viewport in a redraw at least. */
for (LinkData *link = e_data.smoke_domains.first; link; link = link->next) {
SmokeModifierData *smd = (SmokeModifierData *)link->data;
- GPU_free_smoke(smd);
+ GPU_free_smoke_velocity(smd);
}
BLI_freelistN(&e_data.smoke_domains);
}
@@ -2281,7 +2281,7 @@ static void DRW_shgroup_relationship_lines(
Scene *scene,
Object *ob)
{
- if (ob->parent && DRW_check_object_visible_within_active_context(ob->parent)) {
+ if (ob->parent && DRW_object_is_visible_in_active_context(ob->parent)) {
DRW_shgroup_call_dynamic_add(sgl->relationship_lines, ob->parent->obmat[3]);
DRW_shgroup_call_dynamic_add(sgl->relationship_lines, ob->obmat[3]);
}
@@ -2289,11 +2289,11 @@ static void DRW_shgroup_relationship_lines(
if (ob->rigidbody_constraint) {
Object *rbc_ob1 = ob->rigidbody_constraint->ob1;
Object *rbc_ob2 = ob->rigidbody_constraint->ob2;
- if (rbc_ob1 && DRW_check_object_visible_within_active_context(rbc_ob1)) {
+ if (rbc_ob1 && DRW_object_is_visible_in_active_context(rbc_ob1)) {
DRW_shgroup_call_dynamic_add(sgl->relationship_lines, rbc_ob1->obmat[3]);
DRW_shgroup_call_dynamic_add(sgl->relationship_lines, ob->obmat[3]);
}
- if (rbc_ob2 && DRW_check_object_visible_within_active_context(rbc_ob2)) {
+ if (rbc_ob2 && DRW_object_is_visible_in_active_context(rbc_ob2)) {
DRW_shgroup_call_dynamic_add(sgl->relationship_lines, rbc_ob2->obmat[3]);
DRW_shgroup_call_dynamic_add(sgl->relationship_lines, ob->obmat[3]);
}
@@ -2538,7 +2538,7 @@ static void OBJECT_cache_populate_particles(Object *ob,
if (!psys_check_enabled(ob, psys, false)) {
continue;
}
- if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+ if (!DRW_object_is_visible_psys_in_active_context(ob, psys)) {
continue;
}
@@ -2624,7 +2624,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob)
OBJECT_cache_populate_particles(ob, psl);
}
- if (DRW_check_object_visible_within_active_context(ob) == false) {
+ if (DRW_object_is_visible_in_active_context(ob) == false) {
return;
}
diff --git a/source/blender/draw/modes/overlay_mode.c b/source/blender/draw/modes/overlay_mode.c
index 166b2a12d7b..3fa2f1d48e2 100644
--- a/source/blender/draw/modes/overlay_mode.c
+++ b/source/blender/draw/modes/overlay_mode.c
@@ -88,7 +88,7 @@ extern struct GlobalsUboStorage ts; /* draw_common.c */
/* Functions */
static void overlay_engine_init(void *vedata)
{
- OVERLAY_Data * data = (OVERLAY_Data *)vedata;
+ OVERLAY_Data *data = vedata;
OVERLAY_StorageList *stl = data->stl;
if (!stl->g_data) {
@@ -149,7 +149,7 @@ static void overlay_engine_init(void *vedata)
static void overlay_cache_init(void *vedata)
{
- OVERLAY_Data * data = (OVERLAY_Data *)vedata;
+ OVERLAY_Data *data = vedata;
OVERLAY_PassList *psl = data->psl;
OVERLAY_StorageList *stl = data->stl;
@@ -223,7 +223,7 @@ static void overlay_cache_init(void *vedata)
static void overlay_cache_populate(void *vedata, Object *ob)
{
- OVERLAY_Data * data = (OVERLAY_Data *)vedata;
+ OVERLAY_Data *data = vedata;
OVERLAY_StorageList *stl = data->stl;
OVERLAY_PrivateData *pd = stl->g_data;
OVERLAY_PassList *psl = data->psl;
@@ -322,7 +322,7 @@ static void overlay_cache_populate(void *vedata, Object *ob)
static void overlay_cache_finish(void *vedata)
{
- OVERLAY_Data * data = (OVERLAY_Data *)vedata;
+ OVERLAY_Data *data = vedata;
OVERLAY_PassList *psl = data->psl;
OVERLAY_StorageList *stl = data->stl;
@@ -340,7 +340,7 @@ static void overlay_cache_finish(void *vedata)
static void overlay_draw_scene(void *vedata)
{
- OVERLAY_Data * data = (OVERLAY_Data *)vedata;
+ OVERLAY_Data *data = vedata;
OVERLAY_PassList *psl = data->psl;
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
diff --git a/source/blender/draw/modes/paint_weight_mode.c b/source/blender/draw/modes/paint_weight_mode.c
index f5394e4e925..9060a97f412 100644
--- a/source/blender/draw/modes/paint_weight_mode.c
+++ b/source/blender/draw/modes/paint_weight_mode.c
@@ -140,6 +140,8 @@ static void PAINT_WEIGHT_cache_init(void *vedata)
stl->g_data->fweights_shgrp = DRW_shgroup_create(e_data.weight_face_shader, psl->weight_faces);
+ DRW_shgroup_uniform_bool_copy(stl->g_data->fweights_shgrp, "drawContours", (v3d->overlay.wpaint_flag & V3D_OVERLAY_WPAINT_CONTOURS) != 0);
+
DRW_shgroup_uniform_float(stl->g_data->fweights_shgrp, "opacity", &v3d->overlay.weight_paint_mode_opacity, 1);
DRW_shgroup_uniform_texture(stl->g_data->fweights_shgrp, "colorramp", globals_weight_ramp);
DRW_shgroup_uniform_block(stl->g_data->fweights_shgrp, "globalsBlock", globals_ubo);
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl
index 87ee0d7f00f..b37862f2037 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl
@@ -6,9 +6,15 @@
#define EDGE_FREESTYLE (1 << 5)
#define EDGE_VERTEX_ACTIVE (1 << (0 + 8))
#define EDGE_VERTEX_SELECTED (1 << (1 + 8))
+#define EDGE_VERTEX_EXISTS (1 << (2 + 8))
#define VERTEX_ACTIVE (1 << 0)
#define VERTEX_SELECTED (1 << 1)
+#define VERTEX_EXISTS (1 << 2)
+
+#define FACE_ACTIVE (1 << 3)
+#define FACE_SELECTED (1 << 4)
+#define FACE_FREESTYLE (1 << 5)
uniform bool doEdges = true;
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl
index 068dc3369fb..eb68eb9b0dc 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl
@@ -7,9 +7,9 @@ in ivec4 data;
flat out vec4 faceColor;
-#define FACE_ACTIVE (1 << 2)
-#define FACE_SELECTED (1 << 3)
-#define FACE_FREESTYLE (1 << 4)
+#define FACE_ACTIVE (1 << 3)
+#define FACE_SELECTED (1 << 4)
+#define FACE_FREESTYLE (1 << 5)
void main()
{
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
index 7f985cd2c43..31cebc84461 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
@@ -2,13 +2,6 @@
/* Solid Wirefram implementation
* Mike Erwin, Clément Foucault */
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
-/* This is not perfect. Only a subset of intel gpus are affected.
- * This fix have some performance impact.
- * TODO Refine the range to only affect GPUs. */
-
uniform float faceAlphaMod;
uniform float edgeScale;
@@ -23,12 +16,12 @@ in vec3 vertexColor;
in float facing;
#endif
-flat in vec2 ssPos[3];
+in vec3 barycentric;
out vec4 FragColor;
/* Vertex flag is shifted and combined with the edge flag */
-#define FACE_ACTIVE (1 << (2 + 8))
+#define FACE_ACTIVE_ (FACE_ACTIVE << 8)
#define LARGE_EDGE_SIZE 3.0
@@ -61,12 +54,15 @@ void colorDistEdge(vec4 color, float dist)
void main()
{
- vec3 e, p;
-
/* Step 1 : Computing Distances */
- distToEdgeAndPoint((ssPos[1] - ssPos[0]) + 1e-8, ssPos[0], e.z, p.x);
- distToEdgeAndPoint((ssPos[2] - ssPos[1]) + 1e-8, ssPos[1], e.x, p.y);
- distToEdgeAndPoint((ssPos[0] - ssPos[2]) + 1e-8, ssPos[2], e.y, p.z);
+ vec3 dx = dFdx(barycentric);
+ vec3 dy = dFdy(barycentric);
+ vec3 d = vec3(
+ length(vec2(dx.x, dy.x)),
+ length(vec2(dx.y, dy.y)),
+ length(vec2(dx.z, dy.z))
+ );
+ vec3 e = abs(vec3(barycentric / d));
/* Step 2 : coloring (order dependent) */
@@ -82,7 +78,7 @@ void main()
/* Outer large edge */
float largeEdge = e[v] - sizeEdgeFinal * LARGE_EDGE_SIZE;
- vec4 large_edge_color = EDIT_MESH_edge_color_outer(flag[v], (flag[0]& FACE_ACTIVE) != 0, edgesCrease[v], edgesBweight[v]);
+ vec4 large_edge_color = EDIT_MESH_edge_color_outer(flag[v], (flag[0] & FACE_ACTIVE_) != 0, edgesCrease[v], edgesBweight[v]);
if (large_edge_color.a != 0.0) {
colorDistEdge(large_edge_color, largeEdge);
@@ -97,29 +93,35 @@ void main()
#ifdef VERTEX_SELECTION
colorDistEdge(vec4(vertexColor, 1.0), innerEdge);
#else
- vec4 inner_edge_color = EDIT_MESH_edge_color_inner(flag[v], (flag[0]& FACE_ACTIVE) != 0);
+ vec4 inner_edge_color = EDIT_MESH_edge_color_inner(flag[v], (flag[0] & FACE_ACTIVE_) != 0);
colorDistEdge(inner_edge_color, innerEdge);
#endif
}
}
+#if 0
/* Points */
#ifdef VERTEX_SELECTION
for (int v = 0; v < 3; ++v) {
- float size = p[v] - sizeVertex;
+ if ((flag[v] & EDGE_VERTEX_EXISTS) == 0) {
+ /* Leave as-is, no vertex. */
+ }
+ else {
+ float size = p[v] - sizeVertex;
- vec4 point_color = colorVertex;
- point_color = ((flag[v] & EDGE_VERTEX_SELECTED) != 0) ? colorVertexSelect : point_color;
- point_color = ((flag[v] & EDGE_VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : point_color;
+ vec4 point_color = colorVertex;
+ point_color = ((flag[v] & EDGE_VERTEX_SELECTED) != 0) ? colorVertexSelect : point_color;
+ point_color = ((flag[v] & EDGE_VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : point_color;
- colorDist(point_color, size);
+ colorDist(point_color, size);
+ }
}
#endif
+#endif
#ifdef VERTEX_FACING
FragColor.a *= 1.0 - abs(facing) * 0.4;
#endif
-
/* don't write depth if not opaque */
if (FragColor.a == 0.0) discard;
}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
index 88cb6c07a94..0368f170cb1 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
@@ -2,11 +2,8 @@
/* Solid Wirefram implementation
* Mike Erwin, Clément Foucault */
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
layout(lines) in;
-layout(triangle_strip, max_vertices=6) out;
+layout(triangle_strip, max_vertices=4) out;
uniform mat4 ProjectionMatrix;
uniform vec2 viewportSize;
@@ -24,6 +21,7 @@ flat out vec3 edgesCrease;
flat out vec3 edgesBweight;
flat out vec4 faceColor;
flat out ivec3 flag;
+out vec3 barycentric;
#ifdef VERTEX_SELECTION
out vec3 vertexColor;
#endif
@@ -34,9 +32,6 @@ out float facing;
/* See fragment shader */
flat out vec2 ssPos[3];
-#define FACE_ACTIVE (1 << 2)
-#define FACE_SELECTED (1 << 3)
-
/* project to screen space */
vec2 proj(vec4 pos)
{
@@ -94,20 +89,21 @@ void main()
ssPos[1] = pos[1];
flag[0] = flag[2] = (vData[0].x << 8);
flag[1] = (vData[1].x << 8);
-
- doVertex(0, pPos[0] + vec4(-dirs1.xy, 0.0, 0.0));
+ barycentric = vec3(1.0);
doVertex(0, pPos[0] + vec4( dirs1.zw, 0.0, 0.0));
+
+ barycentric[2] = -1.0;
doVertex(0, pPos[0] + vec4(-dirs1.zw, 0.0, 0.0));
flag[2] |= vData[0].y;
edgesCrease[2] = vData[0].z / 255.0;
edgesBweight[2] = vData[0].w / 255.0;
+ barycentric = vec3(1.0);
doVertex(1, pPos[1] + vec4( dirs2.zw, 0.0, 0.0));
- doVertex(1, pPos[1] + vec4(-dirs2.zw, 0.0, 0.0));
- flag[2] = 0;
- doVertex(1, pPos[1] + vec4( dirs2.xy, 0.0, 0.0));
+ barycentric[2] = -1.0;
+ doVertex(1, pPos[1] + vec4(-dirs2.zw, 0.0, 0.0));
EndPrimitive();
}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
index 7d6c64afabc..94b16ee02fa 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
@@ -2,30 +2,14 @@
/* Solid Wirefram implementation
* Mike Erwin, Clément Foucault */
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
layout(triangles) in;
-/* This is not perfect. Only a subset of intel gpus are affected.
- * This fix have some performance impact.
- * TODO Refine the range to only affect GPUs. */
-
-#ifdef EDGE_FIX
/* To fix the edge artifacts, we render
* an outline strip around the screenspace
* triangle. Order is important.
* TODO diagram
*/
-
-#ifdef VERTEX_SELECTION
-layout(triangle_strip, max_vertices=23) out;
-#else
-layout(triangle_strip, max_vertices=17) out;
-#endif
-#else
-layout(triangle_strip, max_vertices=3) out;
-#endif
+layout(triangle_strip, max_vertices=15) out;
uniform mat4 ProjectionMatrix;
uniform vec2 viewportSize;
@@ -43,7 +27,8 @@ flat out vec3 edgesCrease;
flat out vec3 edgesBweight;
flat out vec4 faceColor;
flat out ivec3 flag;
-flat out int clipCase;
+
+out vec3 barycentric;
#ifdef VERTEX_SELECTION
out vec3 vertexColor;
#endif
@@ -51,13 +36,6 @@ out vec3 vertexColor;
out float facing;
#endif
-/* See fragment shader */
-flat out vec2 ssPos[3];
-
-#define FACE_ACTIVE (1 << 2)
-#define FACE_SELECTED (1 << 3)
-#define FACE_FREESTYLE (1 << 4)
-
/* project to screen space */
vec2 proj(vec4 pos)
{
@@ -73,8 +51,9 @@ void doVertex(int v)
#ifdef VERTEX_FACING
facing = vFacing[v];
#endif
-
gl_Position = pPos[v];
+ barycentric = vec3(0.0);
+ barycentric[v % 3] = 1.0;
EmitVertex();
}
@@ -84,6 +63,7 @@ void doLoopStrip(int v, vec3 offset)
doVertex(v);
gl_Position.xyz += offset;
+ barycentric = vec3(1.0);
EmitVertex();
}
@@ -115,6 +95,7 @@ void main()
faceColor = colorFace;
/* Vertex */
+ vec2 ssPos[3];
ssPos[0] = proj(pPos[0]);
ssPos[1] = proj(pPos[1]);
ssPos[2] = proj(pPos[2]);
@@ -123,10 +104,10 @@ void main()
doVertex(1);
doVertex(2);
-#ifdef EDGE_FIX
+ EndPrimitive();
+
vec2 fixvec[6];
vec2 fixvecaf[6];
- vec2 cornervec[3];
/* This fix the case when 2 vertices are perfectly aligned
* and corner vectors have nowhere to go.
@@ -150,8 +131,6 @@ void main()
vec2 dir = normalize(v2 - v1);
vec2 dir2 = normalize(v3 - v1);
- cornervec[i] = -normalize(dir + dir2);
-
/* perpendicular to dir */
vec2 perp = vec2(-dir.y, dir.x);
@@ -162,7 +141,6 @@ void main()
/* Make it view independent */
perp *= sizeEdgeFix / viewportSize;
- cornervec[i] *= sizeEdgeFix / viewportSize;
fixvec[i] = fixvecaf[i] = perp;
/* Perspective */
@@ -171,7 +149,6 @@ void main()
* our fixvec to be flipped */
fixvec[i] *= -vPos[i].z;
fixvecaf[i] *= -vPos[i1].z;
- cornervec[i] *= -vPos[i].z;
}
}
@@ -195,16 +172,6 @@ void main()
flag[v] &= ~EDGE_EXISTS;
doLoopStrip(vaf, vec3(fixvecaf[v], Z_OFFSET));
- /* corner vertices should not draw edges but draw point only */
- flag[vbe] &= ~EDGE_EXISTS;
-#ifdef VERTEX_SELECTION
- doLoopStrip(vaf, vec3(cornervec[vaf], Z_OFFSET));
-#endif
+ EndPrimitive();
}
-
- /* finish the loop strip */
- doLoopStrip(2, vec3(fixvec[2], Z_OFFSET));
-#endif
-
- EndPrimitive();
}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl
deleted file mode 100644
index 13d824c2410..00000000000
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl
+++ /dev/null
@@ -1,52 +0,0 @@
-
-/* Solid Wirefram implementation
- * Mike Erwin, Clément Foucault */
-
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
-uniform mat4 ModelViewProjectionMatrix;
-uniform vec2 viewportSize;
-
-in vec3 pos;
-in ivec4 data;
-
-/* these are the same for all vertices
- * and does not need interpolation */
-flat out vec3 edgesCrease;
-flat out vec3 edgesBweight;
-flat out vec4 faceColor;
-flat out ivec3 flag;
-#ifdef VERTEX_SELECTION
-out vec3 vertexColor;
-#endif
-
-/* See fragment shader */
-flat out vec2 ssPos[3];
-
-/* project to screen space */
-vec2 proj(vec4 pos)
-{
- return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize;
-}
-
-void main()
-{
- edgesCrease = vec3(0.0);
- edgesBweight = vec3(0.0);
-
- vec4 pPos = ModelViewProjectionMatrix * vec4(pos, 1.0);
-
- /* there is no face */
- faceColor = vec4(0.0);
-
-#ifdef VERTEX_SELECTION
- vertexColor = vec3(0.0);
-#endif
-
- ssPos[0] = ssPos[1] = ssPos[2] = proj(pPos);
- flag[0] = flag[1] = flag[2] = (data.x << 8);
-
- gl_PointSize = sizeEdgeFix;
- gl_Position = pPos;
-}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl
new file mode 100644
index 00000000000..484a017e171
--- /dev/null
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl
@@ -0,0 +1,41 @@
+
+uniform mat3 NormalMatrix;
+uniform mat4 ProjectionMatrix;
+uniform mat4 ModelViewMatrix;
+uniform mat4 ModelViewProjectionMatrix;
+uniform float ofs = 5e-5;
+
+in vec3 pos;
+in ivec4 data;
+#ifdef VERTEX_FACING
+in vec3 vnor;
+#endif
+
+out vec4 finalColor;
+
+void main()
+{
+ finalColor = colorVertex;
+ finalColor = ((data.x & VERTEX_SELECTED) != 0) ? colorVertexSelect : finalColor;
+ finalColor = ((data.x & VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : finalColor;
+
+ gl_PointSize = sizeVertex * 2.0;
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ gl_Position -= ofs;
+
+#ifdef VERTEX_FACING
+ vec4 vPos = ModelViewMatrix * vec4(pos, 1.0);
+ vec3 view_normal = normalize(NormalMatrix * vnor);
+ vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
+ ? normalize(vPos.xyz)
+ : vec3(0.0, 0.0, 1.0);
+ float facing = dot(view_vec, view_normal);
+
+ finalColor.a *= 1.0 - abs(facing) * 0.4;
+#endif
+
+ if ((data.x & VERTEX_EXISTS) == 0) {
+ gl_Position = vec4(0.0);
+ gl_PointSize = 0.0;
+ }
+}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
index 7cab2a5035f..8715ab69181 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
@@ -2,38 +2,103 @@
/* Solid Wirefram implementation
* Mike Erwin, Clément Foucault */
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
+uniform mat3 NormalMatrix;
+uniform mat4 ProjectionMatrix;
uniform mat4 ModelViewMatrix;
uniform mat4 ModelViewProjectionMatrix;
uniform ivec4 dataMask = ivec4(0xFF);
+uniform float ofs = 1e-5;
+
+uniform isamplerBuffer dataBuffer;
+
in vec3 pos;
+#ifdef VERTEX_FACING
+in vec3 vnor;
+#endif
+
+#ifdef EDGE_FIX
in ivec4 data;
out vec4 vPos;
out vec4 pPos;
out ivec4 vData;
-
-#ifdef VERTEX_FACING
-uniform mat4 ProjectionMatrix;
-uniform mat3 NormalMatrix;
-
-in vec3 vnor;
+# ifdef VERTEX_FACING
out float vFacing;
-#endif
+# endif
void main()
{
vPos = ModelViewMatrix * vec4(pos, 1.0);
pPos = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ pPos.z -= ofs;
vData = data & dataMask;
-#ifdef VERTEX_FACING
+# ifdef VERTEX_FACING
vec3 view_normal = normalize(NormalMatrix * vnor);
vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
? normalize(vPos.xyz)
: vec3(0.0, 0.0, 1.0);
vFacing = dot(view_vec, view_normal);
-#endif
+# endif
}
+
+#else /* EDGE_FIX */
+
+flat out vec3 edgesCrease;
+flat out vec3 edgesBweight;
+flat out vec4 faceColor;
+flat out ivec3 flag;
+# ifdef VERTEX_SELECTION
+out vec3 vertexColor;
+# endif
+# ifdef VERTEX_FACING
+out float facing;
+# endif
+
+out vec3 barycentric;
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ gl_Position.z -= ofs;
+
+ int v_0 = (gl_VertexID / 3) * 3;
+ int vidx = gl_VertexID % 3;
+ barycentric = vec3(0.0);
+ barycentric[vidx] = 1.0;
+
+ /* Edge */
+ ivec4 vData[3], data = ivec4(0);
+ ivec3 eflag;
+ for (int v = 0; v < 3; ++v) {
+ data = texelFetch(dataBuffer, v_0 + v);
+ vData[v] = data & dataMask;
+ flag[v] = eflag[v] = vData[v].y | (vData[v].x << 8);
+ edgesCrease[v] = vData[v].z / 255.0;
+ edgesBweight[v] = vData[v].w / 255.0;
+ }
+
+ /* Face */
+ if ((vData[0].x & FACE_ACTIVE) != 0)
+ faceColor = colorFaceSelect;
+ else if ((vData[0].x & FACE_SELECTED) != 0)
+ faceColor = colorFaceSelect;
+ else if ((vData[0].x & FACE_FREESTYLE) != 0)
+ faceColor = colorFaceFreestyle;
+ else
+ faceColor = colorFace;
+
+# ifdef VERTEX_SELECTION
+ vertexColor = EDIT_MESH_vertex_color(vData[vidx].x).rgb;
+# endif
+# ifdef VERTEX_FACING
+ vec4 vPos = ModelViewMatrix * vec4(pos, 1.0);
+ vec3 view_normal = normalize(NormalMatrix * vnor);
+ vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
+ ? normalize(vPos.xyz)
+ : vec3(0.0, 0.0, 1.0);
+ facing = dot(view_vec, view_normal);
+# endif
+}
+
+#endif \ No newline at end of file
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
index ca41ed1ac6c..75bfe04aa8b 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
@@ -2,10 +2,8 @@
uniform vec3 wireColor;
uniform vec3 rimColor;
-flat in vec3 ssVec0;
-flat in vec3 ssVec1;
-flat in vec3 ssVec2;
in float facing;
+in vec3 barycentric;
# ifdef LIGHT_EDGES
flat in vec3 edgeSharpness;
@@ -28,12 +26,14 @@ const float rim_alpha = 0.75;
void main()
{
#ifndef SELECT_EDGES
- vec3 ss_pos = vec3(gl_FragCoord.xy, 1.0);
- vec3 dist_to_edge = vec3(
- dot(ss_pos, ssVec0),
- dot(ss_pos, ssVec1),
- dot(ss_pos, ssVec2)
+ vec3 dx = dFdx(barycentric);
+ vec3 dy = dFdy(barycentric);
+ vec3 d = vec3(
+ length(vec2(dx.x, dy.x)),
+ length(vec2(dx.y, dy.y)),
+ length(vec2(dx.z, dy.z))
);
+ vec3 dist_to_edge = barycentric / d;
# ifdef LIGHT_EDGES
vec3 fac = abs(dist_to_edge);
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
index a508b59b9f0..742bcab80c0 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
@@ -15,9 +15,7 @@ in vec2 ssPos[];
in float facingOut[];
#ifndef SELECT_EDGES
-flat out vec3 ssVec0;
-flat out vec3 ssVec1;
-flat out vec3 ssVec2;
+out vec3 barycentric;
out float facing;
#endif
@@ -33,14 +31,6 @@ flat out vec3 edgeSharpness;
#define NO_EDGE vec3(10000.0);
-/* TODO(fclem) remove code duplication. */
-vec3 compute_vec(vec2 v0, vec2 v1)
-{
- vec2 v = normalize(v1 - v0);
- v = vec2(-v.y, v.x);
- return vec3(v, -dot(v, v0));
-}
-
vec3 get_edge_normal(vec3 n1, vec3 n2, vec3 edge)
{
edge = normalize(edge);
@@ -55,17 +45,25 @@ float get_edge_sharpness(vec3 fnor, vec3 vnor)
return smoothstep(wireStepParam.x, wireStepParam.y, sharpness);
}
+vec3 get_barycentric(bvec3 do_edge, const int v)
+{
+ int v_n = v;
+ int v_n1 = (v + 1) % 3;
+ int v_n2 = (v + 2) % 3;
+ vec3 barycentric;
+ barycentric[v_n] = do_edge[v_n] ? 0.0 : 1.0;
+ barycentric[v_n1] = 1.0;
+ barycentric[v_n2] = do_edge[v_n2] ? 0.0 : 1.0;
+ return barycentric;
+}
+
void main(void)
{
vec3 facings = vec3(facingOut[0], facingOut[1], facingOut[2]);
bvec3 do_edge = greaterThan(abs(facings), vec3(1.0));
facings = fract(facings) - clamp(-sign(facings), 0.0, 1.0);
-#ifndef SELECT_EDGES
- ssVec0 = do_edge.x ? compute_vec(ssPos[0], ssPos[1]) : NO_EDGE;
- ssVec1 = do_edge.y ? compute_vec(ssPos[1], ssPos[2]) : NO_EDGE;
- ssVec2 = do_edge.z ? compute_vec(ssPos[2], ssPos[0]) : NO_EDGE;
-#else
+#ifdef SELECT_EDGES
vec3 edgeSharpness;
#endif
@@ -110,15 +108,17 @@ void main(void)
EndPrimitive();
}
#else
-
+ barycentric = get_barycentric(do_edge, 0);
gl_Position = gl_in[0].gl_Position;
facing = facings.x;
EmitVertex();
+ barycentric = get_barycentric(do_edge, 1);
gl_Position = gl_in[1].gl_Position;
facing = facings.y;
EmitVertex();
+ barycentric = get_barycentric(do_edge, 2);
gl_Position = gl_in[2].gl_Position;
facing = facings.z;
EmitVertex();
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
index 5016ceed09e..460bed14a8b 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
@@ -16,39 +16,6 @@ in vec3 pos;
in vec3 nor;
#endif
-#ifdef USE_GEOM_SHADER
-out vec2 ssPos;
-out float facingOut; /* abs(facing) > 1.0 if we do edge */
-#else
-flat out vec3 ssVec0;
-flat out vec3 ssVec1;
-flat out vec3 ssVec2;
-out float facing;
-#endif
-
-#ifdef LIGHT_EDGES
-# ifdef USE_GEOM_SHADER
-out vec3 obPos;
-out vec3 vNor;
-out float forceEdge;
-# else
-flat out vec3 edgeSharpness;
-# endif
-#endif
-
-/* project to screen space */
-vec2 proj(vec4 pos)
-{
- return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize;
-}
-
-vec3 compute_vec(vec2 v0, vec2 v1)
-{
- vec2 v = normalize(v1 - v0);
- v = vec2(-v.y, v.x);
- return vec3(v, -dot(v, v0));
-}
-
float short_to_unit_float(uint s)
{
int value = int(s) & 0x7FFF;
@@ -99,12 +66,18 @@ float get_edge_sharpness(vec3 fnor, vec3 vnor)
return smoothstep(wireStepParam.x, wireStepParam.y, sharpness);
}
-#define NO_EDGE vec3(10000.0);
+#ifdef USE_GEOM_SHADER
+
+# ifdef LIGHT_EDGES
+out vec3 obPos;
+out vec3 vNor;
+out float forceEdge;
+# endif
+out float facingOut; /* abs(facing) > 1.0 if we do edge */
void main()
{
-#ifdef USE_GEOM_SHADER
-#ifndef USE_SCULPT
+# ifndef USE_SCULPT
uint v_id = texelFetch(faceIds, gl_VertexID).r;
bool do_edge = (v_id & (1u << 30u)) != 0u;
@@ -113,26 +86,37 @@ void main()
vec3 pos = get_vertex_pos(v_id);
vec3 nor = get_vertex_nor(v_id);
-#else
+# else
const bool do_edge = true;
const bool force_edge = false;
-#endif
+# endif
facingOut = normalize(NormalMatrix * nor).z;
facingOut += (do_edge) ? ((facingOut > 0.0) ? 2.0 : -2.0) : 0.0;
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
- ssPos = proj(gl_Position);
# ifdef LIGHT_EDGES
obPos = pos;
vNor = nor;
forceEdge = float(force_edge); /* meh, could try to also encode it in facingOut */
# endif
+}
+
+#else /* USE_GEOM_SHADER */
-#else
+# ifdef LIGHT_EDGES
+flat out vec3 edgeSharpness;
+# endif
+out float facing;
+out vec3 barycentric;
+
+void main()
+{
int v_0 = (gl_VertexID / 3) * 3;
int v_n = gl_VertexID % 3;
+ int v_n1 = (gl_VertexID + 1) % 3;
+ int v_n2 = (gl_VertexID + 2) % 3;
/* Getting the same positions for each of the 3 verts. */
uvec3 v_id;
@@ -150,30 +134,24 @@ void main()
v_id = (v_id << 2u) >> 2u;
vec3 pos[3];
- pos[0] = get_vertex_pos(v_id.x);
- pos[1] = get_vertex_pos(v_id.y);
- pos[2] = get_vertex_pos(v_id.z);
-
vec4 p_pos[3];
- p_pos[0] = ModelViewProjectionMatrix * vec4(pos[0], 1.0);
- p_pos[1] = ModelViewProjectionMatrix * vec4(pos[1], 1.0);
- p_pos[2] = ModelViewProjectionMatrix * vec4(pos[2], 1.0);
-
- vec2 ss_pos[3];
- ss_pos[0] = proj(p_pos[0]);
- ss_pos[1] = proj(p_pos[1]);
- ss_pos[2] = proj(p_pos[2]);
- /* Compute the edges screen vectors */
- ssVec0 = do_edge.x ? compute_vec(ss_pos[0], ss_pos[1]) : NO_EDGE;
- ssVec1 = do_edge.y ? compute_vec(ss_pos[1], ss_pos[2]) : NO_EDGE;
- ssVec2 = do_edge.z ? compute_vec(ss_pos[2], ss_pos[0]) : NO_EDGE;
+ pos[v_n] = get_vertex_pos(v_id[v_n]);
+ gl_Position = p_pos[v_n] = ModelViewProjectionMatrix * vec4(pos[v_n], 1.0);
- gl_Position = p_pos[v_n];
+ barycentric[v_n] = do_edge[v_n] ? 0.0 : 1.0;
+ barycentric[v_n1] = 1.0;
+ barycentric[v_n2] = do_edge[v_n2] ? 0.0 : 1.0;
# ifndef LIGHT_EDGES
vec3 nor = get_vertex_nor(v_id[v_n]);
# else
+ p_pos[v_n1] = ModelViewProjectionMatrix * vec4(pos[v_n1], 1.0);
+ p_pos[v_n2] = ModelViewProjectionMatrix * vec4(pos[v_n2], 1.0);
+
+ pos[v_n1] = get_vertex_pos(v_id[v_n1]);
+ pos[v_n2] = get_vertex_pos(v_id[v_n2]);
+
vec3 edges[3];
edges[0] = pos[1] - pos[0];
edges[1] = pos[2] - pos[1];
@@ -195,6 +173,6 @@ void main()
# endif
facing = normalize(NormalMatrix * nor).z;
-
-#endif
}
+
+#endif /* USE_GEOM_SHADER */
diff --git a/source/blender/draw/modes/shaders/paint_weight_frag.glsl b/source/blender/draw/modes/shaders/paint_weight_frag.glsl
index bb0834e9cd4..faa36f5535e 100644
--- a/source/blender/draw/modes/shaders/paint_weight_frag.glsl
+++ b/source/blender/draw/modes/shaders/paint_weight_frag.glsl
@@ -6,13 +6,71 @@ out vec4 fragColor;
uniform float opacity = 1.0;
uniform sampler1D colorramp;
+uniform bool drawContours = false;
+
+float contours(float value, float steps, float width_px, float max_rel_width, float gradient)
+{
+ /* Minimum visible and minimum full strength line width in screen space for fade out. */
+ const float min_width_px = 1.3, fade_width_px = 2.3;
+ /* Line is thinner towards the increase in the weight gradient by this factor. */
+ const float hi_bias = 2.0;
+
+ /* Don't draw lines at 0 or 1. */
+ float rel_value = value * steps;
+
+ if (rel_value < 0.5 || rel_value > steps - 0.5)
+ return 0.0;
+
+ /* Check if completely invisible due to fade out. */
+ float rel_gradient = gradient * steps;
+ float rel_min_width = min_width_px * rel_gradient;
+
+ if (max_rel_width <= rel_min_width)
+ return 0.0;
+
+ /* Main shape of the line, accounting for width bias and maximum weight space width. */
+ float rel_width = width_px * rel_gradient;
+
+ float offset = fract(rel_value + 0.5) - 0.5;
+
+ float base_alpha = 1.0 - max(offset * hi_bias, -offset) / min(max_rel_width, rel_width);
+
+ /* Line fadeout when too thin in screen space. */
+ float rel_fade_width = fade_width_px * rel_gradient;
+
+ float fade_alpha = (max_rel_width - rel_min_width) / (rel_fade_width - rel_min_width);
+
+ return clamp(base_alpha, 0.0, 1.0) * clamp(fade_alpha, 0.0, 1.0);
+}
+
+vec4 contour_grid(float weight, float weight_gradient)
+{
+ /* Fade away when the gradient is too low to avoid big fills and noise. */
+ float flt_eps = max(1e-8, 1e-6 * weight);
+
+ if (weight_gradient <= flt_eps)
+ return vec4(0.0);
+
+ /* Three levels of grid lines */
+ float grid10 = contours(weight, 10.0, 5.0, 0.3, weight_gradient);
+ float grid100 = contours(weight, 100.0, 3.5, 0.35, weight_gradient) * 0.6;
+ float grid1000 = contours(weight, 1000.0, 2.5, 0.4, weight_gradient) * 0.25;
+
+ /* White lines for 0.1 and 0.01, and black for 0.001 */
+ vec4 grid = vec4(1.0) * max(grid10, grid100);
+
+ grid.a = max(grid.a, grid1000);
+
+ return grid * clamp((weight_gradient - flt_eps) / flt_eps, 0.0, 1.0);
+}
+
void main()
{
float alert = weight_interp.y;
vec4 color;
- /* Missing vertex group alert color */
- if (alert > 1.0) {
+ /* Missing vertex group alert color. Uniform in practice. */
+ if (alert > 1.1) {
color = colorVertexMissingData;
}
/* Weights are available */
@@ -20,6 +78,16 @@ void main()
float weight = weight_interp.x;
vec4 weight_color = texture(colorramp, weight, 0);
+ /* Contour display */
+ if (drawContours) {
+ /* This must be executed uniformly for all fragments */
+ float weight_gradient = length(vec2(dFdx(weight), dFdy(weight)));
+
+ vec4 grid = contour_grid(weight, weight_gradient);
+
+ weight_color = grid + weight_color * (1 - grid.a);
+ }
+
/* Zero weight alert color. Nonlinear blend to reduce impact. */
color = mix(weight_color, colorVertexUnreferenced, alert * alert);
}
diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c
index a8b63e01ac1..1941e98b865 100644
--- a/source/blender/editors/animation/keyframes_draw.c
+++ b/source/blender/editors/animation/keyframes_draw.c
@@ -332,8 +332,15 @@ static void add_bezt_to_keyblocks_list(DLRBT_Tree *blocks, BezTriple *first_bezt
*/
if (IS_EQF(beztn->vec[1][1], prev->vec[1][1]) == 0) return;
- if (IS_EQF(beztn->vec[1][1], beztn->vec[0][1]) == 0) return;
- if (IS_EQF(prev->vec[1][1], prev->vec[2][1]) == 0) return;
+ /* Only check handles in case of actual bezier interpolation. */
+ if (prev->ipo == BEZT_IPO_BEZ) {
+ if (IS_EQF(beztn->vec[1][1], beztn->vec[0][1]) == 0) return;
+ if (IS_EQF(prev->vec[1][1], prev->vec[2][1]) == 0) return;
+ }
+ /* This interpolation type induces movement even between identical keys. */
+ else if (ELEM(prev->ipo, BEZT_IPO_ELASTIC)) {
+ return;
+ }
}
/* if there are no blocks already, just add as root */
@@ -552,9 +559,9 @@ void draw_keyframe_shape(float x, float y, float size, bool sel, short key_type,
}
}
- immAttrib1f(size_id, size);
- immAttrib4ubv(color_id, fill_col);
- immAttrib4ubv(outline_color_id, outline_col);
+ immAttr1f(size_id, size);
+ immAttr4ubv(color_id, fill_col);
+ immAttr4ubv(outline_color_id, outline_col);
immVertex2f(pos_id, x, y);
}
diff --git a/source/blender/editors/armature/armature_add.c b/source/blender/editors/armature/armature_add.c
index ee9ef9debaf..5ed3fb67ec2 100644
--- a/source/blender/editors/armature/armature_add.c
+++ b/source/blender/editors/armature/armature_add.c
@@ -869,7 +869,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op)
{
ViewLayer *view_layer = CTX_data_view_layer(C);
const bool forked = RNA_boolean_get(op->ptr, "forked");
- bool multi_changed = false;
+ bool changed_multi = false;
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
@@ -1019,7 +1019,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op)
continue;
}
- multi_changed = true;
+ changed_multi = true;
/* Transform the endpoints */
ED_armature_edit_sync_selection(arm->edbo);
@@ -1028,7 +1028,7 @@ static int armature_extrude_exec(bContext *C, wmOperator *op)
}
MEM_freeN(objects);
- return multi_changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+ return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
void ARMATURE_OT_extrude(wmOperatorType *ot)
diff --git a/source/blender/editors/armature/armature_edit.c b/source/blender/editors/armature/armature_edit.c
index 16e5450423b..d3aa451fa6e 100644
--- a/source/blender/editors/armature/armature_edit.c
+++ b/source/blender/editors/armature/armature_edit.c
@@ -1618,28 +1618,39 @@ void ARMATURE_OT_dissolve(wmOperatorType *ot)
static int armature_hide_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- bArmature *arm = obedit->data;
- EditBone *ebone;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
const int invert = RNA_boolean_get(op->ptr, "unselected") ? BONE_SELECTED : 0;
/* cancel if nothing selected */
if (CTX_DATA_COUNT(C, selected_bones) == 0)
return OPERATOR_CANCELLED;
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (EBONE_VISIBLE(arm, ebone)) {
- if ((ebone->flag & BONE_SELECTED) != invert) {
- ebone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
- ebone->flag |= BONE_HIDDEN_A;
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ bArmature *arm = obedit->data;
+ bool changed = false;
+
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (EBONE_VISIBLE(arm, ebone)) {
+ if ((ebone->flag & BONE_SELECTED) != invert) {
+ ebone->flag &= ~(BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL);
+ ebone->flag |= BONE_HIDDEN_A;
+ changed = true;
+ }
}
}
- }
- ED_armature_edit_validate_active(arm);
- ED_armature_edit_sync_selection(arm->edbo);
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ if (!changed) {
+ continue;
+ }
+ ED_armature_edit_validate_active(arm);
+ ED_armature_edit_sync_selection(arm->edbo);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
@@ -1663,26 +1674,35 @@ void ARMATURE_OT_hide(wmOperatorType *ot)
static int armature_reveal_exec(bContext *C, wmOperator *op)
{
- Object *obedit = CTX_data_edit_object(C);
- bArmature *arm = obedit->data;
- EditBone *ebone;
+ ViewLayer *view_layer = CTX_data_view_layer(C);
const bool select = RNA_boolean_get(op->ptr, "select");
+ uint objects_len = 0;
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+ Object *obedit = objects[ob_index];
+ bArmature *arm = obedit->data;
+ bool changed = false;
- for (ebone = arm->edbo->first; ebone; ebone = ebone->next) {
- if (arm->layer & ebone->layer) {
- if (ebone->flag & BONE_HIDDEN_A) {
- if (!(ebone->flag & BONE_UNSELECTABLE)) {
- SET_FLAG_FROM_TEST(ebone->flag, select, (BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL));
+ for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
+ if (arm->layer & ebone->layer) {
+ if (ebone->flag & BONE_HIDDEN_A) {
+ if (!(ebone->flag & BONE_UNSELECTABLE)) {
+ SET_FLAG_FROM_TEST(ebone->flag, select, (BONE_TIPSEL | BONE_SELECTED | BONE_ROOTSEL));
+ }
+ ebone->flag &= ~BONE_HIDDEN_A;
+ changed = true;
}
- ebone->flag &= ~BONE_HIDDEN_A;
}
}
- }
- ED_armature_edit_validate_active(arm);
- ED_armature_edit_sync_selection(arm->edbo);
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ if (changed) {
+ ED_armature_edit_validate_active(arm);
+ ED_armature_edit_sync_selection(arm->edbo);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, obedit);
+ }
+ }
+ MEM_freeN(objects);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/armature/armature_naming.c b/source/blender/editors/armature/armature_naming.c
index 15247399401..3d5ed47655c 100644
--- a/source/blender/editors/armature/armature_naming.c
+++ b/source/blender/editors/armature/armature_naming.c
@@ -487,7 +487,7 @@ static int armature_autoside_names_exec(bContext *C, wmOperator *op)
Main *bmain = CTX_data_main(C);
char newname[MAXBONENAME];
const short axis = RNA_enum_get(op->ptr, "type");
- bool multi_changed = false;
+ bool changed_multi = false;
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
@@ -529,7 +529,7 @@ static int armature_autoside_names_exec(bContext *C, wmOperator *op)
continue;
}
- multi_changed = true;
+ changed_multi = true;
/* Since we renamed stuff... */
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
@@ -538,7 +538,7 @@ static int armature_autoside_names_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
}
MEM_freeN(objects);
- return multi_changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+ return changed_multi ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
}
void ARMATURE_OT_autoside_names(wmOperatorType *ot)
diff --git a/source/blender/editors/armature/armature_select.c b/source/blender/editors/armature/armature_select.c
index 15ccc24ebe2..b47416b5d5f 100644
--- a/source/blender/editors/armature/armature_select.c
+++ b/source/blender/editors/armature/armature_select.c
@@ -288,16 +288,15 @@ void *get_nearest_bone(
/* called in space.c */
/* previously "selectconnected_armature" */
-static int armature_select_linked_invoke(bContext *C, wmOperator *op, const wmEvent *event)
+static int armature_select_linked_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
{
bArmature *arm;
EditBone *bone, *curBone, *next;
- const bool extend = RNA_boolean_get(op->ptr, "extend");
view3d_operator_needs_opengl(C);
Base *base = NULL;
- bone = get_nearest_bone(C, event->mval, !extend, &base);
+ bone = get_nearest_bone(C, event->mval, true, &base);
if (!bone)
return OPERATOR_CANCELLED;
@@ -307,12 +306,7 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, const wmEv
/* Select parents */
for (curBone = bone; curBone; curBone = next) {
if ((curBone->flag & BONE_UNSELECTABLE) == 0) {
- if (extend) {
- curBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- }
- else {
- curBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- }
+ curBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
}
if (curBone->flag & BONE_CONNECTED)
@@ -327,10 +321,7 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, const wmEv
next = curBone->next;
if ((curBone->parent == bone) && (curBone->flag & BONE_UNSELECTABLE) == 0) {
if (curBone->flag & BONE_CONNECTED) {
- if (extend)
- curBone->flag &= ~(BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
- else
- curBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
+ curBone->flag |= (BONE_SELECTED | BONE_TIPSEL | BONE_ROOTSEL);
bone = curBone;
break;
}
@@ -370,9 +361,6 @@ void ARMATURE_OT_select_linked(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* properties */
- RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection instead of deselecting everything first");
}
/* utility function for get_nearest_editbonepoint */
@@ -902,7 +890,7 @@ static int armature_de_select_more_exec(bContext *C, wmOperator *UNUSED(op))
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * ob = objects[ob_index];
+ Object *ob = objects[ob_index];
armature_select_more_less(ob, true);
WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
}
@@ -931,7 +919,7 @@ static int armature_de_select_less_exec(bContext *C, wmOperator *UNUSED(op))
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * ob = objects[ob_index];
+ Object *ob = objects[ob_index];
armature_select_more_less(ob, false);
WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
}
@@ -1003,8 +991,8 @@ static void select_similar_length(bContext *C, const float thresh)
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * ob = objects[ob_index];
- bArmature * arm = ob->data;
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
bool changed = false;
for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
@@ -1051,8 +1039,8 @@ static void select_similar_direction(bContext *C, const float thresh)
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * ob = objects[ob_index];
- bArmature * arm = ob->data;
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
bool changed = false;
for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
@@ -1082,8 +1070,8 @@ static void select_similar_layer(bContext *C)
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * ob = objects[ob_index];
- bArmature * arm = ob->data;
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
bool changed = false;
for (EditBone *ebone = arm->edbo->first; ebone; ebone = ebone->next) {
@@ -1119,8 +1107,8 @@ static void select_similar_prefix(bContext *C)
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * ob = objects[ob_index];
- bArmature * arm = ob->data;
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
bool changed = false;
/* Find matches */
@@ -1158,8 +1146,8 @@ static void select_similar_suffix(bContext *C)
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * ob = objects[ob_index];
- bArmature * arm = ob->data;
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
bool changed = false;
/* Find matches */
@@ -1351,91 +1339,81 @@ void ARMATURE_OT_select_similar(wmOperatorType *ot)
/* ********************* select hierarchy operator ************** */
+/* No need to convert to multi-objects. Just like we keep the non-active bones
+ * selected we then keep the non-active objects untouched (selected/unselected). */
static int armature_select_hierarchy_exec(bContext *C, wmOperator *op)
{
- ViewLayer *view_layer = CTX_data_view_layer(C);
-
- const int direction = RNA_enum_get(op->ptr, "direction");
+ Object *ob = CTX_data_edit_object(C);
+ EditBone *ebone_active;
+ int direction = RNA_enum_get(op->ptr, "direction");
const bool add_to_sel = RNA_boolean_get(op->ptr, "extend");
+ bool changed = false;
+ bArmature *arm = (bArmature *)ob->data;
- bool multi_changed = false;
- uint objects_len = 0;
- Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
- for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * ob = objects[ob_index];
- bArmature * arm = ob->data;
-
- EditBone *ebone_active;
- bool changed = false;
-
- arm = (bArmature *)ob->data;
-
- ebone_active = arm->act_edbone;
- if (ebone_active == NULL) {
- continue;
- }
-
- if (direction == BONE_SELECT_PARENT) {
- if (ebone_active->parent) {
- EditBone *ebone_parent;
+ ebone_active = arm->act_edbone;
+ if (ebone_active == NULL) {
+ return OPERATOR_CANCELLED;
+ }
- ebone_parent = ebone_active->parent;
+ if (direction == BONE_SELECT_PARENT) {
+ if (ebone_active->parent) {
+ EditBone *ebone_parent;
- if (EBONE_SELECTABLE(arm, ebone_parent)) {
- arm->act_edbone = ebone_parent;
+ ebone_parent = ebone_active->parent;
- if (!add_to_sel) {
- ED_armature_ebone_select_set(ebone_active, false);
- }
- ED_armature_ebone_select_set(ebone_parent, true);
+ if (EBONE_SELECTABLE(arm, ebone_parent)) {
+ arm->act_edbone = ebone_parent;
- changed = true;
+ if (!add_to_sel) {
+ ED_armature_ebone_select_set(ebone_active, false);
}
- }
+ ED_armature_ebone_select_set(ebone_parent, true);
+ changed = true;
+ }
}
- else { /* BONE_SELECT_CHILD */
- EditBone *ebone_iter, *ebone_child = NULL;
- int pass;
-
- /* First pass, only connected bones (the logical direct child)/ */
- for (pass = 0; pass < 2 && (ebone_child == NULL); pass++) {
- for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
- /* Possible we have multiple children, some invisible. */
- if (EBONE_SELECTABLE(arm, ebone_iter)) {
- if (ebone_iter->parent == ebone_active) {
- if ((pass == 1) || (ebone_iter->flag & BONE_CONNECTED)) {
- ebone_child = ebone_iter;
- break;
- }
+
+ }
+ else { /* BONE_SELECT_CHILD */
+ EditBone *ebone_iter, *ebone_child = NULL;
+ int pass;
+
+ /* first pass, only connected bones (the logical direct child) */
+ for (pass = 0; pass < 2 && (ebone_child == NULL); pass++) {
+ for (ebone_iter = arm->edbo->first; ebone_iter; ebone_iter = ebone_iter->next) {
+ /* possible we have multiple children, some invisible */
+ if (EBONE_SELECTABLE(arm, ebone_iter)) {
+ if (ebone_iter->parent == ebone_active) {
+ if ((pass == 1) || (ebone_iter->flag & BONE_CONNECTED)) {
+ ebone_child = ebone_iter;
+ break;
}
}
}
}
+ }
- if (ebone_child) {
- arm->act_edbone = ebone_child;
+ if (ebone_child) {
+ arm->act_edbone = ebone_child;
- if (!add_to_sel) {
- ED_armature_ebone_select_set(ebone_active, false);
- }
- ED_armature_ebone_select_set(ebone_child, true);
-
- changed = true;
+ if (!add_to_sel) {
+ ED_armature_ebone_select_set(ebone_active, false);
}
- }
+ ED_armature_ebone_select_set(ebone_child, true);
- if (changed == false) {
- continue;
+ changed = true;
}
+ }
- multi_changed = true;
- ED_armature_edit_sync_selection(arm->edbo);
- WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ if (changed == false) {
+ return OPERATOR_CANCELLED;
}
- MEM_freeN(objects);
- return multi_changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+ ED_armature_edit_sync_selection(arm->edbo);
+
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+
+ return OPERATOR_FINISHED;
}
void ARMATURE_OT_select_hierarchy(wmOperatorType *ot)
@@ -1471,15 +1449,15 @@ void ARMATURE_OT_select_hierarchy(wmOperatorType *ot)
*/
static int armature_select_mirror_exec(bContext *C, wmOperator *op)
{
- ViewLayer * view_layer = CTX_data_view_layer(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
const bool active_only = RNA_boolean_get(op->ptr, "only_active");
const bool extend = RNA_boolean_get(op->ptr, "extend");
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * ob = objects[ob_index];
- bArmature * arm = ob->data;
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
EditBone *ebone, *ebone_mirror_act = NULL;
diff --git a/source/blender/editors/armature/pose_edit.c b/source/blender/editors/armature/pose_edit.c
index 58b7a8ab969..7a973e5dd2a 100644
--- a/source/blender/editors/armature/pose_edit.c
+++ b/source/blender/editors/armature/pose_edit.c
@@ -207,22 +207,34 @@ void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob, bool curre
/* Override depsgraph with a filtered, simpler copy */
if (!current_frame_only && G.debug_value != -1) {
- TIMEIT_START(filter_pose_depsgraph);
DEG_FilterQuery query = {{0}};
DEG_FilterTarget *dft_ob = MEM_callocN(sizeof(DEG_FilterTarget), "DEG_FilterTarget");
dft_ob->id = &ob->id;
BLI_addtail(&query.targets, dft_ob);
+#ifdef DEBUG_TIME
+ TIMEIT_START(filter_pose_depsgraph);
+#endif
+
depsgraph = DEG_graph_filter(depsgraph, bmain, &query);
- free_depsgraph = true;
- MEM_freeN(dft_ob);
+#ifdef DEBUG_TIME
TIMEIT_END(filter_pose_depsgraph);
+#endif
+
+ free_depsgraph = true;
+ MEM_freeN(dft_ob);
+#ifdef DEBUG_TIME
TIMEIT_START(filter_pose_update);
+#endif
+
BKE_scene_graph_update_tagged(depsgraph, bmain);
+
+#ifdef DEBUG_TIME
TIMEIT_END(filter_pose_update);
+#endif
}
/* set flag to force recalc, then grab the relevant bones to target */
@@ -230,9 +242,15 @@ void ED_pose_recalculate_paths(bContext *C, Scene *scene, Object *ob, bool curre
animviz_get_object_motionpaths(ob, &targets);
/* recalculate paths, then free */
+#ifdef DEBUG_TIME
TIMEIT_START(pose_path_calc);
+#endif
+
animviz_calc_motionpaths(depsgraph, bmain, scene, &targets, !free_depsgraph, current_frame_only);
+
+#ifdef DEBUG_TIME
TIMEIT_END(pose_path_calc);
+#endif
BLI_freelistN(&targets);
@@ -298,7 +316,7 @@ static int pose_calculate_paths_exec(bContext *C, wmOperator *op)
}
/* set up path data for bones being calculated */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones)
+ CTX_DATA_BEGIN_FOR_ID (C, bPoseChannel *, pchan, selected_pose_bones, &ob->id)
{
/* verify makes sure that the selected bone has a bone with the appropriate settings */
animviz_verify_motionpaths(op->reports, scene, ob, pchan);
@@ -775,30 +793,29 @@ void POSE_OT_flip_names(wmOperatorType *ot)
static int pose_autoside_names_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
- Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C));
- bArmature *arm;
char newname[MAXBONENAME];
short axis = RNA_enum_get(op->ptr, "axis");
-
- /* paranoia checks */
- if (ELEM(NULL, ob, ob->pose))
- return OPERATOR_CANCELLED;
- arm = ob->data;
+ Object *ob_prev = NULL;
/* loop through selected bones, auto-naming them */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones)
+ CTX_DATA_BEGIN_WITH_ID(C, bPoseChannel *, pchan, selected_pose_bones, Object *, ob)
{
+ bArmature *arm = ob->data;
BLI_strncpy(newname, pchan->name, sizeof(newname));
- if (bone_autoside_name(newname, 1, axis, pchan->bone->head[axis], pchan->bone->tail[axis]))
+ if (bone_autoside_name(newname, 1, axis, pchan->bone->head[axis], pchan->bone->tail[axis])) {
ED_armature_bone_rename(bmain, arm, pchan->name, newname);
- }
- CTX_DATA_END;
+ }
- /* since we renamed stuff... */
- DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ if (ob_prev != ob) {
+ /* since we renamed stuff... */
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
+ ob_prev = ob;
+ }
+ }
+ CTX_DATA_END;
return OPERATOR_FINISHED;
}
@@ -833,20 +850,24 @@ void POSE_OT_autoside_names(wmOperatorType *ot)
static int pose_bone_rotmode_exec(bContext *C, wmOperator *op)
{
- Object *ob = CTX_data_active_object(C);
- int mode = RNA_enum_get(op->ptr, "type");
+ const int mode = RNA_enum_get(op->ptr, "type");
+ Object *prev_ob = NULL;
/* set rotation mode of selected bones */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones)
+ CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, selected_pose_bones, Object *, ob)
{
pchan->rotmode = mode;
+
+ if (prev_ob != ob) {
+ /* Notifiers and updates. */
+ DEG_id_tag_update((ID *)ob, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob);
+ WM_event_add_notifier(C, NC_OBJECT | ND_BONE_SELECT, ob);
+ prev_ob = ob;
+ }
}
CTX_DATA_END;
- /* notifiers and updates */
- DEG_id_tag_update((ID *)ob, OB_RECALC_DATA);
- WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob);
-
return OPERATOR_FINISHED;
}
@@ -974,37 +995,27 @@ static int armature_layers_invoke(bContext *C, wmOperator *op, const wmEvent *ev
/* Set the visible layers for the active armature (edit and pose modes) */
static int armature_layers_exec(bContext *C, wmOperator *op)
{
- ViewLayer *view_layer = CTX_data_view_layer(C);
+ Object *ob = CTX_data_active_object(C);
+ bArmature *arm = armature_layers_get_data(&ob);
PointerRNA ptr;
bool layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
- bool changed = false;
+
+ if (arm == NULL) {
+ return OPERATOR_CANCELLED;
+ }
/* get the values set in the operator properties */
RNA_boolean_get_array(op->ptr, "layers", layers);
- uint objects_len = 0;
- Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
- for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object *ob = objects[ob_index];
- bArmature *arm = armature_layers_get_data(&ob);
-
- if (arm == NULL) {
- continue;
- }
-
- /* Get pointer for armature, and write data there... */
- RNA_id_pointer_create((ID *)arm, &ptr);
- RNA_boolean_set_array(&ptr, "layers", layers);
-
- /* Note, notifier might evolve. */
- WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
- DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE);
+ /* get pointer for armature, and write data there... */
+ RNA_id_pointer_create((ID *)arm, &ptr);
+ RNA_boolean_set_array(&ptr, "layers", layers);
- changed = true;
- }
- MEM_freeN(objects);
+ /* note, notifier might evolve */
+ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
+ DEG_id_tag_update(&arm->id, DEG_TAG_COPY_ON_WRITE);
- return changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
+ return OPERATOR_FINISHED;
}
void ARMATURE_OT_armature_layers(wmOperatorType *ot)
@@ -1055,30 +1066,29 @@ static int pose_bone_layers_invoke(bContext *C, wmOperator *op, const wmEvent *e
/* Set the visible layers for the active armature (edit and pose modes) */
static int pose_bone_layers_exec(bContext *C, wmOperator *op)
{
- Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C));
PointerRNA ptr;
bool layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
- if (ob == NULL || ob->data == NULL) {
- return OPERATOR_CANCELLED;
- }
-
/* get the values set in the operator properties */
RNA_boolean_get_array(op->ptr, "layers", layers);
+ Object *prev_ob = NULL;
+
/* set layers of pchans based on the values set in the operator props */
- CTX_DATA_BEGIN (C, bPoseChannel *, pchan, selected_pose_bones)
+ CTX_DATA_BEGIN_WITH_ID (C, bPoseChannel *, pchan, selected_pose_bones, Object *, ob)
{
/* get pointer for pchan, and write flags this way */
RNA_pointer_create((ID *)ob->data, &RNA_Bone, pchan->bone, &ptr);
RNA_boolean_set_array(&ptr, "layers", layers);
+
+ if (prev_ob != ob) {
+ /* Note, notifier might evolve. */
+ WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
+ DEG_id_tag_update((ID *)ob->data, DEG_TAG_COPY_ON_WRITE);
+ prev_ob = ob;
+ }
}
CTX_DATA_END;
-
- /* note, notifier might evolve */
- WM_event_add_notifier(C, NC_OBJECT | ND_POSE, ob);
- DEG_id_tag_update((ID *)ob->data, DEG_TAG_COPY_ON_WRITE);
-
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/armature/pose_select.c b/source/blender/editors/armature/pose_select.c
index b99fc8eb204..b50c44e6a6b 100644
--- a/source/blender/editors/armature/pose_select.c
+++ b/source/blender/editors/armature/pose_select.c
@@ -459,34 +459,27 @@ void POSE_OT_select_all(wmOperatorType *ot)
static int pose_select_parent_exec(bContext *C, wmOperator *UNUSED(op))
{
- /* only clear relevant transforms for selected bones */
- ViewLayer *view_layer = CTX_data_view_layer(C);
- FOREACH_OBJECT_IN_MODE_BEGIN (view_layer, OB_MODE_POSE, ob_iter)
- {
- Object *ob = ob_iter;
- bArmature *arm = (bArmature *)ob->data;
-
- FOREACH_PCHAN_SELECTED_IN_OBJECT_BEGIN (ob_iter, pchan)
- {
- if (pchan) {
- bPoseChannel *parent = pchan->parent;
- if ((parent) && !(parent->bone->flag & (BONE_HIDDEN_P | BONE_UNSELECTABLE))) {
- parent->bone->flag |= BONE_SELECTED;
- arm->act_bone = parent->bone;
- }
- else {
- continue;
- }
- }
- else {
- continue;
- }
- ED_pose_bone_select_tag_update(ob);
+ Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C));
+ bArmature *arm = (bArmature *)ob->data;
+ bPoseChannel *pchan, *parent;
+
+ /* Determine if there is an active bone */
+ pchan = CTX_data_active_pose_bone(C);
+ if (pchan) {
+ parent = pchan->parent;
+ if ((parent) && !(parent->bone->flag & (BONE_HIDDEN_P | BONE_UNSELECTABLE))) {
+ parent->bone->flag |= BONE_SELECTED;
+ arm->act_bone = parent->bone;
+ }
+ else {
+ return OPERATOR_CANCELLED;
}
- FOREACH_PCHAN_SELECTED_IN_OBJECT_END;
}
- FOREACH_OBJECT_IN_MODE_END;
+ else {
+ return OPERATOR_CANCELLED;
+ }
+ ED_pose_bone_select_tag_update(ob);
return OPERATOR_FINISHED;
}
@@ -570,6 +563,8 @@ void POSE_OT_select_constraint_target(wmOperatorType *ot)
/* -------------------------------------- */
+/* No need to convert to multi-objects. Just like we keep the non-active bones
+ * selected we then keep the non-active objects untouched (selected/unselected). */
static int pose_select_hierarchy_exec(bContext *C, wmOperator *op)
{
Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C));
@@ -930,8 +925,8 @@ static int pose_select_mirror_exec(bContext *C, wmOperator *op)
uint objects_len = 0;
Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, &objects_len, OB_MODE_POSE);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * ob = objects[ob_index];
- bArmature * arm = ob->data;
+ Object *ob = objects[ob_index];
+ bArmature *arm = ob->data;
bPoseChannel *pchan, *pchan_mirror_act = NULL;
for (pchan = ob->pose->chanbase.first; pchan; pchan = pchan->next) {
diff --git a/source/blender/editors/datafiles/CMakeLists.txt b/source/blender/editors/datafiles/CMakeLists.txt
index 3e7f7063235..4e898d5654b 100644
--- a/source/blender/editors/datafiles/CMakeLists.txt
+++ b/source/blender/editors/datafiles/CMakeLists.txt
@@ -42,8 +42,8 @@ set(ICON_NAMES
tria_up
arrow_leftright
plus
- disclosure_tri_down
disclosure_tri_right
+ disclosure_tri_down
radiobut_off
radiobut_on
menu_panel
@@ -58,12 +58,12 @@ set(ICON_NAMES
node
node_sel
fullscreen
- splitscreen
+ workspace
rightarrow_thin
bordermove
viewzoom
- zoomin
- zoomout
+ add
+ remove
panel_close
copy_id
eyedropper
@@ -100,14 +100,16 @@ set(ICON_NAMES
freeze
stylus_pressure
ghost_disabled
- new
+ file_new
file_tick
quit
url
recover_last
+ 30
fullscreen_enter
fullscreen_exit
- lamp
+ #onionskin
+ light
material
texture
anim
@@ -121,27 +123,31 @@ set(ICON_NAMES
physics
speaker
texture_shaded
+ tool_settings
+ shaderfx
+ #blank1
view3d
- ipo
- oops
- buts
- filesel
- image_col
+ graph
+ outliner
+ properties
+ filebrowser
+ image
info
sequence
text
- imasel
sound
action
nla
- scriptwin
+ preferences
time
nodetree
logic
console
- preferences
clip
asset_manager
+ node_compositing
+ node_texture
+ node_material
object_datamode
editmode_hlt
facesel_hlt
@@ -153,6 +159,15 @@ set(ICON_NAMES
particlemode
lightpaint
greasepencil_stroke_paint
+ tracking
+ tracking_backwards
+ tracking_forwards
+ tracking_backwards_single
+ tracking_forwards_single
+ tracking_clear_backwards
+ tracking_clear_forwards
+ tracking_refine_backwards
+ tracking_refine_forwards
scene_data
renderlayers
world_data
@@ -161,7 +176,7 @@ set(ICON_NAMES
curve_data
meta_data
lattice_data
- lamp_data
+ light_data
material_data
texture_data
anim_data
@@ -186,7 +201,6 @@ set(ICON_NAMES
render_result
surface_data
empty_data
- settings
render_animation
render_still
library_data_broken
@@ -200,18 +214,36 @@ set(ICON_NAMES
group_vertex
group_vcol
group_uvs
+ face_maps
rna
rna_add
mouse_lmb
mouse_mmb
mouse_rmb
- mouse_drag
+ mouse_move
+ mouse_lmb_drag
+ mouse_mmb_drag
+ mouse_rmb_drag
+ preset
+ decorate
+ decorate_keyframe
+ decorate_animate
+ decorate_driver
+ decorate_linked
+ decorate_override
+ decorate_unlocked
+ decorate_locked
+ fake_user
+ orphan_data
+ user
+ system
+ settings
outliner_ob_empty
outliner_ob_mesh
outliner_ob_curve
outliner_ob_lattice
outliner_ob_meta
- outliner_ob_lamp
+ outliner_ob_light
outliner_ob_camera
outliner_ob_armature
outliner_ob_font
@@ -220,6 +252,8 @@ set(ICON_NAMES
outliner_ob_force_field
outliner_ob_group_instance
outliner_ob_greasepencil
+ outliner_ob_lightprobe
+ outliner_ob_image
restrict_color_off
restrict_color_on
restrict_view_off
@@ -228,12 +262,11 @@ set(ICON_NAMES
restrict_select_on
restrict_render_off
restrict_render_on
- outliner_data_empty
outliner_data_mesh
outliner_data_curve
outliner_data_lattice
outliner_data_meta
- outliner_data_lamp
+ outliner_data_light
outliner_data_camera
outliner_data_armature
outliner_data_font
@@ -241,6 +274,10 @@ set(ICON_NAMES
outliner_data_speaker
outliner_data_pose
outliner_data_greasepencil
+ onionskin_off
+ onionskin_on
+ hide_off
+ hide_on
mesh_plane
mesh_cube
mesh_circle
@@ -252,11 +289,11 @@ set(ICON_NAMES
mesh_torus
mesh_cone
mesh_capsule
- lamp_point
- lamp_sun
- lamp_spot
- lamp_hemi
- lamp_area
+ light_point
+ light_sun
+ light_spot
+ light_hemi
+ light_area
meta_empty
meta_plane
meta_cube
@@ -274,6 +311,9 @@ set(ICON_NAMES
curve_ncurve
curve_ncircle
curve_path
+ lightprobe_cubemap
+ lightprobe_planar
+ lightprobe_grid
color_red
color_green
color_blue
@@ -294,8 +334,25 @@ set(ICON_NAMES
force_turbulence
force_drag
force_smokeflow
+ temperature
+ gear
node_insert_on
node_insert_off
+ node_top
+ node_side
+ node_corner
+ align_left
+ align_center
+ align_right
+ align_justify
+ align_flush
+ align_top
+ align_middle
+ align_bottom
+ bold
+ italic
+ underline
+ small_caps
modifier
mod_wave
mod_build
@@ -346,7 +403,6 @@ set(ICON_NAMES
pause
prev_keyframe
next_keyframe
- play_audio
play_reverse
preview_range
action_tweak
@@ -355,8 +411,8 @@ set(ICON_NAMES
pmarker
marker_hlt
marker
- space2
- space3
+ keyframe_hlt
+ keyframe
keyingset
key_dehlt
key_hlt
@@ -390,13 +446,12 @@ set(ICON_NAMES
vertexsel
edgesel
facesel
- loopsel
- rotate
- cursor
- rotatecollection
- rotatecenter
- rotactive
- align
+ pivot_boundbox
+ pivot_cursor
+ pivot_individual
+ pivot_median
+ pivot_active
+ center_only
smoothcurve
spherecurve
rootcurve
@@ -407,6 +462,7 @@ set(ICON_NAMES
prop_off
prop_on
prop_con
+ sculpt_dyntopo
particle_point
particle_tip
particle_path
@@ -431,15 +487,19 @@ set(ICON_NAMES
snap_peel_object
grid
object_origin
+ orientation_global
+ orientation_gimbal
+ orientation_local
+ orientation_normal
+ orientation_view
pastedown
copydown
pasteflipup
pasteflipdown
vis_sel_11
vis_sel_10
- vis_sel_10
+ vis_sel_01
vis_sel_00
- snap_surface
automerge_on
automerge_off
retopo
@@ -448,12 +508,16 @@ set(ICON_NAMES
uv_facesel
uv_islandsel
uv_sync_select
- bbox
- wire
- solid
- smooth
- potato
- ortho
+ normals_vertex
+ normals_vertex_face
+ normals_face
+ shading_bbox
+ shading_wire
+ shading_solid
+ shading_rendered
+ shading_texture
+ overlay
+ xray
lockview_off
lockview_on
axis_side
@@ -473,8 +537,6 @@ set(ICON_NAMES
shortdisplay
ghost
imgdisplay
- save_as
- save_copy
bookmarks
fontpreview
filter
@@ -483,6 +545,7 @@ set(ICON_NAMES
file_parent
file_refresh
file_folder
+ file_blank
file_blend
file_image
file_movie
@@ -490,18 +553,19 @@ set(ICON_NAMES
file_sound
file_font
file_text
- recover_auto
- save_prefs
+ sort_desc
+ sort_asc
link_blend
append_blend
import
export
external_data
- load_factory
loop_back
loop_forwards
back
forward
+ alembic
+ volume
file_hidden
file_backup
disk_drive
@@ -531,6 +595,11 @@ set(ICON_NAMES
image_alpha
image_zdepth
imagefile
+ view_perspective
+ view_ortho
+ view_camera
+ view_pan
+ view_zoom
)
# This section is maintained by the updating script, keep BEGIN/END comments.
diff --git a/source/blender/editors/gizmo_library/gizmo_library_utils.c b/source/blender/editors/gizmo_library/gizmo_library_utils.c
index 350c9922179..25364652785 100644
--- a/source/blender/editors/gizmo_library/gizmo_library_utils.c
+++ b/source/blender/editors/gizmo_library/gizmo_library_utils.c
@@ -190,7 +190,8 @@ bool gizmo_window_project_2d(
float plane[4], co[3];
plane_from_point_normal_v3(plane, mat[3], mat[2]);
- if (ED_view3d_win_to_3d_on_plane(ar, plane, mval, true, co)) {
+ bool clip_ray = ((RegionView3D *)ar->regiondata)->is_persp;
+ if (ED_view3d_win_to_3d_on_plane(ar, plane, mval, clip_ray, co)) {
float imat[4][4];
invert_m4_m4(imat, mat);
mul_m4_v3(imat, co);
diff --git a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c
index e16deb71304..7b625364905 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c
@@ -212,7 +212,9 @@ static void button2d_draw_intern(
}
float alpha = (highlight) ? 1.0f : 0.8f;
+ GPU_polygon_smooth(false);
UI_icon_draw_alpha(pos[0], pos[1], button->icon, alpha);
+ GPU_polygon_smooth(true);
}
GPU_blend(false);
}
diff --git a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c
index 0646d689812..04015ee9f1e 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/cage2d_gizmo.c
@@ -413,7 +413,7 @@ static void cage2d_draw_box_interaction(
if (is_solid) {
BLI_assert(ELEM(prim_type, GPU_PRIM_TRI_FAN));
immBegin(prim_type, verts_len);
- immAttrib3f(attr_id.col, 0.0f, 0.0f, 0.0f);
+ immAttr3f(attr_id.col, 0.0f, 0.0f, 0.0f);
for (uint i = 0; i < verts_len; i++) {
immVertex2fv(attr_id.pos, verts[i]);
}
@@ -424,7 +424,7 @@ static void cage2d_draw_box_interaction(
GPU_line_width(line_width + 3.0f);
immBegin(prim_type, verts_len);
- immAttrib3f(attr_id.col, 0.0f, 0.0f, 0.0f);
+ immAttr3f(attr_id.col, 0.0f, 0.0f, 0.0f);
for (uint i = 0; i < verts_len; i++) {
immVertex2fv(attr_id.pos, verts[i]);
}
@@ -433,7 +433,7 @@ static void cage2d_draw_box_interaction(
GPU_line_width(line_width);
immBegin(prim_type, verts_len);
- immAttrib3fv(attr_id.col, color);
+ immAttr3fv(attr_id.col, color);
for (uint i = 0; i < verts_len; i++) {
immVertex2fv(attr_id.pos, verts[i]);
}
diff --git a/source/blender/editors/gpencil/annotate_draw.c b/source/blender/editors/gpencil/annotate_draw.c
index 0bb14a103f6..dae89d2cfd5 100644
--- a/source/blender/editors/gpencil/annotate_draw.c
+++ b/source/blender/editors/gpencil/annotate_draw.c
@@ -93,8 +93,9 @@ typedef enum eDrawStrokeFlags {
/* ----- Tool Buffer Drawing ------ */
/* draw stroke defined in buffer (simple ogl lines/points for now, as dotted lines) */
-static void gp_draw_stroke_buffer(const tGPspoint *points, int totpoints, short thickness,
- short dflag, short sflag, float ink[4])
+static void gp_draw_stroke_buffer(
+ const tGPspoint *points, int totpoints, short thickness,
+ short dflag, short sflag, float ink[4])
{
int draw_points = 0;
@@ -241,8 +242,9 @@ static void gp_draw_stroke_point(
}
/* draw a given stroke in 3d (i.e. in 3d-space), using simple ogl lines */
-static void gp_draw_stroke_3d(const bGPDspoint *points, int totpoints, short thickness, bool UNUSED(debug),
- short UNUSED(sflag), const float ink[4], bool cyclic)
+static void gp_draw_stroke_3d(
+ const bGPDspoint *points, int totpoints, short thickness, bool UNUSED(debug),
+ short UNUSED(sflag), const float ink[4], bool cyclic)
{
float curpressure = points[0].pressure;
float cyclic_fpt[3];
@@ -322,8 +324,9 @@ static void gp_draw_stroke_3d(const bGPDspoint *points, int totpoints, short thi
/* ----- Fancy 2D-Stroke Drawing ------ */
/* draw a given stroke in 2d */
-static void gp_draw_stroke_2d(const bGPDspoint *points, int totpoints, short thickness_s, short dflag, short sflag,
- bool UNUSED(debug), int offsx, int offsy, int winx, int winy, const float ink[4])
+static void gp_draw_stroke_2d(
+ const bGPDspoint *points, int totpoints, short thickness_s, short dflag, short sflag,
+ bool UNUSED(debug), int offsx, int offsy, int winx, int winy, const float ink[4])
{
/* otherwise thickness is twice that of the 3D view */
float thickness = (float)thickness_s * 0.5f;
@@ -553,8 +556,9 @@ static void gp_draw_strokes(
gp_draw_stroke_point(gps->points, lthick, dflag, gps->flag, offsx, offsy, winx, winy, color);
}
else {
- gp_draw_stroke_3d(gps->points, gps->totpoints, lthick, debug, gps->flag,
- color, gps->flag & GP_STROKE_CYCLIC);
+ gp_draw_stroke_3d(
+ gps->points, gps->totpoints, lthick, debug, gps->flag,
+ color, gps->flag & GP_STROKE_CYCLIC);
}
if (no_xray) {
@@ -570,8 +574,9 @@ static void gp_draw_strokes(
gp_draw_stroke_point(gps->points, lthick, dflag, gps->flag, offsx, offsy, winx, winy, color);
}
else {
- gp_draw_stroke_2d(gps->points, gps->totpoints, lthick, dflag, gps->flag, debug,
- offsx, offsy, winx, winy, color);
+ gp_draw_stroke_2d(
+ gps->points, gps->totpoints, lthick, dflag, gps->flag, debug,
+ offsx, offsy, winx, winy, color);
}
}
}
@@ -664,21 +669,21 @@ static void gp_draw_strokes_edit(
/* size and color first */
if (show_direction_hint && i == 0) {
/* start point in green bigger */
- immAttrib3f(color, 0.0f, 1.0f, 0.0f);
- immAttrib1f(size, vsize + 4);
+ immAttr3f(color, 0.0f, 1.0f, 0.0f);
+ immAttr1f(size, vsize + 4);
}
else if (show_direction_hint && (i == gps->totpoints - 1)) {
/* end point in red smaller */
- immAttrib3f(color, 1.0f, 0.0f, 0.0f);
- immAttrib1f(size, vsize + 1);
+ immAttr3f(color, 1.0f, 0.0f, 0.0f);
+ immAttr1f(size, vsize + 1);
}
else if (pt->flag & GP_SPOINT_SELECT) {
- immAttrib3fv(color, selectColor);
- immAttrib1f(size, vsize);
+ immAttr3fv(color, selectColor);
+ immAttr1f(size, vsize);
}
else {
- immAttrib3fv(color, gpl->color);
- immAttrib1f(size, bsize);
+ immAttr3fv(color, gpl->color);
+ immAttr1f(size, bsize);
}
/* then position */
@@ -746,23 +751,16 @@ static void gp_draw_data_layers(
* NOTE: If the setting doesn't apply, it *must* be cleared,
* as dflag's carry over from the previous layer
*/
-#define GP_DRAWFLAG_APPLY(condition, draw_flag_value) { \
- if (condition) dflag |= (draw_flag_value); \
- else dflag &= ~(draw_flag_value); \
- } (void)0
/* xray... */
- GP_DRAWFLAG_APPLY((gpl->flag & GP_LAYER_NO_XRAY), GP_DRAWDATA_NO_XRAY);
-
-#undef GP_DRAWFLAG_APPLY
-
+ SET_FLAG_FROM_TEST(dflag, gpl->flag & GP_LAYER_NO_XRAY, GP_DRAWDATA_NO_XRAY);
/* draw the strokes already in active frame */
gp_draw_strokes(gpd, gpl, gpf, offsx, offsy, winx, winy, dflag, debug, lthick, ink);
/* Draw verts of selected strokes
* - when doing OpenGL renders, we don't want to be showing these, as that ends up flickering
- * - locked layers can't be edited, so there's no point showing these verts
+ * - locked layers can't be edited, so there's no point showing these verts
* as they will have no bearings on what gets edited
* - only show when in editmode, since operators shouldn't work otherwise
* (NOTE: doing it this way means that the toggling editmode shows visible change immediately)
diff --git a/source/blender/editors/gpencil/annotate_paint.c b/source/blender/editors/gpencil/annotate_paint.c
index 97834e6836c..31c66ac8d55 100644
--- a/source/blender/editors/gpencil/annotate_paint.c
+++ b/source/blender/editors/gpencil/annotate_paint.c
@@ -527,8 +527,9 @@ static void gp_stroke_simplify(tGPsdata *p)
j += 2;
}
}
- gp_stroke_addpoint(p, &old_points[num_points - 1].x, old_points[num_points - 1].pressure,
- p->inittime + (double)old_points[num_points - 1].time);
+ gp_stroke_addpoint(
+ p, &old_points[num_points - 1].x, old_points[num_points - 1].pressure,
+ p->inittime + (double)old_points[num_points - 1].time);
/* free old buffer */
MEM_freeN(old_points);
@@ -782,10 +783,11 @@ static bool gp_stroke_eraser_is_occluded(tGPsdata *p, const bGPDspoint *pt, cons
/* eraser tool - evaluation per stroke */
/* TODO: this could really do with some optimization (KD-Tree/BVH?) */
-static void gp_stroke_eraser_dostroke(tGPsdata *p,
- bGPDframe *gpf, bGPDstroke *gps,
- const int mval[2], const int mvalo[2],
- const int radius, const rcti *rect)
+static void gp_stroke_eraser_dostroke(
+ tGPsdata *p,
+ bGPDframe *gpf, bGPDstroke *gps,
+ const int mval[2], const int mvalo[2],
+ const int radius, const rcti *rect)
{
bGPDspoint *pt1, *pt2;
int pc1[2] = {0};
@@ -1431,10 +1433,11 @@ static void gpencil_draw_eraser(bContext *UNUSED(C), int x, int y, void *p_ptr)
immUniform1f("dash_width", 12.0f);
immUniform1f("dash_factor", 0.5f);
- imm_draw_circle_wire_2d(shdr_pos, x, y, p->radius,
- /* XXX Dashed shader gives bad results with sets of small segments currently,
- * temp hack around the issue. :( */
- max_ii(8, p->radius / 2)); /* was fixed 40 */
+ imm_draw_circle_wire_2d(
+ shdr_pos, x, y, p->radius,
+ /* XXX Dashed shader gives bad results with sets of small segments currently,
+ * temp hack around the issue. :( */
+ max_ii(8, p->radius / 2)); /* was fixed 40 */
immUnbindProgram();
@@ -1453,9 +1456,10 @@ static void gpencil_draw_toggle_eraser_cursor(bContext *C, tGPsdata *p, short en
}
else if (enable && !p->erasercursor) {
/* enable cursor */
- p->erasercursor = WM_paint_cursor_activate(CTX_wm_manager(C),
- NULL, /* XXX */
- gpencil_draw_eraser, p);
+ p->erasercursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ NULL, /* XXX */
+ gpencil_draw_eraser, p);
}
}
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index be630d98ff1..d64c3faae1b 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -114,11 +114,11 @@ typedef enum eDrawStrokeFlags {
/* ----- Tool Buffer Drawing ------ */
/* helper functions to set color of buffer point */
-static void gp_set_tpoint_varying_color(const tGPspoint *pt, const float ink[4], uint attrib_id)
+static void gp_set_tpoint_varying_color(const tGPspoint *pt, const float ink[4], uint attr_id)
{
float alpha = ink[3] * pt->strength;
CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f);
- immAttrib4ub(attrib_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha));
+ immAttr4ub(attr_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha));
}
static void gp_set_point_uniform_color(const bGPDspoint *pt, const float ink[4])
@@ -128,11 +128,11 @@ static void gp_set_point_uniform_color(const bGPDspoint *pt, const float ink[4])
immUniformColor3fvAlpha(ink, alpha);
}
-static void gp_set_point_varying_color(const bGPDspoint *pt, const float ink[4], uint attrib_id)
+static void gp_set_point_varying_color(const bGPDspoint *pt, const float ink[4], uint attr_id)
{
float alpha = ink[3] * pt->strength;
CLAMP(alpha, GPENCIL_STRENGTH_MIN, 1.0f);
- immAttrib4ub(attrib_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha));
+ immAttr4ub(attr_id, F2UB(ink[0]), F2UB(ink[1]), F2UB(ink[2]), F2UB(alpha));
}
/* draw fills for buffer stroke */
@@ -199,8 +199,9 @@ static void gp_draw_stroke_buffer_fill(const tGPspoint *points, int totpoints, f
}
/* draw stroke defined in buffer (simple ogl lines/points for now, as dotted lines) */
-static void gp_draw_stroke_buffer(const tGPspoint *points, int totpoints, short thickness,
- short dflag, short sflag, float ink[4], float fill_ink[4])
+static void gp_draw_stroke_buffer(
+ const tGPspoint *points, int totpoints, short thickness,
+ short dflag, short sflag, float ink[4], float fill_ink[4])
{
int draw_points = 0;
@@ -317,8 +318,9 @@ static void gp_calc_2d_stroke_fxy(const float pt[3], short sflag, int offsx, int
/* draw a 2D buffer stroke in "volumetric" style
* NOTE: the stroke buffer doesn't have any coordinate offsets/transforms
*/
-static void gp_draw_stroke_volumetric_buffer(const tGPspoint *points, int totpoints, short thickness,
- short dflag, const float ink[4])
+static void gp_draw_stroke_volumetric_buffer(
+ const tGPspoint *points, int totpoints, short thickness,
+ short dflag, const float ink[4])
{
/* error checking */
if ((points == NULL) || (totpoints <= 0))
@@ -340,7 +342,7 @@ static void gp_draw_stroke_volumetric_buffer(const tGPspoint *points, int totpoi
const tGPspoint *pt = points;
for (int i = 0; i < totpoints; i++, pt++) {
gp_set_tpoint_varying_color(pt, ink, color);
- immAttrib1f(size, pt->pressure * thickness); /* TODO: scale based on view transform (zoom level) */
+ immAttr1f(size, pt->pressure * thickness); /* TODO: scale based on view transform (zoom level) */
immVertex2f(pos, pt->x, pt->y);
}
@@ -350,10 +352,11 @@ static void gp_draw_stroke_volumetric_buffer(const tGPspoint *points, int totpoi
}
/* draw a 2D strokes in "volumetric" style */
-static void gp_draw_stroke_volumetric_2d(const bGPDspoint *points, int totpoints, short thickness,
- short UNUSED(dflag), short sflag,
- int offsx, int offsy, int winx, int winy,
- const float diff_mat[4][4], const float ink[4])
+static void gp_draw_stroke_volumetric_2d(
+ const bGPDspoint *points, int totpoints, short thickness,
+ short UNUSED(dflag), short sflag,
+ int offsx, int offsy, int winx, int winy,
+ const float diff_mat[4][4], const float ink[4])
{
GPUVertFormat *format = immVertexFormat();
uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
@@ -374,7 +377,7 @@ static void gp_draw_stroke_volumetric_2d(const bGPDspoint *points, int totpoints
gp_calc_2d_stroke_fxy(fpt, sflag, offsx, offsy, winx, winy, co);
gp_set_point_varying_color(pt, ink, color);
- immAttrib1f(size, pt->pressure * thickness); /* TODO: scale based on view transform */
+ immAttr1f(size, pt->pressure * thickness); /* TODO: scale based on view transform */
immVertex2f(pos, co[0], co[1]);
}
@@ -400,7 +403,7 @@ static void gp_draw_stroke_volumetric_3d(
const bGPDspoint *pt = points;
for (int i = 0; i < totpoints && pt; i++, pt++) {
gp_set_point_varying_color(pt, ink, color);
- immAttrib1f(size, pt->pressure * thickness); /* TODO: scale based on view transform */
+ immAttr1f(size, pt->pressure * thickness); /* TODO: scale based on view transform */
immVertex3fv(pos, &pt->x); /* we can adjust size in vertex shader based on view/projection! */
}
@@ -580,7 +583,7 @@ static void gp_add_filldata_tobuffer(
fpt[2] = 0.0f; /* 2d always is z=0.0f */
}
- immAttrib2f(texcoord, uv[0], uv[1]); /* texture coordinates */
+ immAttr2f(texcoord, uv[0], uv[1]); /* texture coordinates */
immVertex3fv(pos, fpt); /* position */
}
@@ -736,9 +739,13 @@ static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4
int cyclic_add = (cyclic) ? 1 : 0;
GPUVertFormat *format = immVertexFormat();
- uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
- uint color = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
- uint thickattrib = GPU_vertformat_attr_add(format, "thickness", GPU_COMP_F32, 1, GPU_FETCH_FLOAT);
+ const struct {
+ uint pos, color, thickness;
+ } attr_id = {
+ .pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT),
+ .color = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT),
+ .thickness = GPU_vertformat_attr_add(format, "thickness", GPU_COMP_F32, 1, GPU_FETCH_FLOAT),
+ };
immBindBuiltinProgram(GPU_SHADER_GPENCIL_STROKE);
immUniform2fv("Viewport", viewport);
@@ -759,8 +766,8 @@ static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4
for (int i = 0; i < totpoints; i++, pt++) {
/* first point for adjacency (not drawn) */
if (i == 0) {
- gp_set_point_varying_color(points, ink, color);
- immAttrib1f(thickattrib, max_ff(curpressure * thickness, 1.0f));
+ gp_set_point_varying_color(points, ink, attr_id.color);
+ immAttr1f(attr_id.thickness, max_ff(curpressure * thickness, 1.0f));
if ((cyclic) && (totpoints > 2)) {
mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + totpoints - 1)->x);
}
@@ -768,35 +775,35 @@ static void gp_draw_stroke_3d(tGPDdraw *tgpw, short thickness, const float ink[4
mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + 1)->x);
}
mul_v3_fl(fpt, -1.0f);
- immVertex3fv(pos, fpt);
+ immVertex3fv(attr_id.pos, fpt);
}
/* set point */
- gp_set_point_varying_color(pt, ink, color);
- immAttrib1f(thickattrib, max_ff(curpressure * thickness, 1.0f));
+ gp_set_point_varying_color(pt, ink, attr_id.color);
+ immAttr1f(attr_id.thickness, max_ff(curpressure * thickness, 1.0f));
mul_v3_m4v3(fpt, tgpw->diff_mat, &pt->x);
- immVertex3fv(pos, fpt);
+ immVertex3fv(attr_id.pos, fpt);
curpressure = pt->pressure;
}
if (cyclic && totpoints > 2) {
/* draw line to first point to complete the cycle */
- immAttrib1f(thickattrib, max_ff(points->pressure * thickness, 1.0f));
+ immAttr1f(attr_id.thickness, max_ff(points->pressure * thickness, 1.0f));
mul_v3_m4v3(fpt, tgpw->diff_mat, &points->x);
- immVertex3fv(pos, fpt);
+ immVertex3fv(attr_id.pos, fpt);
/* now add adjacency point (not drawn) */
- immAttrib1f(thickattrib, max_ff((points + 1)->pressure * thickness, 1.0f));
+ immAttr1f(attr_id.thickness, max_ff((points + 1)->pressure * thickness, 1.0f));
mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + 1)->x);
- immVertex3fv(pos, fpt);
+ immVertex3fv(attr_id.pos, fpt);
}
/* last adjacency point (not drawn) */
else {
- gp_set_point_varying_color(points + totpoints - 1, ink, color);
- immAttrib1f(thickattrib, max_ff(curpressure * thickness, 1.0f));
+ gp_set_point_varying_color(points + totpoints - 1, ink, attr_id.color);
+ immAttr1f(attr_id.thickness, max_ff(curpressure * thickness, 1.0f));
mul_v3_m4v3(fpt, tgpw->diff_mat, &(points + totpoints - 2)->x);
mul_v3_fl(fpt, -1.0f);
- immVertex3fv(pos, fpt);
+ immVertex3fv(attr_id.pos, fpt);
}
immEnd();
@@ -832,8 +839,12 @@ static void gp_draw_stroke_2d(
float fpt[3];
GPUVertFormat *format = immVertexFormat();
- uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
- uint color = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
+ const struct {
+ uint pos, color;
+ } attr_id = {
+ .pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT),
+ .color = GPU_vertformat_attr_add(format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT),
+ };
immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
immBegin(GPU_PRIM_TRI_STRIP, totpoints * 2 + 4);
@@ -863,7 +874,7 @@ static void gp_draw_stroke_2d(
pthick = (pt1->pressure * thickness * scalefac);
/* color of point */
- gp_set_point_varying_color(pt1, ink, color);
+ gp_set_point_varying_color(pt1, ink, attr_id.color);
/* if the first segment, start of segment is segment's normal */
if (i == 0) {
@@ -881,8 +892,8 @@ static void gp_draw_stroke_2d(
t1[1] = sc[1] + mt[1];
/* First two points of cap. */
- immVertex2fv(pos, t0);
- immVertex2fv(pos, t1);
+ immVertex2fv(attr_id.pos, t0);
+ immVertex2fv(attr_id.pos, t1);
/* calculate points for start of segment */
mt[0] = m2[0] * pthick;
@@ -894,8 +905,8 @@ static void gp_draw_stroke_2d(
t1[1] = s0[1] + mt[1];
/* Last two points of start cap (and first two points of first segment). */
- immVertex2fv(pos, t0);
- immVertex2fv(pos, t1);
+ immVertex2fv(attr_id.pos, t0);
+ immVertex2fv(attr_id.pos, t1);
}
/* if not the first segment, use bisector of angle between segments */
else {
@@ -928,8 +939,8 @@ static void gp_draw_stroke_2d(
t1[1] = s0[1] + mt[1];
/* Last two points of previous segment, and first two points of current segment. */
- immVertex2fv(pos, t0);
- immVertex2fv(pos, t1);
+ immVertex2fv(attr_id.pos, t0);
+ immVertex2fv(attr_id.pos, t1);
}
/* if last segment, also draw end of segment (defined as segment's normal) */
@@ -938,7 +949,7 @@ static void gp_draw_stroke_2d(
pthick = (pt2->pressure * thickness * scalefac);
/* color of point */
- gp_set_point_varying_color(pt2, ink, color);
+ gp_set_point_varying_color(pt2, ink, attr_id.color);
/* calculate points for end of segment */
mt[0] = m2[0] * pthick;
@@ -950,8 +961,8 @@ static void gp_draw_stroke_2d(
t1[1] = s1[1] + mt[1];
/* Last two points of last segment (and first two points of end cap). */
- immVertex2fv(pos, t0);
- immVertex2fv(pos, t1);
+ immVertex2fv(attr_id.pos, t0);
+ immVertex2fv(attr_id.pos, t1);
/* draw end cap as last step
* - make points slightly closer to center (about halfway across)
@@ -967,8 +978,8 @@ static void gp_draw_stroke_2d(
t1[1] = sc[1] + mt[1];
/* Last two points of end cap. */
- immVertex2fv(pos, t0);
- immVertex2fv(pos, t1);
+ immVertex2fv(attr_id.pos, t0);
+ immVertex2fv(attr_id.pos, t1);
}
/* store computed point2 coordinates as point1 ones of next segment. */
@@ -1313,21 +1324,21 @@ static void gp_draw_strokes_edit(
/* size and color first */
if (show_direction_hint && i == 0) {
/* start point in green bigger */
- immAttrib3f(color, 0.0f, 1.0f, 0.0f);
- immAttrib1f(size, vsize + 4);
+ immAttr3f(color, 0.0f, 1.0f, 0.0f);
+ immAttr1f(size, vsize + 4);
}
else if (show_direction_hint && (i == gps->totpoints - 1)) {
/* end point in red smaller */
- immAttrib3f(color, 1.0f, 0.0f, 0.0f);
- immAttrib1f(size, vsize + 1);
+ immAttr3f(color, 1.0f, 0.0f, 0.0f);
+ immAttr1f(size, vsize + 1);
}
else if (pt->flag & GP_SPOINT_SELECT) {
- immAttrib3fv(color, selectColor);
- immAttrib1f(size, vsize);
+ immAttr3fv(color, selectColor);
+ immAttr1f(size, vsize);
}
else {
- immAttrib3fv(color, gp_style->stroke_rgba);
- immAttrib1f(size, bsize);
+ immAttr3fv(color, gp_style->stroke_rgba);
+ immAttr1f(size, bsize);
}
/* then position */
@@ -1432,7 +1443,7 @@ void ED_gp_draw_primitives(const bContext *C, tGPDprimitive *tgpi, const int typ
}
Object *obact = CTX_data_active_object(C);
- Depsgraph *depsgraph = CTX_data_depsgraph(C); \
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
float color[4];
UI_GetThemeColor3fv(TH_GP_VERTEX_SELECT, color);
@@ -1525,18 +1536,12 @@ static void gp_draw_data_layers(RegionView3D *rv3d,
* NOTE: If the setting doesn't apply, it *must* be cleared,
* as dflag's carry over from the previous layer
*/
-#define GP_DRAWFLAG_APPLY(condition, draw_flag_value) { \
- if (condition) dflag |= (draw_flag_value); \
- else dflag &= ~(draw_flag_value); \
- } (void)0
/* xray... */
- GP_DRAWFLAG_APPLY((gpl->flag & GP_LAYER_NO_XRAY), GP_DRAWDATA_NO_XRAY);
+ SET_FLAG_FROM_TEST(dflag, gpl->flag & GP_LAYER_NO_XRAY, GP_DRAWDATA_NO_XRAY);
/* volumetric strokes... */
- GP_DRAWFLAG_APPLY((gpl->flag & GP_LAYER_VOLUMETRIC), GP_DRAWDATA_VOLUMETRIC);
-
-#undef GP_DRAWFLAG_APPLY
+ SET_FLAG_FROM_TEST(dflag, gpl->flag & GP_LAYER_VOLUMETRIC, GP_DRAWDATA_VOLUMETRIC);
tgpw.gpl = gpl;
tgpw.gpf = gpf;
diff --git a/source/blender/editors/gpencil/gpencil_brush.c b/source/blender/editors/gpencil/gpencil_brush.c
index 20c3449c208..c83bf8b7a5c 100644
--- a/source/blender/editors/gpencil/gpencil_brush.c
+++ b/source/blender/editors/gpencil/gpencil_brush.c
@@ -168,8 +168,9 @@ typedef struct tGP_BrushEditData {
/* Callback for performing some brush operation on a single point */
-typedef bool (*GP_BrushApplyCb)(tGP_BrushEditData *gso, bGPDstroke *gps, int pt_index,
- const int radius, const int co[2]);
+typedef bool (*GP_BrushApplyCb)(
+ tGP_BrushEditData *gso, bGPDstroke *gps, int pt_index,
+ const int radius, const int co[2]);
/* ************************************************ */
/* Utility Functions */
@@ -1620,7 +1621,7 @@ static bool gpsculpt_brush_do_frame(
static bool gpsculpt_brush_apply_standard(bContext *C, tGP_BrushEditData *gso)
{
ToolSettings *ts = CTX_data_tool_settings(C);
- Depsgraph *depsgraph = CTX_data_depsgraph(C); \
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
Object *obact = gso->object;
bGPdata *gpd = gso->gpd;
bool changed = false;
@@ -1684,9 +1685,9 @@ static bool gpsculpt_brush_apply_standard(bContext *C, tGP_BrushEditData *gso)
if (gso->use_multiframe_falloff) {
/* Faloff depends on distance to active frame (relative to the overall frame range) */
gso->mf_falloff = BKE_gpencil_multiframe_falloff_calc(
- gpf, gpl->actframe->framenum,
- f_init, f_end,
- ts->gp_sculpt.cur_falloff);
+ gpf, gpl->actframe->framenum,
+ f_init, f_end,
+ ts->gp_sculpt.cur_falloff);
}
else {
/* No falloff */
diff --git a/source/blender/editors/gpencil/gpencil_convert.c b/source/blender/editors/gpencil/gpencil_convert.c
index c6bc65c7dbe..72165b04a05 100644
--- a/source/blender/editors/gpencil/gpencil_convert.c
+++ b/source/blender/editors/gpencil/gpencil_convert.c
@@ -134,8 +134,9 @@ static const EnumPropertyItem prop_gpencil_convert_timingmodes[] = {
{0, NULL, 0, NULL, NULL},
};
-static const EnumPropertyItem *rna_GPConvert_mode_items(bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop),
- bool *UNUSED(r_free))
+static const EnumPropertyItem *rna_GPConvert_mode_items(
+ bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop),
+ bool *UNUSED(r_free))
{
if (RNA_boolean_get(ptr, "use_timing_data")) {
return prop_gpencil_convert_timingmodes;
@@ -155,7 +156,7 @@ static void gp_strokepoint_convertcoords(
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
ARegion *ar = CTX_wm_region(C);
- Depsgraph *depsgraph = CTX_data_depsgraph(C); \
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
Object *obact = CTX_data_active_object(C);
bGPDspoint mypt, *pt;
@@ -254,8 +255,9 @@ static void gp_timing_data_set_nbr(tGpTimingData *gtd, const int nbr)
}
/* add stroke point to timing buffers */
-static void gp_timing_data_add_point(tGpTimingData *gtd, const double stroke_inittime, const float time,
- const float delta_dist)
+static void gp_timing_data_add_point(
+ tGpTimingData *gtd, const double stroke_inittime, const float time,
+ const float delta_dist)
{
float delta_time = 0.0f;
const int cur_point = gtd->cur_point;
@@ -290,9 +292,10 @@ static void gp_timing_data_add_point(tGpTimingData *gtd, const double stroke_ini
#define MIN_TIME_DELTA 0.02f
/* Loop over next points to find the end of the stroke, and compute */
-static int gp_find_end_of_stroke_idx(tGpTimingData *gtd, RNG *rng, const int idx, const int nbr_gaps,
- int *nbr_done_gaps, const float tot_gaps_time, const float delta_time,
- float *next_delta_time)
+static int gp_find_end_of_stroke_idx(
+ tGpTimingData *gtd, RNG *rng, const int idx, const int nbr_gaps,
+ int *nbr_done_gaps, const float tot_gaps_time, const float delta_time,
+ float *next_delta_time)
{
int j;
@@ -370,9 +373,10 @@ static void gp_stroke_path_animation_preprocess_gaps(tGpTimingData *gtd, RNG *rn
}
}
-static void gp_stroke_path_animation_add_keyframes(Depsgraph *depsgraph, ReportList *reports, PointerRNA ptr, PropertyRNA *prop, FCurve *fcu,
- Curve *cu, tGpTimingData *gtd, RNG *rng, const float time_range,
- const int nbr_gaps, const float tot_gaps_time)
+static void gp_stroke_path_animation_add_keyframes(
+ Depsgraph *depsgraph, ReportList *reports, PointerRNA ptr, PropertyRNA *prop, FCurve *fcu,
+ Curve *cu, tGpTimingData *gtd, RNG *rng, const float time_range,
+ const int nbr_gaps, const float tot_gaps_time)
{
/* Use actual recorded timing! */
const float time_start = (float)gtd->start_frame;
@@ -398,8 +402,9 @@ static void gp_stroke_path_animation_add_keyframes(Depsgraph *depsgraph, ReportL
start_stroke_idx = i;
delta_time = next_delta_time;
/* find end of that new stroke */
- end_stroke_idx = gp_find_end_of_stroke_idx(gtd, rng, i, nbr_gaps, &nbr_done_gaps,
- tot_gaps_time, delta_time, &next_delta_time);
+ end_stroke_idx = gp_find_end_of_stroke_idx(
+ gtd, rng, i, nbr_gaps, &nbr_done_gaps,
+ tot_gaps_time, delta_time, &next_delta_time);
/* This one should *never* be negative! */
end_stroke_time = time_start + ((gtd->times[end_stroke_idx] + delta_time) / gtd->tot_time * time_range);
}
@@ -530,8 +535,9 @@ static void gp_stroke_path_animation(bContext *C, ReportList *reports, Curve *cu
printf("GP Stroke Path Conversion: Starting keying!\n");
}
- gp_stroke_path_animation_add_keyframes(depsgraph, reports, ptr, prop, fcu, cu, gtd, rng, time_range,
- nbr_gaps, tot_gaps_time);
+ gp_stroke_path_animation_add_keyframes(
+ depsgraph, reports, ptr, prop, fcu, cu, gtd, rng, time_range,
+ nbr_gaps, tot_gaps_time);
BLI_rng_free(rng);
}
@@ -562,9 +568,10 @@ static void gp_stroke_path_animation(bContext *C, ReportList *reports, Curve *cu
/* convert stroke to 3d path */
/* helper */
-static void gp_stroke_to_path_add_point(tGpTimingData *gtd, BPoint *bp, const float p[3], const float prev_p[3],
- const bool do_gtd, const double inittime, const float time,
- const float width, const float rad_fac, float minmax_weights[2])
+static void gp_stroke_to_path_add_point(
+ tGpTimingData *gtd, BPoint *bp, const float p[3], const float prev_p[3],
+ const bool do_gtd, const double inittime, const float time,
+ const float width, const float rad_fac, float minmax_weights[2])
{
copy_v3_v3(bp->vec, p);
bp->vec[3] = 1.0f;
@@ -587,9 +594,10 @@ static void gp_stroke_to_path_add_point(tGpTimingData *gtd, BPoint *bp, const fl
}
}
-static void gp_stroke_to_path(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu, rctf *subrect, Nurb **curnu,
- float minmax_weights[2], const float rad_fac, bool stitch, const bool add_start_point,
- const bool add_end_point, tGpTimingData *gtd)
+static void gp_stroke_to_path(
+ bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu, rctf *subrect, Nurb **curnu,
+ float minmax_weights[2], const float rad_fac, bool stitch, const bool add_start_point,
+ const bool add_end_point, tGpTimingData *gtd)
{
bGPDspoint *pt;
Nurb *nu = (curnu) ? *curnu : NULL;
@@ -666,8 +674,9 @@ static void gp_stroke_to_path(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstr
}
}
bp++;
- gp_stroke_to_path_add_point(gtd, bp, p1, (bp - 1)->vec, do_gtd, gps->prev->inittime, dt1,
- 0.0f, rad_fac, minmax_weights);
+ gp_stroke_to_path_add_point(
+ gtd, bp, p1, (bp - 1)->vec, do_gtd, gps->prev->inittime, dt1,
+ 0.0f, rad_fac, minmax_weights);
/* Second point */
/* Note dt2 is always negative, which marks the gap. */
@@ -729,8 +738,9 @@ static void gp_stroke_to_path(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstr
/* get coordinates to add at */
gp_strokepoint_convertcoords(C, gpd, gpl, gps, pt, p, subrect);
- gp_stroke_to_path_add_point(gtd, bp, p, (prev_bp) ? prev_bp->vec : p, do_gtd, gps->inittime, pt->time,
- width, rad_fac, minmax_weights);
+ gp_stroke_to_path_add_point(
+ gtd, bp, p, (prev_bp) ? prev_bp->vec : p, do_gtd, gps->inittime, pt->time,
+ width, rad_fac, minmax_weights);
prev_bp = bp;
}
@@ -769,10 +779,11 @@ static void gp_stroke_to_path(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstr
/* convert stroke to 3d bezier */
/* helper */
-static void gp_stroke_to_bezier_add_point(tGpTimingData *gtd, BezTriple *bezt,
- const float p[3], const float h1[3], const float h2[3], const float prev_p[3],
- const bool do_gtd, const double inittime, const float time,
- const float width, const float rad_fac, float minmax_weights[2])
+static void gp_stroke_to_bezier_add_point(
+ tGpTimingData *gtd, BezTriple *bezt,
+ const float p[3], const float h1[3], const float h2[3], const float prev_p[3],
+ const bool do_gtd, const double inittime, const float time,
+ const float width, const float rad_fac, float minmax_weights[2])
{
copy_v3_v3(bezt->vec[0], h1);
copy_v3_v3(bezt->vec[1], p);
@@ -797,9 +808,10 @@ static void gp_stroke_to_bezier_add_point(tGpTimingData *gtd, BezTriple *bezt,
}
}
-static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu, rctf *subrect, Nurb **curnu,
- float minmax_weights[2], const float rad_fac, bool stitch, const bool add_start_point,
- const bool add_end_point, tGpTimingData *gtd)
+static void gp_stroke_to_bezier(
+ bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDstroke *gps, Curve *cu, rctf *subrect, Nurb **curnu,
+ float minmax_weights[2], const float rad_fac, bool stitch, const bool add_start_point,
+ const bool add_end_point, tGpTimingData *gtd)
{
bGPDspoint *pt;
Nurb *nu = (curnu) ? *curnu : NULL;
@@ -918,15 +930,17 @@ static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDs
interp_v3_v3v3(h1, p1, bezt->vec[1], BEZT_HANDLE_FAC);
interp_v3_v3v3(h2, p1, p2, BEZT_HANDLE_FAC);
bezt++;
- gp_stroke_to_bezier_add_point(gtd, bezt, p1, h1, h2, (bezt - 1)->vec[1], do_gtd, gps->prev->inittime, dt1,
- 0.0f, rad_fac, minmax_weights);
+ gp_stroke_to_bezier_add_point(
+ gtd, bezt, p1, h1, h2, (bezt - 1)->vec[1], do_gtd, gps->prev->inittime, dt1,
+ 0.0f, rad_fac, minmax_weights);
/* Second point */
interp_v3_v3v3(h1, p2, p1, BEZT_HANDLE_FAC);
interp_v3_v3v3(h2, p2, p3d_cur, BEZT_HANDLE_FAC);
bezt++;
- gp_stroke_to_bezier_add_point(gtd, bezt, p2, h1, h2, p1, do_gtd, gps->inittime, dt2,
- 0.0f, rad_fac, minmax_weights);
+ gp_stroke_to_bezier_add_point(
+ gtd, bezt, p2, h1, h2, p1, do_gtd, gps->inittime, dt2,
+ 0.0f, rad_fac, minmax_weights);
old_nbezt += 2;
copy_v3_v3(p3d_prev, p2);
@@ -950,8 +964,9 @@ static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDs
interp_v3_v3v3(h1, p, p3d_cur, -BEZT_HANDLE_FAC);
interp_v3_v3v3(h2, p, p3d_cur, BEZT_HANDLE_FAC);
bezt = &nu->bezt[old_nbezt];
- gp_stroke_to_bezier_add_point(gtd, bezt, p, h1, h2, p, do_gtd, gps->inittime, dt,
- 0.0f, rad_fac, minmax_weights);
+ gp_stroke_to_bezier_add_point(
+ gtd, bezt, p, h1, h2, p, do_gtd, gps->inittime, dt,
+ 0.0f, rad_fac, minmax_weights);
old_nbezt++;
copy_v3_v3(p3d_prev, p);
@@ -979,8 +994,9 @@ static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDs
interp_v3_v3v3(h2, p3d_cur, p3d_prev, -BEZT_HANDLE_FAC);
}
- gp_stroke_to_bezier_add_point(gtd, bezt, p3d_cur, h1, h2, prev_bezt ? prev_bezt->vec[1] : p3d_cur,
- do_gtd, gps->inittime, pt->time, width, rad_fac, minmax_weights);
+ gp_stroke_to_bezier_add_point(
+ gtd, bezt, p3d_cur, h1, h2, prev_bezt ? prev_bezt->vec[1] : p3d_cur,
+ do_gtd, gps->inittime, pt->time, width, rad_fac, minmax_weights);
/* shift coord vects */
copy_v3_v3(p3d_prev, p3d_cur);
@@ -1018,8 +1034,9 @@ static void gp_stroke_to_bezier(bContext *C, bGPdata *gpd, bGPDlayer *gpl, bGPDs
interp_v3_v3v3(h1, p, prev_bezt->vec[1], BEZT_HANDLE_FAC);
interp_v3_v3v3(h2, p, prev_bezt->vec[1], -BEZT_HANDLE_FAC);
/* Note bezt has already been incremented in main loop above, so it points to the right place. */
- gp_stroke_to_bezier_add_point(gtd, bezt, p, h1, h2, prev_bezt->vec[1], do_gtd, gps->inittime, dt,
- 0.0f, rad_fac, minmax_weights);
+ gp_stroke_to_bezier_add_point(
+ gtd, bezt, p, h1, h2, prev_bezt->vec[1], do_gtd, gps->inittime, dt,
+ 0.0f, rad_fac, minmax_weights);
}
/* must calculate handles or else we crash */
@@ -1122,8 +1139,9 @@ static int gp_camera_view_subrect(bContext *C, rctf *subrect)
}
/* convert a given grease-pencil layer to a 3d-curve representation (using current view if appropriate) */
-static void gp_layer_to_curve(bContext *C, ReportList *reports, bGPdata *gpd, bGPDlayer *gpl, const int mode,
- const bool norm_weights, const float rad_fac, const bool link_strokes, tGpTimingData *gtd)
+static void gp_layer_to_curve(
+ bContext *C, ReportList *reports, bGPdata *gpd, bGPDlayer *gpl, const int mode,
+ const bool norm_weights, const float rad_fac, const bool link_strokes, tGpTimingData *gtd)
{
struct Main *bmain = CTX_data_main(C);
ViewLayer *view_layer = CTX_data_view_layer(C);
@@ -1190,13 +1208,15 @@ static void gp_layer_to_curve(bContext *C, ReportList *reports, bGPdata *gpd, bG
switch (mode) {
case GP_STROKECONVERT_PATH:
- gp_stroke_to_path(C, gpd, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch,
- add_start_point, add_end_point, gtd);
+ gp_stroke_to_path(
+ C, gpd, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch,
+ add_start_point, add_end_point, gtd);
break;
case GP_STROKECONVERT_CURVE:
case GP_STROKECONVERT_POLY: /* convert after */
- gp_stroke_to_bezier(C, gpd, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch,
- add_start_point, add_end_point, gtd);
+ gp_stroke_to_bezier(
+ C, gpd, gpl, gps, cu, subrect_ptr, &nu, minmax_weights, rad_fac, stitch,
+ add_start_point, add_end_point, gtd);
break;
default:
BLI_assert(!"invalid mode");
diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c
index 068478af325..5cc5c55b3df 100644
--- a/source/blender/editors/gpencil/gpencil_data.c
+++ b/source/blender/editors/gpencil/gpencil_data.c
@@ -338,7 +338,8 @@ static int gp_layer_move_exec(bContext *C, wmOperator *op)
bGPdata *gpd = ED_gpencil_data_get_active(C);
bGPDlayer *gpl = BKE_gpencil_layer_getactive(gpd);
- int direction = RNA_enum_get(op->ptr, "type");
+ const bool reverse = (bool)(U.gp_settings & GP_PAINT_REVERSE_LAYERS);
+ const int direction = RNA_enum_get(op->ptr, "type") * (reverse ? -1 : 1);
/* sanity checks */
if (ELEM(NULL, gpd, gpl))
@@ -1083,8 +1084,18 @@ void GPENCIL_OT_layer_isolate(wmOperatorType *ot)
static int gp_merge_layer_exec(bContext *C, wmOperator *op)
{
bGPdata *gpd = ED_gpencil_data_get_active(C);
- bGPDlayer *gpl_current = BKE_gpencil_layer_getactive(gpd);
- bGPDlayer *gpl_next = gpl_current->next;
+ const bool reverse = (bool)(U.gp_settings & GP_PAINT_REVERSE_LAYERS);
+ bGPDlayer *gpl_current = NULL;
+ bGPDlayer *gpl_next = NULL;
+
+ if (!reverse) {
+ gpl_current = BKE_gpencil_layer_getactive(gpd);
+ gpl_next = gpl_current->next;
+ }
+ else {
+ gpl_next = BKE_gpencil_layer_getactive(gpd);
+ gpl_current = gpl_next->prev;
+ }
if (ELEM(NULL, gpd, gpl_current, gpl_next)) {
BKE_report(op->reports, RPT_ERROR, "No layers to merge");
@@ -1983,8 +1994,9 @@ static void joined_gpencil_fix_animdata_cb(ID *id, FCurve *fcu, void *user_data)
/* only remap if changed; this still means there will be some waste if there aren't many drivers/keys */
if (!STREQ(old_name, new_name) && strstr(fcu->rna_path, old_name)) {
- fcu->rna_path = BKE_animsys_fix_rna_path_rename(id, fcu->rna_path, "layers",
- old_name, new_name, 0, 0, false);
+ fcu->rna_path = BKE_animsys_fix_rna_path_rename(
+ id, fcu->rna_path, "layers",
+ old_name, new_name, 0, 0, false);
/* we don't want to apply a second remapping on this F-Curve now,
* so stop trying to fix names names
@@ -2018,8 +2030,9 @@ static void joined_gpencil_fix_animdata_cb(ID *id, FCurve *fcu, void *user_data)
if (!STREQ(old_name, new_name)) {
if ((dtar->rna_path) && strstr(dtar->rna_path, old_name)) {
/* Fix up path */
- dtar->rna_path = BKE_animsys_fix_rna_path_rename(id, dtar->rna_path, "layers",
- old_name, new_name, 0, 0, false);
+ dtar->rna_path = BKE_animsys_fix_rna_path_rename(
+ id, dtar->rna_path, "layers",
+ old_name, new_name, 0, 0, false);
break; /* no need to try any more names for layer path */
}
}
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index 923bd1e9f18..7b2eb7d6ecd 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -2192,10 +2192,10 @@ static int gp_snap_to_cursor(bContext *C, wmOperator *op)
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
- Depsgraph *depsgraph = CTX_data_depsgraph(C); \
- Object *obact = CTX_data_active_object(C); \
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
+ Object *obact = CTX_data_active_object(C);
- const bool use_offset = RNA_boolean_get(op->ptr, "use_offset");
+ const bool use_offset = RNA_boolean_get(op->ptr, "use_offset");
const float *cursor_global = ED_view3d_cursor3d_get(scene, v3d)->location;
for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
@@ -2280,10 +2280,10 @@ static int gp_snap_cursor_to_sel(bContext *C, wmOperator *UNUSED(op))
Scene *scene = CTX_data_scene(C);
View3D *v3d = CTX_wm_view3d(C);
- Depsgraph *depsgraph = CTX_data_depsgraph(C); \
- Object *obact = CTX_data_active_object(C); \
+ Depsgraph *depsgraph = CTX_data_depsgraph(C);
+ Object *obact = CTX_data_active_object(C);
- float *cursor = ED_view3d_cursor3d_get(scene, v3d)->location;
+ float *cursor = ED_view3d_cursor3d_get(scene, v3d)->location;
float centroid[3] = {0.0f};
float min[3], max[3];
size_t count = 0;
diff --git a/source/blender/editors/gpencil/gpencil_fill.c b/source/blender/editors/gpencil/gpencil_fill.c
index 3fd26f77449..f940b18dac6 100644
--- a/source/blender/editors/gpencil/gpencil_fill.c
+++ b/source/blender/editors/gpencil/gpencil_fill.c
@@ -127,8 +127,8 @@ typedef struct tGPDfill {
/* draw a given stroke using same thickness and color for all points */
static void gp_draw_basic_stroke(
- tGPDfill *tgpf, bGPDstroke *gps, const float diff_mat[4][4],
- bool cyclic, float ink[4], int flag, float thershold)
+ tGPDfill *tgpf, bGPDstroke *gps, const float diff_mat[4][4],
+ const bool cyclic, const float ink[4], const int flag, const float thershold)
{
bGPDspoint *points = gps->points;
@@ -166,14 +166,14 @@ static void gp_draw_basic_stroke(
col[3] = 1.0f;
}
/* set point */
- immAttrib4fv(color, col);
+ immAttr4fv(color, col);
mul_v3_m4v3(fpt, diff_mat, &pt->x);
immVertex3fv(pos, fpt);
}
if (cyclic && totpoints > 2) {
/* draw line to first point to complete the cycle */
- immAttrib4fv(color, col);
+ immAttr4fv(color, col);
mul_v3_m4v3(fpt, diff_mat, &points->x);
immVertex3fv(pos, fpt);
}
@@ -183,7 +183,7 @@ static void gp_draw_basic_stroke(
}
/* loop all layers */
-static void gp_draw_datablock(tGPDfill *tgpf, float ink[4])
+static void gp_draw_datablock(tGPDfill *tgpf, const float ink[4])
{
/* duplicated: etempFlags */
enum {
@@ -258,8 +258,9 @@ static void gp_draw_datablock(tGPDfill *tgpf, float ink[4])
if ((tgpf->fill_draw_mode == GP_FILL_DMODE_CONTROL) ||
(tgpf->fill_draw_mode == GP_FILL_DMODE_BOTH))
{
- gp_draw_basic_stroke(tgpf, gps, tgpw.diff_mat, gps->flag & GP_STROKE_CYCLIC, ink,
- tgpf->flag, tgpf->fill_threshold);
+ gp_draw_basic_stroke(
+ tgpf, gps, tgpw.diff_mat, gps->flag & GP_STROKE_CYCLIC, ink,
+ tgpf->flag, tgpf->fill_threshold);
}
}
}
@@ -322,7 +323,7 @@ static void gp_render_offscreen(tGPDfill *tgpf)
GPU_matrix_set(tgpf->rv3d->viewmat);
/* draw strokes */
- float ink[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
+ float ink[4] = {1.0f, 0.0f, 0.0f, 1.0f};
gp_draw_datablock(tgpf, ink);
/* restore size */
@@ -355,10 +356,10 @@ static void gp_render_offscreen(tGPDfill *tgpf)
}
/* return pixel data (rgba) at index */
-static void get_pixel(ImBuf *ibuf, int idx, float r_col[4])
+static void get_pixel(const ImBuf *ibuf, const int idx, float r_col[4])
{
if (ibuf->rect_float) {
- float *frgba = &ibuf->rect_float[idx * 4];
+ const float *frgba = &ibuf->rect_float[idx * 4];
copy_v4_v4(r_col, frgba);
}
else {
@@ -636,15 +637,15 @@ static void gpencil_get_outline_points(tGPDfill *tgpf)
bool start_found = false;
const int NEIGHBOR_COUNT = 8;
- int offset[8][2] = {
- { -1, -1 },
- { 0, -1 },
- { 1, -1 },
- { 1, 0 },
- { 1, 1 },
- { 0, 1 },
- { -1, 1 },
- { -1, 0 }
+ const int offset[8][2] = {
+ {-1, -1},
+ {0, -1},
+ {1, -1},
+ {1, 0},
+ {1, 1},
+ {0, 1},
+ {-1, 1},
+ {-1, 0}
};
tgpf->stack = BLI_stack_new(sizeof(int[2]), __func__);
@@ -653,7 +654,7 @@ static void gpencil_get_outline_points(tGPDfill *tgpf)
int imagesize = ibuf->x * ibuf->y;
/* find the initial point to start outline analysis */
- for (int idx = imagesize; idx >= 0; idx--) {
+ for (int idx = imagesize - 1; idx != 0; idx--) {
get_pixel(ibuf, idx, rgba);
if (rgba[1] == 1.0f) {
boundary_co[0] = idx % ibuf->x;
@@ -919,10 +920,12 @@ static void gpencil_stroke_from_buffer(tGPDfill *tgpf)
/* if axis locked, reproject to plane locked */
if ((tgpf->lock_axis > GP_LOCKAXIS_NONE) && ((ts->gpencil_v3d_align & GP_PROJECT_DEPTH_VIEW) == 0)) {
float origin[3];
- ED_gp_get_drawing_reference(tgpf->v3d, tgpf->scene, tgpf->ob, tgpf->gpl,
- ts->gpencil_v3d_align, origin);
- ED_gp_project_stroke_to_plane(tgpf->ob, tgpf->rv3d, gps, origin,
- tgpf->lock_axis - 1);
+ ED_gp_get_drawing_reference(
+ tgpf->v3d, tgpf->scene, tgpf->ob, tgpf->gpl,
+ ts->gpencil_v3d_align, origin);
+ ED_gp_project_stroke_to_plane(
+ tgpf->ob, tgpf->rv3d, gps, origin,
+ tgpf->lock_axis - 1);
}
/* if parented change position relative to parent object */
@@ -952,7 +955,7 @@ static void gpencil_draw_boundary_lines(const bContext *UNUSED(C), tGPDfill *tgp
if (!tgpf->gpd) {
return;
}
- float ink[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
+ const float ink[4] = {1.0f, 0.0f, 0.0f, 1.0f};
gp_draw_datablock(tgpf, ink);
}
diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h
index 42d15c92ff2..f7117189c32 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -192,16 +192,19 @@ typedef struct GP_SpaceConversion {
float mat[4][4]; /* transform matrix on the strokes (introduced in [b770964]) */
} GP_SpaceConversion;
-bool gp_stroke_inside_circle(const int mval[2], const int UNUSED(mvalo[2]),
- int rad, int x0, int y0, int x1, int y1);
+bool gp_stroke_inside_circle(
+ const int mval[2], const int UNUSED(mvalo[2]),
+ int rad, int x0, int y0, int x1, int y1);
void gp_point_conversion_init(struct bContext *C, GP_SpaceConversion *r_gsc);
-void gp_point_to_xy(GP_SpaceConversion *settings, struct bGPDstroke *gps, struct bGPDspoint *pt,
- int *r_x, int *r_y);
+void gp_point_to_xy(
+ GP_SpaceConversion *settings, struct bGPDstroke *gps, struct bGPDspoint *pt,
+ int *r_x, int *r_y);
-void gp_point_to_xy_fl(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
- float *r_x, float *r_y);
+void gp_point_to_xy_fl(
+ GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
+ float *r_x, float *r_y);
void gp_point_to_parent_space(bGPDspoint *pt, float diff_mat[4][4], bGPDspoint *r_pt);
/**
diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c
index eec059a59d1..ed3eab7b642 100644
--- a/source/blender/editors/gpencil/gpencil_ops.c
+++ b/source/blender/editors/gpencil/gpencil_ops.c
@@ -590,6 +590,10 @@ static void ed_keymap_gpencil_painting(wmKeyConfig *keyconf)
/* set poll callback - so that this keymap only gets enabled when stroke paintmode is enabled */
keymap->poll = gp_stroke_paintmode_poll;
+ /* Shift-FKEY = Brush Strength */
+ kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_string_set(kmi->ptr, "data_path_primary", "tool_settings.gpencil_paint.brush.gpencil_settings.pen_strength");
+
/* FKEY = Brush Size */
kmi = WM_keymap_add_item(keymap, "WM_OT_radial_control", FKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "data_path_primary", "tool_settings.gpencil_paint.brush.size");
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index 85479de7a77..3650ae644fb 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -563,8 +563,8 @@ static short gp_stroke_addpoint(
tGPspoint *pt;
ToolSettings *ts = p->scene->toolsettings;
Object *obact = (Object *)p->ownerPtr.data;
- Depsgraph *depsgraph = p->depsgraph; \
- RegionView3D *rv3d = p->ar->regiondata;
+ Depsgraph *depsgraph = p->depsgraph;
+ RegionView3D *rv3d = p->ar->regiondata;
View3D *v3d = p->sa->spacedata.first;
MaterialGPencilStyle *gp_style = p->material->gp_style;
const int def_nr = obact->actdef - 1;
@@ -833,81 +833,6 @@ static short gp_stroke_addpoint(
return GP_STROKEADD_INVALID;
}
-/* simplify a stroke (in buffer) before storing it
- * - applies a reverse Chaikin filter
- * - code adapted from etch-a-ton branch
- */
-static void gp_stroke_simplify(tGPsdata *p)
-{
- bGPdata *gpd = p->gpd;
- tGPspoint *old_points = (tGPspoint *)gpd->runtime.sbuffer;
- short num_points = gpd->runtime.sbuffer_size;
- short flag = gpd->runtime.sbuffer_sflag;
- short i, j;
-
- /* only simplify if simplification is enabled, and we're not doing a straight line */
- if (!(U.gp_settings & GP_PAINT_DOSIMPLIFY) || (p->paintmode == GP_PAINTMODE_DRAW_STRAIGHT))
- return;
-
- /* don't simplify if less than 4 points in buffer */
- if ((num_points <= 4) || (old_points == NULL))
- return;
-
- /* clear buffer (but don't free mem yet) so that we can write to it
- * - firstly set sbuffer to NULL, so a new one is allocated
- * - secondly, reset flag after, as it gets cleared auto
- */
- gpd->runtime.sbuffer = NULL;
- gp_session_validatebuffer(p);
- gpd->runtime.sbuffer_sflag = flag;
-
- /* macro used in loop to get position of new point
- * - used due to the mixture of datatypes in use here
- */
-#define GP_SIMPLIFY_AVPOINT(offs, sfac) \
- { \
- co[0] += (float)(old_points[offs].x * sfac); \
- co[1] += (float)(old_points[offs].y * sfac); \
- pressure += old_points[offs].pressure * sfac; \
- time += old_points[offs].time * sfac; \
- } (void)0
-
- /* XXX Here too, do not lose start and end points! */
- gp_stroke_addpoint(p, &old_points->x, old_points->pressure, p->inittime + (double)old_points->time);
- for (i = 0, j = 0; i < num_points; i++) {
- if (i - j == 3) {
- float co[2], pressure, time;
- int mco[2];
-
- /* initialize values */
- co[0] = 0.0f;
- co[1] = 0.0f;
- pressure = 0.0f;
- time = 0.0f;
-
- /* using macro, calculate new point */
- GP_SIMPLIFY_AVPOINT(j, -0.25f);
- GP_SIMPLIFY_AVPOINT(j + 1, 0.75f);
- GP_SIMPLIFY_AVPOINT(j + 2, 0.75f);
- GP_SIMPLIFY_AVPOINT(j + 3, -0.25f);
-
- /* set values for adding */
- mco[0] = (int)co[0];
- mco[1] = (int)co[1];
-
- /* ignore return values on this... assume to be ok for now */
- gp_stroke_addpoint(p, mco, pressure, p->inittime + (double)time);
-
- j += 2;
- }
- }
- gp_stroke_addpoint(p, &old_points[num_points - 1].x, old_points[num_points - 1].pressure,
- p->inittime + (double)old_points[num_points - 1].time);
-
- /* free old buffer */
- MEM_freeN(old_points);
-}
-
/* make a new stroke from the buffer data */
static void gp_stroke_newfrombuffer(tGPsdata *p)
{
@@ -2201,9 +2126,6 @@ static void gp_paint_strokeend(tGPsdata *p)
/* check if doing eraser or not */
if ((p->gpd->runtime.sbuffer_sflag & GP_STROKE_ERASER) == 0) {
- /* simplify stroke before transferring? */
- gp_stroke_simplify(p);
-
/* transfer stroke to frame */
gp_stroke_newfrombuffer(p);
}
diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c
index eb4307b9f86..77a838d2f22 100644
--- a/source/blender/editors/gpencil/gpencil_utils.c
+++ b/source/blender/editors/gpencil/gpencil_utils.c
@@ -393,7 +393,7 @@ const EnumPropertyItem *ED_gpencil_layers_with_new_enum_itemf(
item_tmp.identifier = "__CREATE__";
item_tmp.name = "New Layer";
item_tmp.value = -1;
- item_tmp.icon = ICON_ZOOMIN;
+ item_tmp.icon = ICON_ADD;
RNA_enum_item_add(&item, &totitem, &item_tmp);
/* separator */
@@ -434,8 +434,9 @@ const EnumPropertyItem *ED_gpencil_layers_with_new_enum_itemf(
* \param x0, y0 The screen-space x and y coordinates of the start of the stroke segment
* \param x1, y1 The screen-space x and y coordinates of the end of the stroke segment
*/
-bool gp_stroke_inside_circle(const int mval[2], const int UNUSED(mvalo[2]),
- int rad, int x0, int y0, int x1, int y1)
+bool gp_stroke_inside_circle(
+ const int mval[2], const int UNUSED(mvalo[2]),
+ int rad, int x0, int y0, int x1, int y1)
{
/* simple within-radius check for now */
const float mval_fl[2] = {mval[0], mval[1]};
@@ -550,9 +551,9 @@ void gp_point_conversion_init(bContext *C, GP_SpaceConversion *r_gsc)
/**
* Convert point to parent space
*
- * \param pt Original point
- * \param diff_mat Matrix with the difference between original parent matrix
- * \param[out] r_pt Pointer to new point after apply matrix
+ * \param pt: Original point
+ * \param diff_mat: Matrix with the difference between original parent matrix
+ * \param[out] r_pt: Pointer to new point after apply matrix
*/
void gp_point_to_parent_space(bGPDspoint *pt, float diff_mat[4][4], bGPDspoint *r_pt)
{
@@ -610,8 +611,9 @@ void gp_apply_parent_point(Depsgraph *depsgraph, Object *obact, bGPdata *gpd, bG
*
* \warning This assumes that the caller has already checked whether the stroke in question can be drawn.
*/
-void gp_point_to_xy(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
- int *r_x, int *r_y)
+void gp_point_to_xy(
+ GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
+ int *r_x, int *r_y)
{
ARegion *ar = gsc->ar;
View2D *v2d = gsc->v2d;
@@ -663,8 +665,9 @@ void gp_point_to_xy(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
*
* \warning This assumes that the caller has already checked whether the stroke in question can be drawn
*/
-void gp_point_to_xy_fl(GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
- float *r_x, float *r_y)
+void gp_point_to_xy_fl(
+ GP_SpaceConversion *gsc, bGPDstroke *gps, bGPDspoint *pt,
+ float *r_x, float *r_y)
{
ARegion *ar = gsc->ar;
View2D *v2d = gsc->v2d;
@@ -929,8 +932,8 @@ void ED_gp_project_point_to_plane(Object *ob, RegionView3D *rv3d, const float or
/**
* Subdivide a stroke once, by adding a point half way between each pair of existing points
- * \param gps Stroke data
- * \param subdivide Number of times to subdivide
+ * \param gps: Stroke data
+ * \param subdivide: Number of times to subdivide
*/
void gp_subdivide_stroke(bGPDstroke *gps, const int subdivide)
{
@@ -1024,8 +1027,8 @@ void gp_subdivide_stroke(bGPDstroke *gps, const int subdivide)
/**
* Add randomness to stroke
- * \param gps Stroke data
- * \param brush Brush data
+ * \param gps: Stroke data
+ * \param brush: Brush data
*/
void gp_randomize_stroke(bGPDstroke *gps, Brush *brush, RNG *rng)
{
@@ -1679,10 +1682,11 @@ void ED_gpencil_toggle_brush_cursor(bContext *C, bool enable, void *customdata)
gset->paintcursor = NULL;
}
/* enable cursor */
- gset->paintcursor = WM_paint_cursor_activate(CTX_wm_manager(C),
- NULL,
- gp_brush_drawcursor,
- (lastpost) ? customdata : NULL);
+ gset->paintcursor = WM_paint_cursor_activate(
+ CTX_wm_manager(C),
+ NULL,
+ gp_brush_drawcursor,
+ (lastpost) ? customdata : NULL);
}
}
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index 713cc21c8ec..560ed0cf0e0 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -469,6 +469,7 @@ struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(
struct GPUOffScreen *ofs, char err_out[256]);
struct Base *ED_view3d_give_base_under_cursor(struct bContext *C, const int mval[2]);
+struct Object *ED_view3d_give_object_under_cursor(struct bContext *C, const int mval[2]);
void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar, bool do_clip);
void ED_view3d_update_viewmat(
struct Depsgraph *depsgraph, struct Scene *scene, struct View3D *v3d, struct ARegion *ar,
diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h
index 45cc1046932..a463cfdb633 100644
--- a/source/blender/editors/include/UI_icons.h
+++ b/source/blender/editors/include/UI_icons.h
@@ -28,106 +28,124 @@
* \ingroup editorui
*/
-/* Note: this is included twice with different #defines for DEF_ICON
- * once from UI_resources.h for the internal icon enum and
- * once for interface_api.c for the definition of the RNA enum for the icons */
+/* Note: this is included multiple times with different #defines for DEF_ICON. */
+
+/* Auto define more specific types for places that do not need the distinction. */
+#ifndef DEF_ICON_COLLECTION
+# define DEF_ICON_COLLECTION DEF_ICON
+#endif
+#ifndef DEF_ICON_OBJECT
+# define DEF_ICON_OBJECT DEF_ICON
+#endif
+#ifndef DEF_ICON_OBJECT_DATA
+# define DEF_ICON_OBJECT_DATA DEF_ICON
+#endif
+#ifndef DEF_ICON_MODIFIER
+# define DEF_ICON_MODIFIER DEF_ICON
+#endif
+#ifndef DEF_ICON_SHADING
+# define DEF_ICON_SHADING DEF_ICON
+#endif
+#ifndef DEF_ICON_COLOR
+# define DEF_ICON_COLOR DEF_ICON
+#endif
/* ICON_ prefix added */
-DEF_ICON(NONE)
+DEF_ICON_COLOR(NONE)
DEF_ICON(QUESTION)
DEF_ICON(ERROR)
DEF_ICON(CANCEL)
-DEF_ICON_MONO(TRIA_RIGHT)
-DEF_ICON_MONO(TRIA_DOWN)
-DEF_ICON_MONO(TRIA_LEFT)
-DEF_ICON_MONO(TRIA_UP)
-DEF_ICON_MONO(ARROW_LEFTRIGHT)
-DEF_ICON_MONO(PLUS)
-DEF_ICON_MONO(DISCLOSURE_TRI_RIGHT)
-DEF_ICON_MONO(DISCLOSURE_TRI_DOWN)
-DEF_ICON_MONO(RADIOBUT_OFF)
-DEF_ICON_MONO(RADIOBUT_ON)
-DEF_ICON(MENU_PANEL)
+DEF_ICON(TRIA_RIGHT)
+DEF_ICON(TRIA_DOWN)
+DEF_ICON(TRIA_LEFT)
+DEF_ICON(TRIA_UP)
+DEF_ICON(ARROW_LEFTRIGHT)
+DEF_ICON(PLUS)
+DEF_ICON(DISCLOSURE_TRI_RIGHT)
+DEF_ICON(DISCLOSURE_TRI_DOWN)
+DEF_ICON(RADIOBUT_OFF)
+DEF_ICON(RADIOBUT_ON)
+DEF_ICON_COLOR(MENU_PANEL)
DEF_ICON(BLENDER)
-DEF_ICON_MONO(GRIP)
-DEF_ICON_MONO(DOT)
-DEF_ICON_MONO(COLLAPSEMENU)
-DEF_ICON_MONO(X)
+DEF_ICON(GRIP)
+DEF_ICON(DOT)
+DEF_ICON(COLLAPSEMENU)
+DEF_ICON(X)
DEF_ICON_BLANK(5) /* XXX 'DOWNARROW' icon! */
-DEF_ICON(GO_LEFT)
-DEF_ICON(PLUG)
-DEF_ICON(UI)
+DEF_ICON_COLOR(GO_LEFT)
+DEF_ICON_COLOR(PLUG)
+DEF_ICON_COLOR(UI)
DEF_ICON(NODE)
DEF_ICON(NODE_SEL)
/* ui */
-DEF_ICON(FULLSCREEN)
-DEF_ICON(SPLITSCREEN)
-DEF_ICON_MONO(RIGHTARROW_THIN)
-DEF_ICON_MONO(BORDERMOVE)
-DEF_ICON_MONO(VIEWZOOM)
-DEF_ICON_MONO(ZOOMIN)
-DEF_ICON_MONO(ZOOMOUT)
-DEF_ICON_MONO(PANEL_CLOSE)
-DEF_ICON(COPY_ID)
+DEF_ICON_COLOR(FULLSCREEN)
+DEF_ICON(WORKSPACE)
+DEF_ICON(RIGHTARROW_THIN)
+DEF_ICON(BORDERMOVE)
+DEF_ICON(VIEWZOOM)
+DEF_ICON(ADD)
+DEF_ICON(REMOVE)
+DEF_ICON(PANEL_CLOSE)
+DEF_ICON_COLOR(COPY_ID)
DEF_ICON(EYEDROPPER)
-DEF_ICON(LINK_AREA)
+DEF_ICON_COLOR(LINK_AREA)
DEF_ICON(AUTO)
-DEF_ICON_MONO(CHECKBOX_DEHLT)
-DEF_ICON_MONO(CHECKBOX_HLT)
-DEF_ICON_MONO(UNLOCKED)
-DEF_ICON_MONO(LOCKED)
-DEF_ICON_MONO(UNPINNED)
-DEF_ICON_MONO(PINNED)
-DEF_ICON_MONO(SCREEN_BACK)
-DEF_ICON_MONO(RIGHTARROW)
-DEF_ICON_MONO(DOWNARROW_HLT)
-DEF_ICON(DOTSUP)
-DEF_ICON(DOTSDOWN)
+DEF_ICON(CHECKBOX_DEHLT)
+DEF_ICON(CHECKBOX_HLT)
+DEF_ICON(UNLOCKED)
+DEF_ICON(LOCKED)
+DEF_ICON(UNPINNED)
+DEF_ICON(PINNED)
+DEF_ICON(SCREEN_BACK)
+DEF_ICON(RIGHTARROW)
+DEF_ICON(DOWNARROW_HLT)
+DEF_ICON_COLOR(DOTSUP)
+DEF_ICON_COLOR(DOTSDOWN)
DEF_ICON(LINK)
DEF_ICON(INLINK)
-DEF_ICON(PLUGIN)
+DEF_ICON_COLOR(PLUGIN)
/* various ui */
DEF_ICON(HELP)
DEF_ICON(GHOST_ENABLED)
DEF_ICON(COLOR) /* see COLOR_RED/GREEN/BLUE */
-DEF_ICON_MONO(LINKED)
-DEF_ICON_MONO(UNLINKED)
-DEF_ICON_MONO(HAND)
-DEF_ICON_MONO(ZOOM_ALL)
-DEF_ICON_MONO(ZOOM_SELECTED)
-DEF_ICON_MONO(ZOOM_PREVIOUS)
-DEF_ICON_MONO(ZOOM_IN)
-DEF_ICON_MONO(ZOOM_OUT)
-DEF_ICON(RENDER_REGION)
-DEF_ICON(BORDER_RECT)
-DEF_ICON(BORDER_LASSO)
+DEF_ICON(LINKED)
+DEF_ICON(UNLINKED)
+DEF_ICON(HAND)
+DEF_ICON(ZOOM_ALL)
+DEF_ICON(ZOOM_SELECTED)
+DEF_ICON(ZOOM_PREVIOUS)
+DEF_ICON(ZOOM_IN)
+DEF_ICON(ZOOM_OUT)
+DEF_ICON_COLOR(RENDER_REGION)
+DEF_ICON_COLOR(BORDER_RECT)
+DEF_ICON_COLOR(BORDER_LASSO)
DEF_ICON(FREEZE)
DEF_ICON(STYLUS_PRESSURE)
DEF_ICON(GHOST_DISABLED)
-DEF_ICON(NEW)
+DEF_ICON(FILE_NEW)
DEF_ICON(FILE_TICK)
DEF_ICON(QUIT)
DEF_ICON(URL)
DEF_ICON(RECOVER_LAST)
-DEF_ICON_BLANK(30)
-DEF_ICON_MONO(FULLSCREEN_ENTER)
-DEF_ICON_MONO(FULLSCREEN_EXIT)
-DEF_ICON(BLANK1) // Not actually blank - this is used all over the place
+DEF_ICON(30)
+DEF_ICON(FULLSCREEN_ENTER)
+DEF_ICON(FULLSCREEN_EXIT)
+DEF_ICON(ONIONSKIN)
/* BUTTONS */
-DEF_ICON(LIGHT)
-DEF_ICON(MATERIAL)
-DEF_ICON(TEXTURE)
+DEF_ICON_SHADING(LIGHT)
+DEF_ICON_SHADING(MATERIAL)
+DEF_ICON_SHADING(TEXTURE)
DEF_ICON(ANIM)
-DEF_ICON(WORLD)
+DEF_ICON_SHADING(WORLD)
DEF_ICON(SCENE)
DEF_ICON(EDIT)
DEF_ICON(GAME)
DEF_ICON(RADIO)
-DEF_ICON(SCRIPT)
-DEF_ICON(PARTICLES)
+DEF_ICON_COLOR(SCRIPT)
+DEF_ICON_MODIFIER(PARTICLES)
DEF_ICON(PHYSICS)
DEF_ICON(SPEAKER)
DEF_ICON(TEXTURE_SHADED)
@@ -142,32 +160,32 @@ DEF_ICON_BLANK(49)
DEF_ICON_BLANK(50)
DEF_ICON_BLANK(51)
DEF_ICON_BLANK(52)
-DEF_ICON_BLANK(52b)
+DEF_ICON_COLOR(BLANK1) // Not actually blank - this is used all over the place
/* EDITORS */
DEF_ICON(VIEW3D)
-DEF_ICON(IPO)
-DEF_ICON(OOPS)
-DEF_ICON(BUTS)
-DEF_ICON(FILESEL)
-DEF_ICON(IMAGE_COL)
+DEF_ICON(GRAPH)
+DEF_ICON(OUTLINER)
+DEF_ICON(PROPERTIES)
+DEF_ICON(FILEBROWSER)
+DEF_ICON(IMAGE)
DEF_ICON(INFO)
DEF_ICON(SEQUENCE)
DEF_ICON(TEXT)
-DEF_ICON(IMASEL)
+DEF_ICON_BLANK(62)
DEF_ICON(SOUND)
DEF_ICON(ACTION)
DEF_ICON(NLA)
-DEF_ICON(SCRIPTWIN)
+DEF_ICON(PREFERENCES)
DEF_ICON(TIME)
DEF_ICON(NODETREE)
DEF_ICON(LOGIC)
DEF_ICON(CONSOLE)
-DEF_ICON(PREFERENCES)
+DEF_ICON_BLANK(54)
DEF_ICON(CLIP)
DEF_ICON(ASSET_MANAGER)
-DEF_ICON_BLANK(57)
-DEF_ICON_BLANK(58)
-DEF_ICON_BLANK(59)
+DEF_ICON(NODE_COMPOSITING)
+DEF_ICON(NODE_TEXTURE)
+DEF_ICON(NODE_MATERIAL)
DEF_ICON_BLANK(60)
DEF_ICON_BLANK(61)
@@ -181,151 +199,151 @@ DEF_ICON(WPAINT_HLT)
DEF_ICON(SCULPTMODE_HLT)
DEF_ICON(POSE_HLT)
DEF_ICON(PARTICLEMODE)
-DEF_ICON(LIGHTPAINT)
-DEF_ICON(GREASEPENCIL_STROKE_PAINT)
+DEF_ICON_COLOR(LIGHTPAINT)
+DEF_ICON_COLOR(GREASEPENCIL_STROKE_PAINT)
DEF_ICON_BLANK(64)
DEF_ICON_BLANK(65)
DEF_ICON_BLANK(66)
DEF_ICON_BLANK(67)
DEF_ICON_BLANK(68)
-DEF_ICON_BLANK(69)
-DEF_ICON_BLANK(70)
-DEF_ICON_BLANK(71)
-DEF_ICON_BLANK(72)
-DEF_ICON_BLANK(73)
-DEF_ICON_BLANK(74)
-DEF_ICON_BLANK(75)
-DEF_ICON_BLANK(76)
-DEF_ICON_BLANK(77)
+DEF_ICON(TRACKING)
+DEF_ICON(TRACKING_BACKWARDS)
+DEF_ICON(TRACKING_FORWARDS)
+DEF_ICON(TRACKING_BACKWARDS_SINGLE)
+DEF_ICON(TRACKING_FORWARDS_SINGLE)
+DEF_ICON(TRACKING_CLEAR_BACKWARDS)
+DEF_ICON(TRACKING_CLEAR_FORWARDS)
+DEF_ICON(TRACKING_REFINE_BACKWARDS)
+DEF_ICON(TRACKING_REFINE_FORWARDS)
DEF_ICON_BLANK(77b)
/* DATA */
DEF_ICON(SCENE_DATA)
DEF_ICON(RENDERLAYERS)
-DEF_ICON(WORLD_DATA)
+DEF_ICON_SHADING(WORLD_DATA)
DEF_ICON(OBJECT_DATA)
DEF_ICON(MESH_DATA)
DEF_ICON(CURVE_DATA)
DEF_ICON(META_DATA)
DEF_ICON(LATTICE_DATA)
-DEF_ICON(LIGHT_DATA)
-DEF_ICON(MATERIAL_DATA)
-DEF_ICON(TEXTURE_DATA)
+DEF_ICON_SHADING(LIGHT_DATA)
+DEF_ICON_SHADING(MATERIAL_DATA)
+DEF_ICON_SHADING(TEXTURE_DATA)
DEF_ICON(ANIM_DATA)
DEF_ICON(CAMERA_DATA)
DEF_ICON(PARTICLE_DATA)
DEF_ICON(LIBRARY_DATA_DIRECT)
-DEF_ICON(GROUP)
+DEF_ICON_COLLECTION(GROUP)
DEF_ICON(ARMATURE_DATA)
DEF_ICON(POSE_DATA)
DEF_ICON(BONE_DATA)
-DEF_ICON(CONSTRAINT)
-DEF_ICON(SHAPEKEY_DATA)
-DEF_ICON(CONSTRAINT_BONE)
+DEF_ICON_MODIFIER(CONSTRAINT)
+DEF_ICON_COLOR(SHAPEKEY_DATA)
+DEF_ICON_MODIFIER(CONSTRAINT_BONE)
DEF_ICON(CAMERA_STEREO)
DEF_ICON(PACKAGE)
DEF_ICON(UGLYPACKAGE)
DEF_ICON_BLANK(79b)
/* DATA */
-DEF_ICON(BRUSH_DATA)
-DEF_ICON(IMAGE_DATA)
+DEF_ICON_SHADING(BRUSH_DATA)
+DEF_ICON_SHADING(IMAGE_DATA)
DEF_ICON(FILE)
DEF_ICON(FCURVE)
DEF_ICON(FONT_DATA)
DEF_ICON(RENDER_RESULT)
DEF_ICON(SURFACE_DATA)
DEF_ICON(EMPTY_DATA)
-DEF_ICON(SETTINGS)
+DEF_ICON_BLANK(88)
DEF_ICON(RENDER_ANIMATION)
DEF_ICON(RENDER_STILL)
DEF_ICON(LIBRARY_DATA_BROKEN)
-DEF_ICON(BOIDS)
+DEF_ICON_COLOR(BOIDS)
DEF_ICON(STRANDS)
DEF_ICON(LIBRARY_DATA_INDIRECT)
DEF_ICON(GREASEPENCIL)
-DEF_ICON(LINE_DATA)
-DEF_ICON(LIBRARY_DATA_OVERRIDE)
+DEF_ICON_SHADING(LINE_DATA)
+DEF_ICON_COLOR(LIBRARY_DATA_OVERRIDE)
DEF_ICON(GROUP_BONE)
DEF_ICON(GROUP_VERTEX)
DEF_ICON(GROUP_VCOL)
DEF_ICON(GROUP_UVS)
-DEF_ICON_BLANK(89)
+DEF_ICON(FACE_MAPS)
DEF_ICON_BLANK(90)
DEF_ICON(RNA)
DEF_ICON(RNA_ADD)
/* INPUT + DECORATOR */
-DEF_ICON_MONO(MOUSE_LMB)
-DEF_ICON_MONO(MOUSE_MMB)
-DEF_ICON_MONO(MOUSE_RMB)
-DEF_ICON_MONO(MOUSE_MOVE)
-DEF_ICON_MONO(MOUSE_LMB_DRAG)
-DEF_ICON_MONO(MOUSE_MMB_DRAG)
-DEF_ICON_MONO(MOUSE_RMB_DRAG)
+DEF_ICON(MOUSE_LMB)
+DEF_ICON(MOUSE_MMB)
+DEF_ICON(MOUSE_RMB)
+DEF_ICON(MOUSE_MOVE)
+DEF_ICON(MOUSE_LMB_DRAG)
+DEF_ICON(MOUSE_MMB_DRAG)
+DEF_ICON(MOUSE_RMB_DRAG)
DEF_ICON_BLANK(99)
-DEF_ICON_MONO(PRESET)
+DEF_ICON(PRESET)
DEF_ICON_BLANK(101)
-DEF_ICON_MONO(DECORATE)
-DEF_ICON_MONO(DECORATE_KEYFRAME)
-DEF_ICON_MONO(DECORATE_ANIMATE)
-DEF_ICON_MONO(DECORATE_DRIVER)
-DEF_ICON_MONO(DECORATE_LINKED)
-DEF_ICON_MONO(DECORATE_OVERRIDE)
-DEF_ICON_MONO(DECORATE_UNLOCKED)
-DEF_ICON_MONO(DECORATE_LOCKED)
+DEF_ICON(DECORATE)
+DEF_ICON(DECORATE_KEYFRAME)
+DEF_ICON(DECORATE_ANIMATE)
+DEF_ICON(DECORATE_DRIVER)
+DEF_ICON(DECORATE_LINKED)
+DEF_ICON(DECORATE_OVERRIDE)
+DEF_ICON(DECORATE_UNLOCKED)
+DEF_ICON(DECORATE_LOCKED)
DEF_ICON_BLANK(110)
DEF_ICON_BLANK(111)
DEF_ICON_BLANK(112)
-DEF_ICON_BLANK(113)
-DEF_ICON_BLANK(114)
-DEF_ICON_MONO(USER)
-DEF_ICON_BLANK(116)
-DEF_ICON_BLANK(116b)
+DEF_ICON(FAKE_USER)
+DEF_ICON(ORPHAN_DATA)
+DEF_ICON(USER)
+DEF_ICON(SYSTEM)
+DEF_ICON(SETTINGS)
/* OUTLINER */
-DEF_ICON(OUTLINER_OB_EMPTY)
-DEF_ICON(OUTLINER_OB_MESH)
-DEF_ICON(OUTLINER_OB_CURVE)
-DEF_ICON(OUTLINER_OB_LATTICE)
-DEF_ICON(OUTLINER_OB_META)
-DEF_ICON(OUTLINER_OB_LIGHT)
-DEF_ICON(OUTLINER_OB_CAMERA)
-DEF_ICON(OUTLINER_OB_ARMATURE)
-DEF_ICON(OUTLINER_OB_FONT)
-DEF_ICON(OUTLINER_OB_SURFACE)
-DEF_ICON(OUTLINER_OB_SPEAKER)
-DEF_ICON(OUTLINER_OB_FORCE_FIELD)
-DEF_ICON(OUTLINER_OB_GROUP_INSTANCE)
-DEF_ICON(OUTLINER_OB_GREASEPENCIL)
-DEF_ICON(OUTLINER_OB_LIGHTPROBE)
-DEF_ICON(OUTLINER_OB_IMAGE)
+DEF_ICON_OBJECT(OUTLINER_OB_EMPTY)
+DEF_ICON_OBJECT(OUTLINER_OB_MESH)
+DEF_ICON_OBJECT(OUTLINER_OB_CURVE)
+DEF_ICON_OBJECT(OUTLINER_OB_LATTICE)
+DEF_ICON_OBJECT(OUTLINER_OB_META)
+DEF_ICON_OBJECT(OUTLINER_OB_LIGHT)
+DEF_ICON_OBJECT(OUTLINER_OB_CAMERA)
+DEF_ICON_OBJECT(OUTLINER_OB_ARMATURE)
+DEF_ICON_OBJECT(OUTLINER_OB_FONT)
+DEF_ICON_OBJECT(OUTLINER_OB_SURFACE)
+DEF_ICON_OBJECT(OUTLINER_OB_SPEAKER)
+DEF_ICON_OBJECT(OUTLINER_OB_FORCE_FIELD)
+DEF_ICON_OBJECT(OUTLINER_OB_GROUP_INSTANCE)
+DEF_ICON_OBJECT(OUTLINER_OB_GREASEPENCIL)
+DEF_ICON_OBJECT(OUTLINER_OB_LIGHTPROBE)
+DEF_ICON_OBJECT(OUTLINER_OB_IMAGE)
DEF_ICON_BLANK(125)
DEF_ICON(RESTRICT_COLOR_OFF)
DEF_ICON(RESTRICT_COLOR_ON)
-DEF_ICON_MONO(HIDE_OFF)
-DEF_ICON_MONO(HIDE_ON)
-DEF_ICON_MONO(RESTRICT_SELECT_OFF)
-DEF_ICON_MONO(RESTRICT_SELECT_ON)
-DEF_ICON_MONO(RESTRICT_RENDER_OFF)
-DEF_ICON_MONO(RESTRICT_RENDER_ON)
+DEF_ICON(RESTRICT_VIEW_OFF)
+DEF_ICON(RESTRICT_VIEW_ON)
+DEF_ICON(RESTRICT_SELECT_OFF)
+DEF_ICON(RESTRICT_SELECT_ON)
+DEF_ICON(RESTRICT_RENDER_OFF)
+DEF_ICON(RESTRICT_RENDER_ON)
DEF_ICON_BLANK(127b)
/* OUTLINER */
-DEF_ICON(OUTLINER_DATA_EMPTY)
-DEF_ICON(OUTLINER_DATA_MESH)
-DEF_ICON(OUTLINER_DATA_CURVE)
-DEF_ICON(OUTLINER_DATA_LATTICE)
-DEF_ICON(OUTLINER_DATA_META)
-DEF_ICON(OUTLINER_DATA_LIGHT)
-DEF_ICON(OUTLINER_DATA_CAMERA)
-DEF_ICON(OUTLINER_DATA_ARMATURE)
-DEF_ICON(OUTLINER_DATA_FONT)
-DEF_ICON(OUTLINER_DATA_SURFACE)
-DEF_ICON(OUTLINER_DATA_SPEAKER)
-DEF_ICON(OUTLINER_DATA_POSE)
-DEF_ICON(OUTLINER_DATA_GREASEPENCIL)
-DEF_ICON_BLANK(131)
+DEF_ICON_BLANK(128)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_MESH)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_CURVE)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_LATTICE)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_META)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_LIGHT)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_CAMERA)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_ARMATURE)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_FONT)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_SURFACE)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_SPEAKER)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_POSE)
+DEF_ICON_BLANK(130)
+DEF_ICON_OBJECT_DATA(OUTLINER_DATA_GREASEPENCIL)
DEF_ICON_BLANK(132)
DEF_ICON_BLANK(133)
DEF_ICON_BLANK(134)
@@ -333,10 +351,10 @@ DEF_ICON_BLANK(135)
DEF_ICON_BLANK(136)
DEF_ICON_BLANK(137)
DEF_ICON_BLANK(138)
-DEF_ICON_BLANK(139)
-DEF_ICON_BLANK(140)
-DEF_ICON_MONO(RESTRICT_VIEW_OFF)
-DEF_ICON_MONO(RESTRICT_VIEW_ON)
+DEF_ICON(ONIONSKIN_OFF)
+DEF_ICON(ONIONSKIN_ON)
+DEF_ICON(HIDE_OFF)
+DEF_ICON(HIDE_ON)
DEF_ICON_BLANK(142b)
/* PRIMITIVES */
@@ -352,14 +370,14 @@ DEF_ICON(MESH_TORUS)
DEF_ICON(MESH_CONE)
DEF_ICON(MESH_CAPSULE)
DEF_ICON_BLANK(611)
-DEF_ICON(LIGHT_POINT)
-DEF_ICON(LIGHT_SUN)
-DEF_ICON(LIGHT_SPOT)
-DEF_ICON(LIGHT_HEMI)
-DEF_ICON(LIGHT_AREA)
+DEF_ICON_SHADING(LIGHT_POINT)
+DEF_ICON_SHADING(LIGHT_SUN)
+DEF_ICON_SHADING(LIGHT_SPOT)
+DEF_ICON_SHADING(LIGHT_HEMI)
+DEF_ICON_SHADING(LIGHT_AREA)
DEF_ICON_BLANK(617)
DEF_ICON_BLANK(618)
-DEF_ICON(META_EMPTY)
+DEF_ICON_COLOR(META_EMPTY)
DEF_ICON(META_PLANE)
DEF_ICON(META_CUBE)
DEF_ICON(META_BALL)
@@ -382,33 +400,33 @@ DEF_ICON(CURVE_BEZCIRCLE)
DEF_ICON(CURVE_NCURVE)
DEF_ICON(CURVE_NCIRCLE)
DEF_ICON(CURVE_PATH)
-DEF_ICON(LIGHTPROBE_CUBEMAP)
-DEF_ICON(LIGHTPROBE_PLANAR)
-DEF_ICON(LIGHTPROBE_GRID)
+DEF_ICON_SHADING(LIGHTPROBE_CUBEMAP)
+DEF_ICON_SHADING(LIGHTPROBE_PLANAR)
+DEF_ICON_SHADING(LIGHTPROBE_GRID)
DEF_ICON_BLANK(647)
DEF_ICON_BLANK(648)
DEF_ICON(COLOR_RED)
DEF_ICON(COLOR_GREEN)
DEF_ICON(COLOR_BLUE)
-DEF_ICON_MONO(TRIA_RIGHT_BAR)
-DEF_ICON_MONO(TRIA_DOWN_BAR)
-DEF_ICON_MONO(TRIA_LEFT_BAR)
-DEF_ICON_MONO(TRIA_UP_BAR)
+DEF_ICON(TRIA_RIGHT_BAR)
+DEF_ICON(TRIA_DOWN_BAR)
+DEF_ICON(TRIA_LEFT_BAR)
+DEF_ICON(TRIA_UP_BAR)
/* EMPTY */
-DEF_ICON(FORCE_FORCE)
-DEF_ICON(FORCE_WIND)
-DEF_ICON(FORCE_VORTEX)
-DEF_ICON(FORCE_MAGNETIC)
-DEF_ICON(FORCE_HARMONIC)
-DEF_ICON(FORCE_CHARGE)
-DEF_ICON(FORCE_LENNARDJONES)
-DEF_ICON(FORCE_TEXTURE)
-DEF_ICON(FORCE_CURVE)
-DEF_ICON(FORCE_BOID)
-DEF_ICON(FORCE_TURBULENCE)
-DEF_ICON(FORCE_DRAG)
-DEF_ICON(FORCE_SMOKEFLOW)
+DEF_ICON_COLOR(FORCE_FORCE)
+DEF_ICON_COLOR(FORCE_WIND)
+DEF_ICON_COLOR(FORCE_VORTEX)
+DEF_ICON_COLOR(FORCE_MAGNETIC)
+DEF_ICON_COLOR(FORCE_HARMONIC)
+DEF_ICON_COLOR(FORCE_CHARGE)
+DEF_ICON_COLOR(FORCE_LENNARDJONES)
+DEF_ICON_COLOR(FORCE_TEXTURE)
+DEF_ICON_COLOR(FORCE_CURVE)
+DEF_ICON_COLOR(FORCE_BOID)
+DEF_ICON_COLOR(FORCE_TURBULENCE)
+DEF_ICON_COLOR(FORCE_DRAG)
+DEF_ICON_COLOR(FORCE_SMOKEFLOW)
DEF_ICON_BLANK(673)
DEF_ICON_BLANK(674)
DEF_ICON_BLANK(675)
@@ -424,14 +442,14 @@ DEF_ICON_BLANK(684)
DEF_ICON_BLANK(685)
/* EMPTY */
-DEF_ICON_BLANK(690) /* XXX 'Temperature' icon! */
+DEF_ICON_COLOR(TEMPERATURE) /* XXX 'Temperature' icon! */
DEF_ICON_BLANK(691) /* XXX 'Temperature' icon! */
-DEF_ICON_BLANK(692) /* XXX 'Gear' icon! */
+DEF_ICON_COLOR(GEAR) /* XXX 'Gear' icon! */
DEF_ICON(NODE_INSERT_ON)
DEF_ICON(NODE_INSERT_OFF)
-DEF_ICON_BLANK(695)
-DEF_ICON_BLANK(696)
-DEF_ICON_BLANK(697)
+DEF_ICON(NODE_TOP)
+DEF_ICON(NODE_SIDE)
+DEF_ICON(NODE_CORNER)
DEF_ICON_BLANK(698)
DEF_ICON_BLANK(699)
DEF_ICON_BLANK(700)
@@ -452,19 +470,19 @@ DEF_ICON_BLANK(714)
DEF_ICON_BLANK(715)
/* EMPTY */
-DEF_ICON_MONO(ALIGN_LEFT)
-DEF_ICON_MONO(ALIGN_CENTER)
-DEF_ICON_MONO(ALIGN_RIGHT)
-DEF_ICON_MONO(ALIGN_JUSTIFY)
-DEF_ICON_MONO(ALIGN_FLUSH)
-DEF_ICON_MONO(ALIGN_TOP)
-DEF_ICON_MONO(ALIGN_MIDDLE)
-DEF_ICON_MONO(ALIGN_BOTTOM)
-DEF_ICON_MONO(BOLD)
-DEF_ICON_MONO(ITALIC)
-DEF_ICON_MONO(UNDERLINE)
-DEF_ICON_MONO(SMALL_CAPS_ON)
-DEF_ICON_MONO(SMALL_CAPS_OFF)
+DEF_ICON(ALIGN_LEFT)
+DEF_ICON(ALIGN_CENTER)
+DEF_ICON(ALIGN_RIGHT)
+DEF_ICON(ALIGN_JUSTIFY)
+DEF_ICON(ALIGN_FLUSH)
+DEF_ICON(ALIGN_TOP)
+DEF_ICON(ALIGN_MIDDLE)
+DEF_ICON(ALIGN_BOTTOM)
+DEF_ICON(BOLD)
+DEF_ICON(ITALIC)
+DEF_ICON(UNDERLINE)
+DEF_ICON(SMALL_CAPS)
+DEF_ICON_BLANK(742)
DEF_ICON_BLANK(743)
DEF_ICON_BLANK(744)
DEF_ICON_BLANK(745)
@@ -508,51 +526,51 @@ DEF_ICON_BLANK(784)
DEF_ICON_BLANK(785)
/* MODIFIERS */
-DEF_ICON(MODIFIER)
-DEF_ICON(MOD_WAVE)
-DEF_ICON(MOD_BUILD)
-DEF_ICON(MOD_DECIM)
-DEF_ICON(MOD_MIRROR)
-DEF_ICON(MOD_SOFT)
-DEF_ICON(MOD_SUBSURF)
-DEF_ICON(HOOK)
-DEF_ICON(MOD_PHYSICS)
-DEF_ICON(MOD_PARTICLES)
-DEF_ICON(MOD_BOOLEAN)
-DEF_ICON(MOD_EDGESPLIT)
-DEF_ICON(MOD_ARRAY)
-DEF_ICON(MOD_UVPROJECT)
-DEF_ICON(MOD_DISPLACE)
-DEF_ICON(MOD_CURVE)
-DEF_ICON(MOD_LATTICE)
-DEF_ICON(CONSTRAINT_DATA)
-DEF_ICON(MOD_ARMATURE)
-DEF_ICON(MOD_SHRINKWRAP)
-DEF_ICON(MOD_CAST)
-DEF_ICON(MOD_MESHDEFORM)
-DEF_ICON(MOD_BEVEL)
-DEF_ICON(MOD_SMOOTH)
-DEF_ICON(MOD_SIMPLEDEFORM)
-DEF_ICON(MOD_MASK)
+DEF_ICON_MODIFIER(MODIFIER)
+DEF_ICON_COLOR(MOD_WAVE)
+DEF_ICON_COLOR(MOD_BUILD)
+DEF_ICON_COLOR(MOD_DECIM)
+DEF_ICON_COLOR(MOD_MIRROR)
+DEF_ICON_COLOR(MOD_SOFT)
+DEF_ICON_COLOR(MOD_SUBSURF)
+DEF_ICON_COLOR(HOOK)
+DEF_ICON_COLOR(MOD_PHYSICS)
+DEF_ICON_COLOR(MOD_PARTICLES)
+DEF_ICON_COLOR(MOD_BOOLEAN)
+DEF_ICON_COLOR(MOD_EDGESPLIT)
+DEF_ICON_COLOR(MOD_ARRAY)
+DEF_ICON_COLOR(MOD_UVPROJECT)
+DEF_ICON_COLOR(MOD_DISPLACE)
+DEF_ICON_COLOR(MOD_CURVE)
+DEF_ICON_COLOR(MOD_LATTICE)
+DEF_ICON_COLOR(CONSTRAINT_DATA)
+DEF_ICON_COLOR(MOD_ARMATURE)
+DEF_ICON_COLOR(MOD_SHRINKWRAP)
+DEF_ICON_COLOR(MOD_CAST)
+DEF_ICON_COLOR(MOD_MESHDEFORM)
+DEF_ICON_COLOR(MOD_BEVEL)
+DEF_ICON_COLOR(MOD_SMOOTH)
+DEF_ICON_COLOR(MOD_SIMPLEDEFORM)
+DEF_ICON_COLOR(MOD_MASK)
/* MODIFIERS */
-DEF_ICON(MOD_CLOTH)
-DEF_ICON(MOD_EXPLODE)
-DEF_ICON(MOD_FLUIDSIM)
-DEF_ICON(MOD_MULTIRES)
-DEF_ICON(MOD_SMOKE)
-DEF_ICON(MOD_SOLIDIFY)
-DEF_ICON(MOD_SCREW)
-DEF_ICON(MOD_VERTEX_WEIGHT)
-DEF_ICON(MOD_DYNAMICPAINT)
-DEF_ICON(MOD_REMESH)
-DEF_ICON(MOD_OCEAN)
-DEF_ICON(MOD_WARP)
-DEF_ICON(MOD_SKIN)
-DEF_ICON(MOD_TRIANGULATE)
-DEF_ICON(MOD_WIREFRAME)
-DEF_ICON(MOD_DATA_TRANSFER)
-DEF_ICON(MOD_NORMALEDIT)
+DEF_ICON_COLOR(MOD_CLOTH)
+DEF_ICON_COLOR(MOD_EXPLODE)
+DEF_ICON_COLOR(MOD_FLUIDSIM)
+DEF_ICON_COLOR(MOD_MULTIRES)
+DEF_ICON_COLOR(MOD_SMOKE)
+DEF_ICON_COLOR(MOD_SOLIDIFY)
+DEF_ICON_COLOR(MOD_SCREW)
+DEF_ICON_COLOR(MOD_VERTEX_WEIGHT)
+DEF_ICON_COLOR(MOD_DYNAMICPAINT)
+DEF_ICON_COLOR(MOD_REMESH)
+DEF_ICON_COLOR(MOD_OCEAN)
+DEF_ICON_COLOR(MOD_WARP)
+DEF_ICON_COLOR(MOD_SKIN)
+DEF_ICON_COLOR(MOD_TRIANGULATE)
+DEF_ICON_COLOR(MOD_WIREFRAME)
+DEF_ICON_COLOR(MOD_DATA_TRANSFER)
+DEF_ICON_COLOR(MOD_NORMALEDIT)
DEF_ICON_BLANK(169)
DEF_ICON_BLANK(170)
DEF_ICON_BLANK(171)
@@ -564,24 +582,24 @@ DEF_ICON_BLANK(176)
DEF_ICON_BLANK(177)
/* ANIMATION */
-DEF_ICON_MONO(REC)
-DEF_ICON_MONO(PLAY)
-DEF_ICON_MONO(FF)
-DEF_ICON_MONO(REW)
-DEF_ICON_MONO(PAUSE)
-DEF_ICON_MONO(PREV_KEYFRAME)
-DEF_ICON_MONO(NEXT_KEYFRAME)
+DEF_ICON(REC)
+DEF_ICON(PLAY)
+DEF_ICON(FF)
+DEF_ICON(REW)
+DEF_ICON(PAUSE)
+DEF_ICON(PREV_KEYFRAME)
+DEF_ICON(NEXT_KEYFRAME)
DEF_ICON_BLANK(185)
-DEF_ICON_MONO(PLAY_REVERSE)
+DEF_ICON(PLAY_REVERSE)
DEF_ICON(PREVIEW_RANGE)
DEF_ICON(ACTION_TWEAK)
DEF_ICON(PMARKER_ACT)
DEF_ICON(PMARKER_SEL)
-DEF_ICON(PMARKER)
+DEF_ICON_COLOR(PMARKER)
DEF_ICON(MARKER_HLT)
DEF_ICON(MARKER)
-DEF_ICON(SPACE2) // XXX
-DEF_ICON(SPACE3) // XXX
+DEF_ICON(KEYFRAME_HLT)
+DEF_ICON(KEYFRAME)
DEF_ICON(KEYINGSET)
DEF_ICON(KEY_DEHLT)
DEF_ICON(KEY_HLT)
@@ -594,8 +612,8 @@ DEF_ICON(DRIVER)
/* ANIMATION */
DEF_ICON(SOLO_OFF)
DEF_ICON(SOLO_ON)
-DEF_ICON_MONO(FRAME_PREV)
-DEF_ICON_MONO(FRAME_NEXT)
+DEF_ICON(FRAME_PREV)
+DEF_ICON(FRAME_NEXT)
DEF_ICON(NLA_PUSHDOWN)
DEF_ICON(IPO_CONSTANT)
DEF_ICON(IPO_LINEAR)
@@ -614,7 +632,6 @@ DEF_ICON(IPO_EASE_IN)
DEF_ICON(IPO_EASE_OUT)
DEF_ICON(IPO_EASE_IN_OUT)
DEF_ICON(NORMALIZE_FCURVES)
- /* available */
DEF_ICON_BLANK(204)
DEF_ICON_BLANK(205)
DEF_ICON_BLANK(206)
@@ -624,14 +641,14 @@ DEF_ICON_BLANK(207)
DEF_ICON(VERTEXSEL)
DEF_ICON(EDGESEL)
DEF_ICON(FACESEL)
-DEF_ICON(LOOPSEL)
+DEF_ICON_BLANK(209)
DEF_ICON_BLANK(210)
-DEF_ICON(ROTATE)
-DEF_ICON(CURSOR)
-DEF_ICON(ROTATECOLLECTION)
-DEF_ICON(ROTATECENTER)
-DEF_ICON(ROTACTIVE)
-DEF_ICON(ALIGN)
+DEF_ICON(PIVOT_BOUNDBOX)
+DEF_ICON(PIVOT_CURSOR)
+DEF_ICON(PIVOT_INDIVIDUAL)
+DEF_ICON(PIVOT_MEDIAN)
+DEF_ICON(PIVOT_ACTIVE)
+DEF_ICON(CENTER_ONLY)
DEF_ICON_BLANK(211)
DEF_ICON(SMOOTHCURVE)
DEF_ICON(SPHERECURVE)
@@ -649,10 +666,10 @@ DEF_ICON(PARTICLE_TIP)
DEF_ICON(PARTICLE_PATH)
/* EDITING */
-DEF_ICON(MAN_TRANS)
-DEF_ICON(MAN_ROT)
-DEF_ICON(MAN_SCALE)
-DEF_ICON(MANIPUL)
+DEF_ICON_COLOR(MAN_TRANS)
+DEF_ICON_COLOR(MAN_ROT)
+DEF_ICON_COLOR(MAN_SCALE)
+DEF_ICON_COLOR(MANIPUL)
DEF_ICON(SNAP_OFF)
DEF_ICON(SNAP_ON)
DEF_ICON(SNAP_NORMAL)
@@ -670,11 +687,11 @@ DEF_ICON(CLIPUV_HLT)
DEF_ICON(SNAP_PEEL_OBJECT)
DEF_ICON(GRID)
DEF_ICON(OBJECT_ORIGIN)
-DEF_ICON_BLANK(222)
-DEF_ICON_BLANK(224)
-DEF_ICON_BLANK(225)
-DEF_ICON_BLANK(226)
-DEF_ICON_BLANK(226b)
+DEF_ICON(ORIENTATION_GLOBAL)
+DEF_ICON(ORIENTATION_GIMBAL)
+DEF_ICON(ORIENTATION_LOCAL)
+DEF_ICON(ORIENTATION_NORMAL)
+DEF_ICON(ORIENTATION_VIEW)
/* EDITING */
DEF_ICON(PASTEDOWN)
@@ -685,10 +702,10 @@ DEF_ICON(VIS_SEL_11)
DEF_ICON(VIS_SEL_10)
DEF_ICON(VIS_SEL_01)
DEF_ICON(VIS_SEL_00)
-DEF_ICON(SNAP_SURFACE)
+DEF_ICON_BLANK(231)
DEF_ICON(AUTOMERGE_ON)
DEF_ICON(AUTOMERGE_OFF)
-DEF_ICON(RETOPO)
+DEF_ICON_COLOR(RETOPO)
DEF_ICON(UV_VERTEXSEL)
DEF_ICON(UV_EDGESEL)
DEF_ICON(UV_FACESEL)
@@ -700,18 +717,18 @@ DEF_ICON_BLANK(242)
DEF_ICON_BLANK(243)
DEF_ICON_BLANK(244)
DEF_ICON_BLANK(245)
-DEF_ICON_BLANK(246)
-DEF_ICON_BLANK(247)
-DEF_ICON_BLANK(247b)
+DEF_ICON(NORMALS_VERTEX)
+DEF_ICON(NORMALS_VERTEX_FACE)
+DEF_ICON(NORMALS_FACE)
/* 3D VIEW */
-DEF_ICON(BBOX)
-DEF_ICON(WIRE)
-DEF_ICON(SOLID)
-DEF_ICON(SMOOTH)
-DEF_ICON(POTATO)
+DEF_ICON(SHADING_BBOX)
+DEF_ICON(SHADING_WIRE)
+DEF_ICON(SHADING_SOLID)
+DEF_ICON(SHADING_RENDERED)
+DEF_ICON(SHADING_TEXTURE)
DEF_ICON(OVERLAY)
-DEF_ICON(ORTHO)
+DEF_ICON(XRAY)
DEF_ICON_BLANK(249)
DEF_ICON_BLANK(250)
DEF_ICON(LOCKVIEW_OFF)
@@ -766,17 +783,17 @@ DEF_ICON(SORTTIME)
DEF_ICON(SORTSIZE)
DEF_ICON(LONGDISPLAY)
DEF_ICON(SHORTDISPLAY)
-DEF_ICON(GHOST)
-DEF_ICON(IMGDISPLAY)
-DEF_ICON(SAVE_AS)
-DEF_ICON(SAVE_COPY)
+DEF_ICON_COLOR(GHOST)
+DEF_ICON_COLOR(IMGDISPLAY)
+DEF_ICON_BLANK(292)
+DEF_ICON_BLANK(293)
DEF_ICON(BOOKMARKS)
DEF_ICON(FONTPREVIEW)
DEF_ICON(FILTER)
DEF_ICON(NEWFOLDER)
DEF_ICON(OPEN_RECENT)
-DEF_ICON_MONO(FILE_PARENT)
-DEF_ICON_MONO(FILE_REFRESH)
+DEF_ICON(FILE_PARENT)
+DEF_ICON(FILE_REFRESH)
DEF_ICON(FILE_FOLDER)
DEF_ICON(FILE_BLANK)
DEF_ICON(FILE_BLEND)
@@ -788,29 +805,29 @@ DEF_ICON(FILE_FONT)
DEF_ICON(FILE_TEXT)
/* FILE SELECT */
-DEF_ICON_MONO(RECOVER_AUTO)
-DEF_ICON_MONO(SAVE_PREFS)
-DEF_ICON_MONO(LINK_BLEND)
-DEF_ICON_MONO(APPEND_BLEND)
-DEF_ICON_MONO(IMPORT)
-DEF_ICON_MONO(EXPORT)
-DEF_ICON(EXTERNAL_DATA)
-DEF_ICON(LOAD_FACTORY)
+DEF_ICON(SORT_DESC)
+DEF_ICON(SORT_ASC)
+DEF_ICON(LINK_BLEND)
+DEF_ICON(APPEND_BLEND)
+DEF_ICON(IMPORT)
+DEF_ICON(EXPORT)
+DEF_ICON_COLOR(EXTERNAL_DATA)
+DEF_ICON_BLANK(299)
DEF_ICON_BLANK(300)
DEF_ICON_BLANK(301)
DEF_ICON_BLANK(302)
DEF_ICON_BLANK(303)
DEF_ICON_BLANK(304)
-DEF_ICON_MONO(LOOP_BACK)
-DEF_ICON_MONO(LOOP_FORWARDS)
-DEF_ICON_MONO(BACK)
-DEF_ICON_MONO(FORWARD)
+DEF_ICON(LOOP_BACK)
+DEF_ICON(LOOP_FORWARDS)
+DEF_ICON(BACK)
+DEF_ICON(FORWARD)
DEF_ICON_BLANK(309)
DEF_ICON_BLANK(310)
DEF_ICON_BLANK(311)
DEF_ICON_BLANK(312)
-DEF_ICON_BLANK(313)
-DEF_ICON_BLANK(314)
+DEF_ICON(ALEMBIC)
+DEF_ICON(VOLUME)
DEF_ICON(FILE_HIDDEN)
DEF_ICON(FILE_BACKUP)
DEF_ICON(DISK_DRIVE)
@@ -857,7 +874,7 @@ DEF_ICON(IMAGE_RGB) // XXX CHANGE TO STRAIGHT ALPHA, Z ETC
DEF_ICON(IMAGE_RGB_ALPHA)
DEF_ICON(IMAGE_ALPHA)
DEF_ICON(IMAGE_ZDEPTH)
-DEF_ICON(IMAGEFILE)
+DEF_ICON_COLOR(IMAGEFILE)
DEF_ICON_BLANK(336)
DEF_ICON_BLANK(337)
DEF_ICON_BLANK(338)
@@ -873,88 +890,88 @@ DEF_ICON(VIEW_ZOOM)
/* brush icons */
-DEF_ICON(BRUSH_ADD)
-DEF_ICON(BRUSH_BLOB)
-DEF_ICON(BRUSH_BLUR)
-DEF_ICON(BRUSH_CLAY)
-DEF_ICON(BRUSH_CLAY_STRIPS)
-DEF_ICON(BRUSH_CLONE)
-DEF_ICON(BRUSH_CREASE)
-DEF_ICON(BRUSH_DARKEN)
-DEF_ICON(BRUSH_FILL)
-DEF_ICON(BRUSH_FLATTEN)
-DEF_ICON(BRUSH_GRAB)
-DEF_ICON(BRUSH_INFLATE)
-DEF_ICON(BRUSH_LAYER)
-DEF_ICON(BRUSH_LIGHTEN)
-DEF_ICON(BRUSH_MASK)
-DEF_ICON(BRUSH_MIX)
-DEF_ICON(BRUSH_MULTIPLY)
-DEF_ICON(BRUSH_NUDGE)
-DEF_ICON(BRUSH_PINCH)
-DEF_ICON(BRUSH_SCRAPE)
-DEF_ICON(BRUSH_SCULPT_DRAW)
-DEF_ICON(BRUSH_SMEAR)
-DEF_ICON(BRUSH_SMOOTH)
-DEF_ICON(BRUSH_SNAKE_HOOK)
-DEF_ICON(BRUSH_SOFTEN)
-DEF_ICON(BRUSH_SUBTRACT)
-DEF_ICON(BRUSH_TEXDRAW)
-DEF_ICON(BRUSH_TEXFILL)
-DEF_ICON(BRUSH_TEXMASK)
-DEF_ICON(BRUSH_THUMB)
-DEF_ICON(BRUSH_ROTATE)
-DEF_ICON(BRUSH_VERTEXDRAW)
+DEF_ICON_COLOR(BRUSH_ADD)
+DEF_ICON_COLOR(BRUSH_BLOB)
+DEF_ICON_COLOR(BRUSH_BLUR)
+DEF_ICON_COLOR(BRUSH_CLAY)
+DEF_ICON_COLOR(BRUSH_CLAY_STRIPS)
+DEF_ICON_COLOR(BRUSH_CLONE)
+DEF_ICON_COLOR(BRUSH_CREASE)
+DEF_ICON_COLOR(BRUSH_DARKEN)
+DEF_ICON_COLOR(BRUSH_FILL)
+DEF_ICON_COLOR(BRUSH_FLATTEN)
+DEF_ICON_COLOR(BRUSH_GRAB)
+DEF_ICON_COLOR(BRUSH_INFLATE)
+DEF_ICON_COLOR(BRUSH_LAYER)
+DEF_ICON_COLOR(BRUSH_LIGHTEN)
+DEF_ICON_COLOR(BRUSH_MASK)
+DEF_ICON_COLOR(BRUSH_MIX)
+DEF_ICON_COLOR(BRUSH_MULTIPLY)
+DEF_ICON_COLOR(BRUSH_NUDGE)
+DEF_ICON_COLOR(BRUSH_PINCH)
+DEF_ICON_COLOR(BRUSH_SCRAPE)
+DEF_ICON_COLOR(BRUSH_SCULPT_DRAW)
+DEF_ICON_COLOR(BRUSH_SMEAR)
+DEF_ICON_COLOR(BRUSH_SMOOTH)
+DEF_ICON_COLOR(BRUSH_SNAKE_HOOK)
+DEF_ICON_COLOR(BRUSH_SOFTEN)
+DEF_ICON_COLOR(BRUSH_SUBTRACT)
+DEF_ICON_COLOR(BRUSH_TEXDRAW)
+DEF_ICON_COLOR(BRUSH_TEXFILL)
+DEF_ICON_COLOR(BRUSH_TEXMASK)
+DEF_ICON_COLOR(BRUSH_THUMB)
+DEF_ICON_COLOR(BRUSH_ROTATE)
+DEF_ICON_COLOR(BRUSH_VERTEXDRAW)
/* Matcaps */
-DEF_ICON(MATCAP_01)
-DEF_ICON(MATCAP_02)
-DEF_ICON(MATCAP_03)
-DEF_ICON(MATCAP_04)
-DEF_ICON(MATCAP_05)
-DEF_ICON(MATCAP_06)
-DEF_ICON(MATCAP_07)
-DEF_ICON(MATCAP_08)
-DEF_ICON(MATCAP_09)
-DEF_ICON(MATCAP_10)
-DEF_ICON(MATCAP_11)
-DEF_ICON(MATCAP_12)
-DEF_ICON(MATCAP_13)
-DEF_ICON(MATCAP_14)
-DEF_ICON(MATCAP_15)
-DEF_ICON(MATCAP_16)
-DEF_ICON(MATCAP_17)
-DEF_ICON(MATCAP_18)
-DEF_ICON(MATCAP_19)
-DEF_ICON(MATCAP_20)
-DEF_ICON(MATCAP_21)
-DEF_ICON(MATCAP_22)
-DEF_ICON(MATCAP_23)
-DEF_ICON(MATCAP_24)
+DEF_ICON_COLOR(MATCAP_01)
+DEF_ICON_COLOR(MATCAP_02)
+DEF_ICON_COLOR(MATCAP_03)
+DEF_ICON_COLOR(MATCAP_04)
+DEF_ICON_COLOR(MATCAP_05)
+DEF_ICON_COLOR(MATCAP_06)
+DEF_ICON_COLOR(MATCAP_07)
+DEF_ICON_COLOR(MATCAP_08)
+DEF_ICON_COLOR(MATCAP_09)
+DEF_ICON_COLOR(MATCAP_10)
+DEF_ICON_COLOR(MATCAP_11)
+DEF_ICON_COLOR(MATCAP_12)
+DEF_ICON_COLOR(MATCAP_13)
+DEF_ICON_COLOR(MATCAP_14)
+DEF_ICON_COLOR(MATCAP_15)
+DEF_ICON_COLOR(MATCAP_16)
+DEF_ICON_COLOR(MATCAP_17)
+DEF_ICON_COLOR(MATCAP_18)
+DEF_ICON_COLOR(MATCAP_19)
+DEF_ICON_COLOR(MATCAP_20)
+DEF_ICON_COLOR(MATCAP_21)
+DEF_ICON_COLOR(MATCAP_22)
+DEF_ICON_COLOR(MATCAP_23)
+DEF_ICON_COLOR(MATCAP_24)
/* grease pencil sculpt */
-DEF_ICON(GPBRUSH_SMOOTH)
-DEF_ICON(GPBRUSH_THICKNESS)
-DEF_ICON(GPBRUSH_STRENGTH)
-DEF_ICON(GPBRUSH_GRAB)
-DEF_ICON(GPBRUSH_PUSH)
-DEF_ICON(GPBRUSH_TWIST)
-DEF_ICON(GPBRUSH_PINCH)
-DEF_ICON(GPBRUSH_RANDOMIZE)
-DEF_ICON(GPBRUSH_CLONE)
-DEF_ICON(GPBRUSH_WEIGHT)
+DEF_ICON_COLOR(GPBRUSH_SMOOTH)
+DEF_ICON_COLOR(GPBRUSH_THICKNESS)
+DEF_ICON_COLOR(GPBRUSH_STRENGTH)
+DEF_ICON_COLOR(GPBRUSH_GRAB)
+DEF_ICON_COLOR(GPBRUSH_PUSH)
+DEF_ICON_COLOR(GPBRUSH_TWIST)
+DEF_ICON_COLOR(GPBRUSH_PINCH)
+DEF_ICON_COLOR(GPBRUSH_RANDOMIZE)
+DEF_ICON_COLOR(GPBRUSH_CLONE)
+DEF_ICON_COLOR(GPBRUSH_WEIGHT)
-DEF_ICON(GPBRUSH_PENCIL)
-DEF_ICON(GPBRUSH_PEN)
-DEF_ICON(GPBRUSH_INK)
-DEF_ICON(GPBRUSH_INKNOISE)
-DEF_ICON(GPBRUSH_BLOCK)
-DEF_ICON(GPBRUSH_MARKER)
-DEF_ICON(GPBRUSH_CUSTOM)
-DEF_ICON(GPBRUSH_FILL)
-DEF_ICON(GPBRUSH_ERASE_SOFT)
-DEF_ICON(GPBRUSH_ERASE_HARD)
-DEF_ICON(GPBRUSH_ERASE_STROKE)
+DEF_ICON_COLOR(GPBRUSH_PENCIL)
+DEF_ICON_COLOR(GPBRUSH_PEN)
+DEF_ICON_COLOR(GPBRUSH_INK)
+DEF_ICON_COLOR(GPBRUSH_INKNOISE)
+DEF_ICON_COLOR(GPBRUSH_BLOCK)
+DEF_ICON_COLOR(GPBRUSH_MARKER)
+DEF_ICON_COLOR(GPBRUSH_CUSTOM)
+DEF_ICON_COLOR(GPBRUSH_FILL)
+DEF_ICON_COLOR(GPBRUSH_ERASE_SOFT)
+DEF_ICON_COLOR(GPBRUSH_ERASE_HARD)
+DEF_ICON_COLOR(GPBRUSH_ERASE_STROKE)
/* Vector Icons */
DEF_ICON_VECTOR(SMALL_TRI_RIGHT_VEC)
@@ -987,53 +1004,65 @@ DEF_ICON_VECTOR(COLORSET_19_VEC)
DEF_ICON_VECTOR(COLORSET_20_VEC)
/* Events */
-DEF_ICON(EVENT_A)
-DEF_ICON(EVENT_B)
-DEF_ICON(EVENT_C)
-DEF_ICON(EVENT_D)
-DEF_ICON(EVENT_E)
-DEF_ICON(EVENT_F)
-DEF_ICON(EVENT_G)
-DEF_ICON(EVENT_H)
-DEF_ICON(EVENT_I)
-DEF_ICON(EVENT_J)
-DEF_ICON(EVENT_K)
-DEF_ICON(EVENT_L)
-DEF_ICON(EVENT_M)
-DEF_ICON(EVENT_N)
-DEF_ICON(EVENT_O)
-DEF_ICON(EVENT_P)
-DEF_ICON(EVENT_Q)
-DEF_ICON(EVENT_R)
-DEF_ICON(EVENT_S)
-DEF_ICON(EVENT_T)
-DEF_ICON(EVENT_U)
-DEF_ICON(EVENT_V)
-DEF_ICON(EVENT_W)
-DEF_ICON(EVENT_X)
-DEF_ICON(EVENT_Y)
-DEF_ICON(EVENT_Z)
-DEF_ICON(EVENT_SHIFT)
-DEF_ICON(EVENT_CTRL)
-DEF_ICON(EVENT_ALT)
-DEF_ICON(EVENT_OS)
-DEF_ICON(EVENT_F1)
-DEF_ICON(EVENT_F2)
-DEF_ICON(EVENT_F3)
-DEF_ICON(EVENT_F4)
-DEF_ICON(EVENT_F5)
-DEF_ICON(EVENT_F6)
-DEF_ICON(EVENT_F7)
-DEF_ICON(EVENT_F8)
-DEF_ICON(EVENT_F9)
-DEF_ICON(EVENT_F10)
-DEF_ICON(EVENT_F11)
-DEF_ICON(EVENT_F12)
-DEF_ICON(EVENT_ESC)
-DEF_ICON(EVENT_TAB)
-DEF_ICON(EVENT_PAGEUP)
-DEF_ICON(EVENT_PAGEDOWN)
-DEF_ICON(EVENT_HOME)
-DEF_ICON(EVENT_END)
-DEF_ICON(EVENT_RETURN)
+DEF_ICON_COLOR(EVENT_A)
+DEF_ICON_COLOR(EVENT_B)
+DEF_ICON_COLOR(EVENT_C)
+DEF_ICON_COLOR(EVENT_D)
+DEF_ICON_COLOR(EVENT_E)
+DEF_ICON_COLOR(EVENT_F)
+DEF_ICON_COLOR(EVENT_G)
+DEF_ICON_COLOR(EVENT_H)
+DEF_ICON_COLOR(EVENT_I)
+DEF_ICON_COLOR(EVENT_J)
+DEF_ICON_COLOR(EVENT_K)
+DEF_ICON_COLOR(EVENT_L)
+DEF_ICON_COLOR(EVENT_M)
+DEF_ICON_COLOR(EVENT_N)
+DEF_ICON_COLOR(EVENT_O)
+DEF_ICON_COLOR(EVENT_P)
+DEF_ICON_COLOR(EVENT_Q)
+DEF_ICON_COLOR(EVENT_R)
+DEF_ICON_COLOR(EVENT_S)
+DEF_ICON_COLOR(EVENT_T)
+DEF_ICON_COLOR(EVENT_U)
+DEF_ICON_COLOR(EVENT_V)
+DEF_ICON_COLOR(EVENT_W)
+DEF_ICON_COLOR(EVENT_X)
+DEF_ICON_COLOR(EVENT_Y)
+DEF_ICON_COLOR(EVENT_Z)
+DEF_ICON_COLOR(EVENT_SHIFT)
+DEF_ICON_COLOR(EVENT_CTRL)
+DEF_ICON_COLOR(EVENT_ALT)
+DEF_ICON_COLOR(EVENT_OS)
+DEF_ICON_COLOR(EVENT_F1)
+DEF_ICON_COLOR(EVENT_F2)
+DEF_ICON_COLOR(EVENT_F3)
+DEF_ICON_COLOR(EVENT_F4)
+DEF_ICON_COLOR(EVENT_F5)
+DEF_ICON_COLOR(EVENT_F6)
+DEF_ICON_COLOR(EVENT_F7)
+DEF_ICON_COLOR(EVENT_F8)
+DEF_ICON_COLOR(EVENT_F9)
+DEF_ICON_COLOR(EVENT_F10)
+DEF_ICON_COLOR(EVENT_F11)
+DEF_ICON_COLOR(EVENT_F12)
+DEF_ICON_COLOR(EVENT_ESC)
+DEF_ICON_COLOR(EVENT_TAB)
+DEF_ICON_COLOR(EVENT_PAGEUP)
+DEF_ICON_COLOR(EVENT_PAGEDOWN)
+DEF_ICON_COLOR(EVENT_HOME)
+DEF_ICON_COLOR(EVENT_END)
+DEF_ICON_COLOR(EVENT_RETURN)
/* add as needed. */
+
+/* Undefine all types. */
+
+#undef DEF_ICON
+#undef DEF_ICON_COLLECTION
+#undef DEF_ICON_OBJECT
+#undef DEF_ICON_OBJECT_DATA
+#undef DEF_ICON_MODIFIER
+#undef DEF_ICON_SHADING
+#undef DEF_ICON_VECTOR
+#undef DEF_ICON_COLOR
+#undef DEF_ICON_BLANK
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 72766087930..ed1aa1212fa 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -1124,7 +1124,7 @@ void uiTemplateList(
uiLayout *layout, struct bContext *C, const char *listtype_name, const char *list_id,
struct PointerRNA *dataptr, const char *propname, struct PointerRNA *active_dataptr,
const char *active_propname, const char *item_dyntip_propname,
- int rows, int maxrows, int layout_type, int columns);
+ int rows, int maxrows, int layout_type, int columns, bool reverse);
void uiTemplateNodeLink(uiLayout *layout, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input);
void uiTemplateNodeView(uiLayout *layout, struct bContext *C, struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *input);
void uiTemplateTextureUser(uiLayout *layout, struct bContext *C);
diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h
index 458b43231d9..1a8b7bb12af 100644
--- a/source/blender/editors/include/UI_resources.h
+++ b/source/blender/editors/include/UI_resources.h
@@ -29,14 +29,15 @@
* \ingroup editorui
*/
+#include "BLI_sys_types.h"
+
#ifndef __UI_RESOURCES_H__
#define __UI_RESOURCES_H__
-/* elubie: TODO: move the typedef for icons to UI_interface_icons.h */
-/* and add/replace include of UI_resources.h by UI_interface_icons.h */
+/* Define icon enum. */
#define DEF_ICON(name) ICON_##name,
#define DEF_ICON_VECTOR(name) ICON_##name,
-#define DEF_ICON_MONO(name) ICON_##name,
+#define DEF_ICON_COLOR(name) ICON_##name,
#define DEF_ICON_BLANK(name) ICON_BLANK_##name,
typedef enum {
@@ -47,11 +48,6 @@ typedef enum {
#define BIFICONID_FIRST (ICON_NONE)
-#undef DEF_ICON
-#undef DEF_ICON_VECTOR
-#undef DEF_ICON_MONO
-#undef DEF_ICON_BLANK
-
/* use to denote intentionally unset theme color */
#define TH_UNDEFINED -1
@@ -267,6 +263,12 @@ typedef enum ThemeColorID {
TH_ANIM_INACTIVE, /* no active action */
TH_ANIM_PREVIEW_RANGE,/* preview range overlay */
+ TH_ICON_COLLECTION,
+ TH_ICON_OBJECT,
+ TH_ICON_OBJECT_DATA,
+ TH_ICON_MODIFIER,
+ TH_ICON_SHADING,
+
TH_NLA_TWEAK, /* 'tweaking' track in NLA */
TH_NLA_TWEAK_DUPLI, /* error/warning flag for other strips referencing dupli strip */
@@ -366,6 +368,9 @@ void UI_GetThemeColor4ubv(int colorid, unsigned char col[4]);
// get a theme color from specified space type
void UI_GetThemeColorType4ubv(int colorid, int spacetype, char col[4]);
+// get theme color for coloring monochrome icons
+bool UI_GetIconThemeColor4fv(int colorid, float col[4]);
+
// shade a 3 byte color (same as UI_GetColorPtrBlendShade3ubv with 0.0 factor)
void UI_GetColorPtrShade3ubv(const unsigned char cp1[3], unsigned char col[3], int offset);
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index dcd09f0d4b0..1916023ab07 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -3316,10 +3316,11 @@ static uiBut *ui_def_but(
if (block->flag & UI_BLOCK_RADIAL) {
but->drawflag |= UI_BUT_TEXT_LEFT;
- if (but->str && but->str[0])
+ if (but->str && but->str[0]) {
but->drawflag |= UI_BUT_ICON_LEFT;
+ }
}
- else if ((block->flag & UI_BLOCK_LOOP) ||
+ else if (((block->flag & UI_BLOCK_LOOP) && !ui_block_is_popover(block)) ||
ELEM(but->type,
UI_BTYPE_MENU, UI_BTYPE_TEXT, UI_BTYPE_LABEL,
UI_BTYPE_BLOCK, UI_BTYPE_BUT_MENU, UI_BTYPE_SEARCH_MENU,
diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c
index 715980953a5..fcff7378754 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -259,7 +259,7 @@ static void round_box_shade_col(unsigned attrib, const float col1[3], float cons
fac * col1[2] + (1.0f - fac) * col2[2],
1.0f
};
- immAttrib4fv(attrib, col);
+ immAttr4fv(attrib, col);
}
#endif
@@ -573,7 +573,7 @@ void ui_draw_but_TAB_outline(const rcti *rect, float rad, unsigned char highligh
immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
immBeginAtMost(GPU_PRIM_LINE_STRIP, 25);
- immAttrib3ubv(col, highlight);
+ immAttr3ubv(col, highlight);
/* start with corner left-top */
if (roundboxtype & UI_CNR_TOP_LEFT) {
@@ -599,7 +599,7 @@ void ui_draw_but_TAB_outline(const rcti *rect, float rad, unsigned char highligh
immVertex2f(pos, maxx, maxy);
}
- immAttrib3ubv(col, highlight_fade);
+ immAttr3ubv(col, highlight_fade);
/* corner right-bottom */
if (roundboxtype & UI_CNR_BOTTOM_RIGHT) {
@@ -625,7 +625,7 @@ void ui_draw_but_TAB_outline(const rcti *rect, float rad, unsigned char highligh
immVertex2f(pos, minx, miny);
}
- immAttrib3ubv(col, highlight);
+ immAttr3ubv(col, highlight);
/* back to corner left-top */
immVertex2f(pos, minx, roundboxtype & UI_CNR_TOP_LEFT ? maxy - rad : maxy);
@@ -1456,7 +1456,7 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *UNUSED(wcol), const rcti
v1[0] = v2[0] = x1 + a;
- immAttrib4fv(col_id, colf);
+ immAttr4fv(col_id, colf);
immVertex2fv(pos_id, v1);
immVertex2fv(pos_id, v2);
}
@@ -1475,7 +1475,7 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *UNUSED(wcol), const rcti
v1[0] = v2[0] = x1 + a;
- immAttrib4f(col_id, colf[0], colf[1], colf[2], 1.0f);
+ immAttr4f(col_id, colf[0], colf[1], colf[2], 1.0f);
immVertex2fv(pos_id, v1);
immVertex2fv(pos_id, v2);
}
@@ -1822,7 +1822,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, const rcti
UI_GetThemeColor4fv(TH_TEXT, color);
float fx = rect->xmin + zoomx * (cmp[a].x - offsx);
float fy = rect->ymin + zoomy * (cmp[a].y - offsy);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, fx, fy);
}
immEnd();
@@ -1945,9 +1945,9 @@ void ui_draw_but_TRACKPREVIEW(ARegion *UNUSED(ar), uiBut *but, uiWidgetColors *U
float y2 = pos_sel[i + 1] * axe;
if (i % 2 == 1)
- immAttrib4fv(col, col_sel);
+ immAttr4fv(col, col_sel);
else
- immAttrib4fv(col, col_outline);
+ immAttr4fv(col, col_outline);
immVertex2f(pos, x1, y1);
immVertex2f(pos, x2, y2);
@@ -2078,38 +2078,38 @@ static void ui_shadowbox(unsigned pos, unsigned color, float minx, float miny, f
const float v8[2] = {minx + 0.5f * shadsize, miny - shadsize};
/* right quad */
- immAttrib4ub(color, 0, 0, 0, alpha);
+ immAttr4ub(color, 0, 0, 0, alpha);
immVertex2fv(pos, v3);
immVertex2fv(pos, v1);
- immAttrib4ub(color, 0, 0, 0, 0);
+ immAttr4ub(color, 0, 0, 0, 0);
immVertex2fv(pos, v2);
immVertex2fv(pos, v2);
immVertex2fv(pos, v4);
- immAttrib4ub(color, 0, 0, 0, alpha);
+ immAttr4ub(color, 0, 0, 0, alpha);
immVertex2fv(pos, v3);
/* corner shape */
- /* immAttrib4ub(color, 0, 0, 0, alpha); */ /* Not needed, done above in previous tri */
+ /* immAttr4ub(color, 0, 0, 0, alpha); */ /* Not needed, done above in previous tri */
immVertex2fv(pos, v3);
- immAttrib4ub(color, 0, 0, 0, 0);
+ immAttr4ub(color, 0, 0, 0, 0);
immVertex2fv(pos, v4);
immVertex2fv(pos, v5);
immVertex2fv(pos, v5);
immVertex2fv(pos, v6);
- immAttrib4ub(color, 0, 0, 0, alpha);
+ immAttr4ub(color, 0, 0, 0, alpha);
immVertex2fv(pos, v3);
/* bottom quad */
- /* immAttrib4ub(color, 0, 0, 0, alpha); */ /* Not needed, done above in previous tri */
+ /* immAttr4ub(color, 0, 0, 0, alpha); */ /* Not needed, done above in previous tri */
immVertex2fv(pos, v3);
- immAttrib4ub(color, 0, 0, 0, 0);
+ immAttr4ub(color, 0, 0, 0, 0);
immVertex2fv(pos, v6);
immVertex2fv(pos, v8);
immVertex2fv(pos, v8);
- immAttrib4ub(color, 0, 0, 0, alpha);
+ immAttr4ub(color, 0, 0, 0, alpha);
immVertex2fv(pos, v7);
immVertex2fv(pos, v3);
}
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 1891687b28b..b883984a702 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -2076,22 +2076,22 @@ static void ui_but_set_float_array(bContext *C, uiBut *but, uiHandleButtonData *
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
-static void float_array_to_string(float *values, int array_length, char *output, int max_output_len)
+static void float_array_to_string(float *values, int array_length, char *output, int output_len_max)
{
/* to avoid buffer overflow attacks; numbers are quite arbitrary */
- BLI_assert(max_output_len > 15);
- max_output_len -= 10;
+ BLI_assert(output_len_max > 15);
+ output_len_max -= 10;
int current_index = 0;
output[current_index] = '[';
current_index++;
for (int i = 0; i < array_length; i++) {
- int length = BLI_snprintf(output + current_index, max_output_len - current_index, "%f", values[i]);
+ int length = BLI_snprintf(output + current_index, output_len_max - current_index, "%f", values[i]);
current_index += length;
if (i < array_length - 1) {
- if (current_index < max_output_len) {
+ if (current_index < output_len_max) {
output[current_index + 0] = ',';
output[current_index + 1] = ' ';
current_index += 2;
@@ -2103,12 +2103,12 @@ static void float_array_to_string(float *values, int array_length, char *output,
output[current_index + 1] = '\0';
}
-static void ui_but_copy_numeric_array(uiBut *but, char *output, int max_output_len)
+static void ui_but_copy_numeric_array(uiBut *but, char *output, int output_len_max)
{
int array_length = get_but_property_array_length(but);
float *values = alloca(array_length * sizeof(float));
RNA_property_float_get_array(&but->rnapoin, but->rnaprop, values);
- float_array_to_string(values, array_length, output, max_output_len);
+ float_array_to_string(values, array_length, output, output_len_max);
}
static bool parse_float_array(char *text, float *values, int expected_length)
@@ -2146,11 +2146,11 @@ static void ui_but_paste_numeric_array(bContext *C, uiBut *but, uiHandleButtonDa
}
}
-static void ui_but_copy_numeric_value(uiBut *but, char *output, int max_output_len)
+static void ui_but_copy_numeric_value(uiBut *but, char *output, int output_len_max)
{
/* Get many decimal places, then strip trailing zeros.
* note: too high values start to give strange results */
- ui_but_string_get_ex(but, output, max_output_len, UI_PRECISION_FLOAT_MAX, false, NULL);
+ ui_but_string_get_ex(but, output, output_len_max, UI_PRECISION_FLOAT_MAX, false, NULL);
BLI_str_rstrip_float_zero(output, '\0');
}
@@ -2192,7 +2192,7 @@ static void ui_but_paste_normalized_vector(bContext *C, uiBut *but, char *buf_pa
}
}
-static void ui_but_copy_color(uiBut *but, char *output, int max_output_len)
+static void ui_but_copy_color(uiBut *but, char *output, int output_len_max)
{
float rgba[4];
@@ -2207,7 +2207,7 @@ static void ui_but_copy_color(uiBut *but, char *output, int max_output_len)
if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
srgb_to_linearrgb_v3_v3(rgba, rgba);
- float_array_to_string(rgba, 4, output, max_output_len);
+ float_array_to_string(rgba, 4, output, output_len_max);
}
static void ui_but_paste_color(bContext *C, uiBut *but, char *buf_paste)
@@ -2225,9 +2225,9 @@ static void ui_but_paste_color(bContext *C, uiBut *but, char *buf_paste)
}
}
-static void ui_but_copy_text(uiBut *but, char *output, int max_output_len)
+static void ui_but_copy_text(uiBut *but, char *output, int output_len_max)
{
- ui_but_string_get(but, output, max_output_len);
+ ui_but_string_get(but, output, output_len_max);
}
static void ui_but_paste_text(bContext *C, uiBut *but, uiHandleButtonData *data, char *buf_paste)
@@ -2284,22 +2284,22 @@ static void ui_but_paste_curvemapping(bContext *C, uiBut *but)
}
}
-static void ui_but_copy_operator(bContext *C, uiBut *but, char *output, int max_output_len)
+static void ui_but_copy_operator(bContext *C, uiBut *but, char *output, int output_len_max)
{
PointerRNA *opptr;
opptr = UI_but_operator_ptr_get(but);
char *str;
str = WM_operator_pystring_ex(C, NULL, false, true, but->optype, opptr);
- strncpy(output, str, max_output_len);
+ BLI_strncpy(output, str, output_len_max);
MEM_freeN(str);
}
-static void ui_but_copy_menu(uiBut *but, char *output, int max_output_len)
+static void ui_but_copy_menu(uiBut *but, char *output, int output_len_max)
{
MenuType *mt = UI_but_menutype_get(but);
if (mt) {
- BLI_snprintf(output, max_output_len, "bpy.ops.wm.call_menu(name=\"%s\")", mt->idname);
+ BLI_snprintf(output, output_len_max, "bpy.ops.wm.call_menu(name=\"%s\")", mt->idname);
}
}
@@ -2309,8 +2309,12 @@ static void ui_but_copy(bContext *C, uiBut *but, const bool copy_array)
return;
}
- static const int max_copy_length = UI_MAX_DRAW_STR;
- char buffer_to_copy[UI_MAX_DRAW_STR] = { 0 };
+ /* Arbitrary large value (allow for paths: 'PATH_MAX') */
+ char buf[4096] = {0};
+ const int buf_max_len = sizeof(buf);
+
+ /* Left false for copying internal data (color-band for eg). */
+ bool is_buf_set = false;
bool has_required_data = !(but->poin == NULL && but->rnapoin.data == NULL);
@@ -2319,27 +2323,31 @@ static void ui_but_copy(bContext *C, uiBut *but, const bool copy_array)
case UI_BTYPE_NUM_SLIDER:
if (!has_required_data) break;
if (copy_array && ui_but_has_array_value(but)) {
- ui_but_copy_numeric_array(but, buffer_to_copy, max_copy_length);
+ ui_but_copy_numeric_array(but, buf, buf_max_len);
}
else {
- ui_but_copy_numeric_value(but, buffer_to_copy, max_copy_length);
+ ui_but_copy_numeric_value(but, buf, buf_max_len);
}
+ is_buf_set = true;
break;
case UI_BTYPE_UNITVEC:
if (!has_required_data) break;
- ui_but_copy_numeric_array(but, buffer_to_copy, max_copy_length);
+ ui_but_copy_numeric_array(but, buf, buf_max_len);
+ is_buf_set = true;
break;
case UI_BTYPE_COLOR:
if (!has_required_data) break;
- ui_but_copy_color(but, buffer_to_copy, max_copy_length);
+ ui_but_copy_color(but, buf, buf_max_len);
+ is_buf_set = true;
break;
case UI_BTYPE_TEXT:
case UI_BTYPE_SEARCH_MENU:
if (!has_required_data) break;
- ui_but_copy_text(but, buffer_to_copy, max_copy_length);
+ ui_but_copy_text(but, buf, buf_max_len);
+ is_buf_set = true;
break;
case UI_BTYPE_COLORBAND:
@@ -2351,19 +2359,23 @@ static void ui_but_copy(bContext *C, uiBut *but, const bool copy_array)
break;
case UI_BTYPE_BUT:
- ui_but_copy_operator(C, but, buffer_to_copy, max_copy_length);
+ ui_but_copy_operator(C, but, buf, buf_max_len);
+ is_buf_set = true;
break;
case UI_BTYPE_MENU:
case UI_BTYPE_PULLDOWN:
- ui_but_copy_menu(but, buffer_to_copy, max_copy_length);
+ ui_but_copy_menu(but, buf, buf_max_len);
+ is_buf_set = true;
break;
default:
break;
}
- WM_clipboard_text_set(buffer_to_copy, 0);
+ if (is_buf_set) {
+ WM_clipboard_text_set(buf, 0);
+ }
}
static void ui_but_paste(bContext *C, uiBut *but, uiHandleButtonData *data, const bool paste_array)
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c
index 162687c64ff..0c5eb35f939 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -104,7 +104,7 @@ typedef struct IconImage {
typedef void (*VectorDrawFunc)(int x, int y, int w, int h, float alpha);
#define ICON_TYPE_PREVIEW 0
-#define ICON_TYPE_TEXTURE 1
+#define ICON_TYPE_COLOR_TEXTURE 1
#define ICON_TYPE_MONO_TEXTURE 2
#define ICON_TYPE_BUFFER 3
#define ICON_TYPE_VECTOR 4
@@ -129,6 +129,7 @@ typedef struct DrawInfo {
} buffer;
struct {
int x, y, w, h;
+ int theme_color;
} texture;
struct {
/* Can be packed into a single int. */
@@ -149,29 +150,35 @@ typedef struct IconTexture {
float invh;
} IconTexture;
+typedef struct IconType {
+ int type;
+ int theme_color;
+} IconType;
+
/* ******************* STATIC LOCAL VARS ******************* */
/* static here to cache results of icon directory scan, so it's not
* scanning the filesystem each time the menu is drawn */
static struct ListBase iconfilelist = {NULL, NULL};
static IconTexture icongltex = {0, 0, 0, 0.0f, 0.0f};
-static const int icontypes[] = {
-#define DEF_ICON(name) ICON_TYPE_TEXTURE,
-#define DEF_ICON_VECTOR(name) ICON_TYPE_VECTOR,
-#define DEF_ICON_MONO(name) ICON_TYPE_MONO_TEXTURE,
-#define DEF_ICON_BLANK(name) ICON_TYPE_BLANK,
+static const IconType icontypes[] = {
+#define DEF_ICON(name) {ICON_TYPE_MONO_TEXTURE, 0},
+#define DEF_ICON_COLLECTION(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_COLLECTION},
+#define DEF_ICON_OBJECT(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_OBJECT},
+#define DEF_ICON_OBJECT_DATA(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_OBJECT_DATA},
+#define DEF_ICON_MODIFIER(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_MODIFIER},
+#define DEF_ICON_SHADING(name) {ICON_TYPE_MONO_TEXTURE, TH_ICON_SHADING},
+#define DEF_ICON_VECTOR(name) {ICON_TYPE_VECTOR, 0},
+#define DEF_ICON_COLOR(name) {ICON_TYPE_COLOR_TEXTURE, 0},
+#define DEF_ICON_BLANK(name) {ICON_TYPE_BLANK, 0},
#include "UI_icons.h"
-#undef DEF_ICON
-#undef DEF_ICON_VECTOR
-#undef DEF_ICON_MONO
-#undef DEF_ICON_BLANK
};
/* **************************************************** */
#ifndef WITH_HEADLESS
-static DrawInfo *def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs, int size, int type)
+static DrawInfo *def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs, int size, int type, int theme_color)
{
Icon *new_icon = NULL;
IconImage *iimg = NULL;
@@ -185,7 +192,8 @@ static DrawInfo *def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs,
di = MEM_callocN(sizeof(DrawInfo), "drawinfo");
di->type = type;
- if (ELEM(type, ICON_TYPE_TEXTURE, ICON_TYPE_MONO_TEXTURE)) {
+ if (ELEM(type, ICON_TYPE_COLOR_TEXTURE, ICON_TYPE_MONO_TEXTURE)) {
+ di->data.texture.theme_color = theme_color;
di->data.texture.x = xofs;
di->data.texture.y = yofs;
di->data.texture.w = size;
@@ -439,7 +447,7 @@ static void init_brush_icons(void)
int size = datatoc_ ##name## _png_size; \
DrawInfo *di; \
\
- di = def_internal_icon(NULL, icon_id, 0, 0, w, ICON_TYPE_BUFFER); \
+ di = def_internal_icon(NULL, icon_id, 0, 0, w, ICON_TYPE_BUFFER, 0); \
di->data.buffer.image->datatoc_rect = rect; \
di->data.buffer.image->datatoc_size = size; \
}
@@ -580,7 +588,7 @@ static void init_event_icons(void)
#define INIT_EVENT_ICON(icon_id, type, value) \
{ \
- DrawInfo *di = def_internal_icon(NULL, icon_id, 0, 0, w, ICON_TYPE_EVENT); \
+ DrawInfo *di = def_internal_icon(NULL, icon_id, 0, 0, w, ICON_TYPE_EVENT, 0); \
di->data.input.event_type = type; \
di->data.input.event_value = value; \
di->data.input.icon = icon_id; \
@@ -741,15 +749,15 @@ static void init_internal_icons(void)
for (y = 0; y < ICON_GRID_ROWS; y++) {
/* Row W has monochrome icons. */
for (x = 0; x < ICON_GRID_COLS; x++) {
- int icontype = icontypes[y * ICON_GRID_COLS + x];
- if (!ELEM(icontype, ICON_TYPE_TEXTURE, ICON_TYPE_MONO_TEXTURE)) {
+ IconType icontype = icontypes[y * ICON_GRID_COLS + x];
+ if (!ELEM(icontype.type, ICON_TYPE_COLOR_TEXTURE, ICON_TYPE_MONO_TEXTURE)) {
continue;
}
def_internal_icon(b32buf, BIFICONID_FIRST + y * ICON_GRID_COLS + x,
x * (ICON_GRID_W + ICON_GRID_MARGIN) + ICON_GRID_MARGIN,
y * (ICON_GRID_H + ICON_GRID_MARGIN) + ICON_GRID_MARGIN, ICON_GRID_W,
- icontype);
+ icontype.type, icontype.theme_color);
}
}
}
@@ -1324,7 +1332,6 @@ static void icon_draw_cache_flush_ex(void)
return;
/* We need to flush widget base first to ensure correct ordering. */
- GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
UI_widgetbase_draw_cache_flush();
GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
@@ -1346,6 +1353,8 @@ static void icon_draw_cache_flush_ex(void)
glBindTexture(GL_TEXTURE_2D, 0);
g_icon_draw_cache.calls = 0;
+
+ GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
}
void UI_icon_draw_cache_end(void)
@@ -1358,10 +1367,7 @@ void UI_icon_draw_cache_end(void)
return;
GPU_blend(true);
-
icon_draw_cache_flush_ex();
-
- GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
GPU_blend(false);
}
@@ -1405,9 +1411,10 @@ static void icon_draw_texture(
}
/* We need to flush widget base first to ensure correct ordering. */
- GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
UI_widgetbase_draw_cache_flush();
+ GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
+
float x1, x2, y1, y2;
x1 = ix * icongltex.invw;
@@ -1431,6 +1438,8 @@ static void icon_draw_texture(
GPU_draw_primitive(GPU_PRIM_TRI_STRIP, 4);
glBindTexture(GL_TEXTURE_2D, 0);
+
+ GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
}
/* Drawing size for preview images */
@@ -1516,21 +1525,21 @@ static void icon_draw_size(
const short event_value = di->data.input.event_value;
icon_draw_rect_input(x, y, w, h, alpha, event_type, event_value);
}
- else if (di->type == ICON_TYPE_TEXTURE) {
+ else if (di->type == ICON_TYPE_COLOR_TEXTURE) {
/* texture image use premul alpha for correct scaling */
- GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
icon_draw_texture(x, y, (float)w, (float)h, di->data.texture.x, di->data.texture.y,
di->data.texture.w, di->data.texture.h, alpha, rgb);
- GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
}
else if (di->type == ICON_TYPE_MONO_TEXTURE) {
/* icon that matches text color, assumed to be white */
float color[4];
- if (mono_rgba) {
- rgba_uchar_to_float(color, (const uchar *)mono_rgba);
- }
- else {
- UI_GetThemeColor4fv(TH_TEXT, color);
+ if (!UI_GetIconThemeColor4fv(di->data.texture.theme_color, color)) {
+ if (mono_rgba) {
+ rgba_uchar_to_float(color, (const uchar *)mono_rgba);
+ }
+ else {
+ UI_GetThemeColor4fv(TH_TEXT, color);
+ }
}
if (rgb) {
@@ -1539,10 +1548,8 @@ static void icon_draw_size(
mul_v4_fl(color, alpha);
- GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
icon_draw_texture(x, y, (float)w, (float)h, di->data.texture.x, di->data.texture.y,
di->data.texture.w, di->data.texture.h, color[3], color);
- GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
}
else if (di->type == ICON_TYPE_BUFFER) {
@@ -1672,7 +1679,10 @@ static int ui_id_brush_get_icon(const bContext *C, ID *id)
}
/* reset the icon */
- if (ob != NULL && ob->mode & OB_MODE_GPENCIL_PAINT) {
+ if ((ob != NULL) &&
+ (ob->mode & OB_MODE_GPENCIL_PAINT) &&
+ (br->gpencil_settings != NULL))
+ {
switch (br->gpencil_settings->icon_id) {
case GP_BRUSH_ICON_PENCIL:
br->id.icon_id = ICON_GPBRUSH_PENCIL;
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index c085a294acd..ac8b22aa74f 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -780,7 +780,7 @@ static uiBut *ui_item_with_label(
/* BUTTONS_OT_file_browse calls UI_context_active_but_prop_get_filebrowser */
uiDefIconButO(
block, UI_BTYPE_BUT, subtype == PROP_DIRPATH ? "BUTTONS_OT_directory_browse" : "BUTTONS_OT_file_browse",
- WM_OP_INVOKE_DEFAULT, ICON_FILESEL, x, y, UI_UNIT_X, h, NULL);
+ WM_OP_INVOKE_DEFAULT, ICON_FILEBROWSER, x, y, UI_UNIT_X, h, NULL);
}
else if (flag & UI_ITEM_R_EVENT) {
but = uiDefButR_prop(block, UI_BTYPE_KEY_EVENT, 0, name, x, y, prop_but_width, h, ptr, prop, index, 0, 0, -1, -1, NULL);
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index 590deb59ce3..1897df41fd0 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -551,18 +551,18 @@ static void immRectf_tris_color_ex(
unsigned int pos, float x1, float y1, float x2, float y2,
unsigned int col, const float color[3])
{
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x1, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x2, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x2, y2);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x1, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x2, y2);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x1, y2);
}
@@ -1823,7 +1823,7 @@ static void ui_panel_category_draw_tab(
immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
immBegin(filled ? GPU_PRIM_TRI_FAN : GPU_PRIM_LINE_STRIP, vert_len);
for (int i = 0; i < buf_index; i++) {
- immAttrib3ubv(color, cbuf[i]);
+ immAttr3ubv(color, cbuf[i]);
immVertex2fv(pos, vbuf[i]);
}
immEnd();
diff --git a/source/blender/editors/interface/interface_region_popover.c b/source/blender/editors/interface/interface_region_popover.c
index b71152fcd19..cb4939adc56 100644
--- a/source/blender/editors/interface/interface_region_popover.c
+++ b/source/blender/editors/interface/interface_region_popover.c
@@ -100,7 +100,15 @@ static void ui_popover_create_block(bContext *C, uiPopover *pup, int opcontext)
BLI_assert(pup->ui_size_x != 0);
uiStyle *style = UI_style_get_dpi();
+
pup->block = UI_block_begin(C, NULL, __func__, UI_EMBOSS);
+ UI_block_flag_enable(pup->block, UI_BLOCK_KEEP_OPEN | UI_BLOCK_POPOVER);
+#ifdef USE_UI_POPOVER_ONCE
+ if (pup->is_once) {
+ UI_block_flag_enable(pup->block, UI_BLOCK_POPOVER_ONCE);
+ }
+#endif
+
pup->layout = UI_block_layout(
pup->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0,
pup->ui_size_x, 0, MENU_PADDING, style);
@@ -139,12 +147,6 @@ static uiBlock *ui_block_func_POPOVER(bContext *C, uiPopupBlockHandle *handle, v
UI_block_region_set(block, handle->region);
UI_block_layout_resolve(block, &width, &height);
- UI_block_flag_enable(block, UI_BLOCK_KEEP_OPEN | UI_BLOCK_POPOVER);
-#ifdef USE_UI_POPOVER_ONCE
- if (pup->is_once) {
- UI_block_flag_enable(block, UI_BLOCK_POPOVER_ONCE);
- }
-#endif
UI_block_direction_set(block, UI_DIR_DOWN | UI_DIR_CENTER_X);
const int block_margin = U.widget_unit / 2;
diff --git a/source/blender/editors/interface/interface_region_search.c b/source/blender/editors/interface/interface_region_search.c
index d262cbc38bd..471055ed24a 100644
--- a/source/blender/editors/interface/interface_region_search.c
+++ b/source/blender/editors/interface/interface_region_search.c
@@ -533,8 +533,9 @@ ARegion *ui_searchbox_create_generic(bContext *C, ARegion *butregion, uiBut *but
data->prv_cols = but->a2;
}
- /* only show key shortcuts when needed (not rna buttons) [#36699] */
- if (but->rnaprop == NULL) {
+ /* Only show key shortcuts when needed (checking RNA prop pointer is useless here, a lot of buttons are about data
+ * without having that pointer defined, let's rather try with optype!). */
+ if (but->optype != NULL) {
data->use_sep = true;
}
diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c
index 16c3e01e7aa..47d105efd5f 100644
--- a/source/blender/editors/interface/interface_style.c
+++ b/source/blender/editors/interface/interface_style.c
@@ -179,7 +179,8 @@ void UI_fontstyle_draw_ex(
}
else {
/* draw from boundbox center */
- yofs = ceil(0.5f * (BLI_rcti_size_y(rect) - BLF_ascender(fs->uifont_id)));
+ float height = BLF_ascender(fs->uifont_id) + BLF_descender(fs->uifont_id);
+ yofs = ceil(0.5f * (BLI_rcti_size_y(rect) - height));
}
if (fs->align == UI_STYLE_TEXT_CENTER) {
@@ -225,7 +226,7 @@ void UI_fontstyle_draw_rotated(const uiFontStyle *fs, const rcti *rect, const ch
UI_fontstyle_set(fs);
- height = BLF_ascender(fs->uifont_id);
+ height = BLF_ascender(fs->uifont_id) + BLF_descender(fs->uifont_id);
/* becomes x-offset when rotated */
xofs = ceil(0.5f * (BLI_rcti_size_y(rect) - height));
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 9dfe4d99268..7fbb01919b7 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -623,13 +623,13 @@ static uiBut *template_id_def_new_but(
if (newop) {
but = uiDefIconTextButO(
- block, but_type, newop, WM_OP_INVOKE_DEFAULT, ICON_ZOOMIN,
+ block, but_type, newop, WM_OP_INVOKE_DEFAULT, ICON_ADD,
(id) ? "" : CTX_IFACE_(template_id_context(type), "New"), 0, 0, w, but_height, NULL);
UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ADD_NEW));
}
else {
but = uiDefIconTextBut(
- block, but_type, 0, ICON_ZOOMIN, (id) ? "" : CTX_IFACE_(template_id_context(type), "New"),
+ block, but_type, 0, ICON_ADD, (id) ? "" : CTX_IFACE_(template_id_context(type), "New"),
0, 0, w, but_height, NULL, 0, 0, 0, 0, NULL);
UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_ADD_NEW));
}
@@ -773,13 +773,13 @@ static void template_ID(
if (openop) {
but = uiDefIconTextButO(
- block, UI_BTYPE_BUT, openop, WM_OP_INVOKE_DEFAULT, ICON_FILESEL, (id) ? "" : IFACE_("Open"),
+ block, UI_BTYPE_BUT, openop, WM_OP_INVOKE_DEFAULT, ICON_FILEBROWSER, (id) ? "" : IFACE_("Open"),
0, 0, w, UI_UNIT_Y, NULL);
UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_OPEN));
}
else {
but = uiDefIconTextBut(
- block, UI_BTYPE_BUT, 0, ICON_FILESEL, (id) ? "" : IFACE_("Open"), 0, 0, w, UI_UNIT_Y,
+ block, UI_BTYPE_BUT, 0, ICON_FILEBROWSER, (id) ? "" : IFACE_("Open"), 0, 0, w, UI_UNIT_Y,
NULL, 0, 0, 0, 0, NULL);
UI_but_funcN_set(but, template_id_cb, MEM_dupallocN(template_ui), POINTER_FROM_INT(UI_ID_OPEN));
}
@@ -1164,7 +1164,7 @@ static void template_search_buttons(
template_search_add_button_searchmenu(C, layout, block, template_search, editable, false);
template_search_add_button_name(block, &active_ptr, type);
- template_search_add_button_operator(block, newop, WM_OP_INVOKE_DEFAULT, ICON_ZOOMIN, editable);
+ template_search_add_button_operator(block, newop, WM_OP_INVOKE_DEFAULT, ICON_ADD, editable);
template_search_add_button_operator(block, unlinkop, WM_OP_INVOKE_REGION_WIN, ICON_X, editable);
UI_block_align_end(block);
@@ -1474,10 +1474,10 @@ static uiLayout *draw_modifier(
uiItemO(row, "", ICON_X, "OBJECT_OT_modifier_remove");
}
else if (modifier_is_simulation(md) == 1) {
- uiItemStringO(row, "", ICON_BUTS, "WM_OT_properties_context_change", "context", "PHYSICS");
+ uiItemStringO(row, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PHYSICS");
}
else if (modifier_is_simulation(md) == 2) {
- uiItemStringO(row, "", ICON_BUTS, "WM_OT_properties_context_change", "context", "PARTICLES");
+ uiItemStringO(row, "", ICON_PROPERTIES, "WM_OT_properties_context_change", "context", "PARTICLES");
}
UI_block_emboss_set(block, UI_EMBOSS);
}
@@ -2039,7 +2039,7 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
/* enabled */
UI_block_emboss_set(block, UI_EMBOSS_NONE);
uiItemR(row, &ptr, "mute", 0, "",
- (con->flag & CONSTRAINT_OFF) ? ICON_HIDE_ON : ICON_HIDE_OFF);
+ (con->flag & CONSTRAINT_OFF) ? ICON_RESTRICT_VIEW_ON : ICON_RESTRICT_VIEW_OFF);
UI_block_emboss_set(block, UI_EMBOSS);
uiLayoutSetOperatorContext(row, WM_OP_INVOKE_DEFAULT);
@@ -2361,13 +2361,13 @@ static void colorband_buttons_layout(
row = uiLayoutRow(split, false);
bt = uiDefIconTextBut(
- block, UI_BTYPE_BUT, 0, ICON_ZOOMIN, "", 0, 0, 2.0f * unit, UI_UNIT_Y, NULL,
+ block, UI_BTYPE_BUT, 0, ICON_ADD, "", 0, 0, 2.0f * unit, UI_UNIT_Y, NULL,
0, 0, 0, 0, TIP_("Add a new color stop to the colorband"));
UI_but_funcN_set(bt, colorband_add_cb, MEM_dupallocN(cb), coba);
bt = uiDefIconTextBut(
- block, UI_BTYPE_BUT, 0, ICON_ZOOMOUT, "", xs + 2.0f * unit, ys + UI_UNIT_Y, 2.0f * unit, UI_UNIT_Y,
+ block, UI_BTYPE_BUT, 0, ICON_REMOVE, "", xs + 2.0f * unit, ys + UI_UNIT_Y, 2.0f * unit, UI_UNIT_Y,
NULL, 0, 0, 0, 0, TIP_("Delete the active position"));
UI_but_funcN_set(bt, colorband_del_cb, MEM_dupallocN(cb), coba);
@@ -3309,8 +3309,8 @@ void uiTemplatePalette(uiLayout *layout, PointerRNA *ptr, const char *propname,
col = uiLayoutColumn(layout, true);
uiLayoutRow(col, true);
- uiDefIconButO(block, UI_BTYPE_BUT, "PALETTE_OT_color_add", WM_OP_INVOKE_DEFAULT, ICON_ZOOMIN, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
- uiDefIconButO(block, UI_BTYPE_BUT, "PALETTE_OT_color_delete", WM_OP_INVOKE_DEFAULT, ICON_ZOOMOUT, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
+ uiDefIconButO(block, UI_BTYPE_BUT, "PALETTE_OT_color_add", WM_OP_INVOKE_DEFAULT, ICON_ADD, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
+ uiDefIconButO(block, UI_BTYPE_BUT, "PALETTE_OT_color_delete", WM_OP_INVOKE_DEFAULT, ICON_REMOVE, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
col = uiLayoutColumn(layout, true);
uiLayoutRow(col, true);
@@ -3474,7 +3474,7 @@ static void uilist_draw_item_default(
}
}
-static void uilist_draw_filter_default(struct uiList *ui_list, struct bContext *UNUSED(C), struct uiLayout *layout)
+static void uilist_draw_filter_default(struct uiList *ui_list, struct bContext *UNUSED(C), struct uiLayout *layout, bool reverse)
{
PointerRNA listptr;
uiLayout *row, *subrow;
@@ -3488,10 +3488,13 @@ static void uilist_draw_filter_default(struct uiList *ui_list, struct bContext *
uiItemR(subrow, &listptr, "use_filter_invert", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "",
(ui_list->filter_flag & UILST_FLT_EXCLUDE) ? ICON_ZOOM_OUT : ICON_ZOOM_IN);
- subrow = uiLayoutRow(row, true);
- uiItemR(subrow, &listptr, "use_filter_sort_alpha", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
- uiItemR(subrow, &listptr, "use_filter_sort_reverse", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "",
- (ui_list->filter_sort_flag & UILST_FLT_SORT_REVERSE) ? ICON_TRIA_UP : ICON_TRIA_DOWN);
+ /* a reverse list, cannot sort or invert order in filter */
+ if (!reverse) {
+ subrow = uiLayoutRow(row, true);
+ uiItemR(subrow, &listptr, "use_filter_sort_alpha", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+ uiItemR(subrow, &listptr, "use_filter_sort_reverse", UI_ITEM_R_TOGGLE | UI_ITEM_R_ICON_ONLY, "",
+ (ui_list->filter_sort_flag & UILST_FLT_SORT_REVERSE) ? ICON_SORT_DESC : ICON_SORT_ASC);
+ }
}
typedef struct {
@@ -3714,7 +3717,7 @@ static char *uilist_item_tooltip_func(bContext *UNUSED(C), void *argN, const cha
void uiTemplateList(
uiLayout *layout, bContext *C, const char *listtype_name, const char *list_id,
PointerRNA *dataptr, const char *propname, PointerRNA *active_dataptr, const char *active_propname,
- const char *item_dyntip_propname, int rows, int maxrows, int layout_type, int columns)
+ const char *item_dyntip_propname, int rows, int maxrows, int layout_type, int columns, bool reverse)
{
uiListType *ui_list_type;
uiList *ui_list = NULL;
@@ -3835,6 +3838,19 @@ void uiTemplateList(
MEM_SAFE_FREE(dyn_data->items_filter_neworder);
dyn_data->items_len = dyn_data->items_shown = -1;
+ /* if reverse, enable reverse and forced flag */
+ if (reverse) {
+ ui_list->filter_sort_flag |= UILST_FLT_SORT_REVERSE;
+ ui_list->filter_sort_flag |= UILST_FLT_FORCED_REVERSE;
+ }
+ else {
+ /* if it was forced, disable forced flag to restore all normal behavior */
+ if (ui_list->filter_sort_flag & UILST_FLT_FORCED_REVERSE) {
+ ui_list->filter_sort_flag &= ~UILST_FLT_SORT_REVERSE;
+ ui_list->filter_sort_flag &= ~UILST_FLT_FORCED_REVERSE;
+ }
+ }
+
/* When active item changed since last draw, scroll to it. */
if (activei != ui_list->list_last_activei) {
ui_list->flag |= UILST_SCROLL_TO_ACTIVE_ITEM;
@@ -4112,7 +4128,7 @@ void uiTemplateList(
subblock = uiLayoutGetBlock(col);
uiDefBut(subblock, UI_BTYPE_SEPR, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y * 0.05f, NULL, 0.0, 0.0, 0, 0, "");
- draw_filter(ui_list, C, col);
+ draw_filter(ui_list, C, col, reverse);
}
else {
but = uiDefIconButBitI(subblock, UI_BTYPE_TOGGLE, UILST_FLT_SHOW, 0, ICON_DISCLOSURE_TRI_RIGHT, 0, 0,
@@ -4299,10 +4315,10 @@ eAutoPropButsReturn uiTemplateOperatorPropertyButs(
uiItemM(row, "WM_MT_operator_presets", NULL, ICON_NONE);
wmOperatorType *ot = WM_operatortype_find("WM_OT_operator_preset_add", false);
- uiItemFullO_ptr(row, ot, "", ICON_ZOOMIN, NULL, WM_OP_INVOKE_DEFAULT, 0, &op_ptr);
+ uiItemFullO_ptr(row, ot, "", ICON_ADD, NULL, WM_OP_INVOKE_DEFAULT, 0, &op_ptr);
RNA_string_set(&op_ptr, "operator", op->type->idname);
- uiItemFullO_ptr(row, ot, "", ICON_ZOOMOUT, NULL, WM_OP_INVOKE_DEFAULT, 0, &op_ptr);
+ uiItemFullO_ptr(row, ot, "", ICON_REMOVE, NULL, WM_OP_INVOKE_DEFAULT, 0, &op_ptr);
RNA_string_set(&op_ptr, "operator", op->type->idname);
RNA_boolean_set(&op_ptr, "remove_active", true);
}
@@ -4481,7 +4497,7 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
owner = sa;
}
handle_event = B_STOPFILE;
- icon = ICON_FILESEL;
+ icon = ICON_FILEBROWSER;
}
else {
Scene *scene;
@@ -4506,7 +4522,7 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
*/
if (sa->spacetype != SPACE_NODE) {
handle_event = B_STOPOTHER;
- icon = ICON_IMAGE_COL;
+ icon = ICON_IMAGE;
break;
}
}
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 762d593947e..3441ea7351a 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -940,7 +940,7 @@ static void widget_draw_vertex_buffer(unsigned int pos, unsigned int col, int mo
immBegin(mode, totvert);
for (int i = 0; i < totvert; ++i) {
if (quads_col)
- immAttrib4ubv(col, quads_col[i]);
+ immAttr4ubv(col, quads_col[i]);
immVertex2fv(pos, quads_pos[i]);
}
immEnd();
@@ -1301,7 +1301,7 @@ static void widget_draw_icon(
if (ELEM(but->type, UI_BTYPE_TOGGLE, UI_BTYPE_ROW, UI_BTYPE_TOGGLE_N, UI_BTYPE_LISTROW)) {
if (but->flag & UI_SELECT) {}
else if (but->flag & UI_ACTIVE) {}
- else alpha = 0.5f;
+ else alpha = 0.75f;
}
else if ((but->type == UI_BTYPE_LABEL)) {
/* extra feature allows more alpha blending */
@@ -2084,6 +2084,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
const BIFIconID icon = (but->flag & UI_HAS_ICON) ? but->icon + but->iconadd : ICON_NONE;
int icon_size_init = is_tool ? ICON_DEFAULT_HEIGHT_TOOLBAR : ICON_DEFAULT_HEIGHT;
const float icon_size = icon_size_init / (but->block->aspect / UI_DPI_FAC);
+ const float icon_padding = 2 * UI_DPI_FAC;
#ifdef USE_UI_TOOLBAR_HACK
if (is_tool) {
@@ -2115,7 +2116,7 @@ static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiB
but->block->aspect = aspect_orig;
#endif
- rect->xmin += icon_size;
+ rect->xmin += icon_size + icon_padding;
}
if (but->editstr || (but->drawflag & UI_BUT_TEXT_LEFT)) {
@@ -2597,7 +2598,7 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti *
immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
immBegin(GPU_PRIM_TRI_FAN, tot + 2);
- immAttrib3fv(color, colcent);
+ immAttr3fv(color, colcent);
immVertex2f(pos, centx, centy);
float ang = 0.0f;
@@ -2609,7 +2610,7 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti *
ui_color_picker_to_rgb_v(hsv, col);
- immAttrib3fv(color, col);
+ immAttr3fv(color, col);
immVertex2f(pos, centx + co * radius, centy + si * radius);
}
immEnd();
@@ -2765,22 +2766,22 @@ void ui_draw_gradient(const rcti *rect, const float hsv[3], const int type, cons
dy = (float)BLI_rcti_size_y(rect) / 3.0f;
for (a = 0; a < 3; a++, sy += dy) {
- immAttrib4f(col, col0[a][0], col0[a][1], col0[a][2], alpha);
+ immAttr4f(col, col0[a][0], col0[a][1], col0[a][2], alpha);
immVertex2f(pos, sx1, sy);
- immAttrib4f(col, col1[a][0], col1[a][1], col1[a][2], alpha);
+ immAttr4f(col, col1[a][0], col1[a][1], col1[a][2], alpha);
immVertex2f(pos, sx2, sy);
- immAttrib4f(col, col1[a + 1][0], col1[a + 1][1], col1[a + 1][2], alpha);
+ immAttr4f(col, col1[a + 1][0], col1[a + 1][1], col1[a + 1][2], alpha);
immVertex2f(pos, sx2, sy + dy);
- immAttrib4f(col, col0[a][0], col0[a][1], col0[a][2], alpha);
+ immAttr4f(col, col0[a][0], col0[a][1], col0[a][2], alpha);
immVertex2f(pos, sx1, sy);
- immAttrib4f(col, col1[a + 1][0], col1[a + 1][1], col1[a + 1][2], alpha);
+ immAttr4f(col, col1[a + 1][0], col1[a + 1][1], col1[a + 1][2], alpha);
immVertex2f(pos, sx2, sy + dy);
- immAttrib4f(col, col0[a + 1][0], col0[a + 1][1], col0[a + 1][2], alpha);
+ immAttr4f(col, col0[a + 1][0], col0[a + 1][1], col0[a + 1][2], alpha);
immVertex2f(pos, sx1, sy + dy);
}
}
@@ -4520,14 +4521,14 @@ static void draw_disk_shaded(
if (shaded) {
fac = (y1 + radius_ext) * radius_ext_scale;
round_box_shade_col4_r(r_col, col1, col2, fac);
- immAttrib4ubv(col, r_col);
+ immAttr4ubv(col, r_col);
}
immVertex2f(pos, c * radius_int, s * radius_int);
if (shaded) {
fac = (y2 + radius_ext) * radius_ext_scale;
round_box_shade_col4_r(r_col, col1, col2, fac);
- immAttrib4ubv(col, r_col);
+ immAttr4ubv(col, r_col);
}
immVertex2f(pos, c * radius_ext, s * radius_ext);
}
diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c
index fbbaa544e2c..33a8a2ec5fa 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -686,6 +686,17 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo
case TH_GIZMO_B:
cp = btheme->tui.gizmo_b; break;
+ case TH_ICON_COLLECTION:
+ cp = btheme->tui.icon_collection; break;
+ case TH_ICON_OBJECT:
+ cp = btheme->tui.icon_object; break;
+ case TH_ICON_OBJECT_DATA:
+ cp = btheme->tui.icon_object_data; break;
+ case TH_ICON_MODIFIER:
+ cp = btheme->tui.icon_modifier; break;
+ case TH_ICON_SHADING:
+ cp = btheme->tui.icon_shading; break;
+
case TH_INFO_SELECTED:
cp = ts->info_selected;
break;
@@ -1109,6 +1120,31 @@ void UI_GetThemeColorType4ubv(int colorid, int spacetype, char col[4])
col[3] = cp[3];
}
+bool UI_GetIconThemeColor4fv(int colorid, float col[4])
+{
+ if (colorid == 0) {
+ return false;
+ }
+
+ /* Only colored icons in outliner and popups, overall UI is intended
+ * to stay monochrome and out of the way except a few places where it
+ * is important to communicate different data types. */
+ if (!((theme_spacetype == SPACE_OUTLINER) ||
+ (theme_regionid == RGN_TYPE_TEMPORARY)))
+ {
+ return false;
+ }
+
+ const unsigned char *cp;
+ cp = UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
+ col[0] = ((float)cp[0]) / 255.0f;
+ col[1] = ((float)cp[1]) / 255.0f;
+ col[2] = ((float)cp[2]) / 255.0f;
+ col[3] = ((float)cp[3]) / 255.0f;
+
+ return true;
+}
+
void UI_GetColorPtrShade3ubv(const unsigned char cp[3], unsigned char col[3], int offset)
{
int r, g, b;
diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c
index 9654f088637..baaaac2e814 100644
--- a/source/blender/editors/interface/view2d.c
+++ b/source/blender/editors/interface/view2d.c
@@ -1358,9 +1358,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
UI_GetThemeColor3ubv(TH_GRID, grid_line_color);
for (a = 0; a < step; a++) {
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2fv(pos, vec1);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2fv(pos, vec2);
vec2[0] = vec1[0] += grid->dx;
@@ -1374,9 +1374,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
step++;
for (a = 0; a <= step; a++) {
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2fv(pos, vec1);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2fv(pos, vec2);
vec2[0] = vec1[0] -= grid->dx;
@@ -1395,9 +1395,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
UI_GetThemeColor3ubv(TH_GRID, grid_line_color);
for (a = 0; a <= step; a++) {
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2fv(pos, vec1);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2fv(pos, vec2);
vec2[1] = vec1[1] += grid->dy;
@@ -1410,9 +1410,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
if (flag & V2D_HORIZONTAL_FINELINES) {
UI_GetThemeColorShade3ubv(TH_GRID, 16, grid_line_color);
for (a = 0; a < step; a++) {
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2fv(pos, vec1);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2fv(pos, vec2);
vec2[1] = vec1[1] -= grid->dy;
@@ -1429,9 +1429,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
vec2[0] = v2d->cur.xmax;
vec1[1] = vec2[1] = 0.0f;
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2fv(pos, vec1);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2fv(pos, vec2);
}
@@ -1441,9 +1441,9 @@ void UI_view2d_grid_draw(View2D *v2d, View2DGrid *grid, int flag)
vec2[1] = v2d->cur.ymax;
vec1[0] = vec2[0] = 0.0f;
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2fv(pos, vec1);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2fv(pos, vec2);
}
@@ -1490,7 +1490,7 @@ void UI_view2d_constant_grid_draw(View2D *v2d, float step)
immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
immBegin(GPU_PRIM_LINES, count_x * 2 + count_y * 2 + 4);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
for (int i = 0; i < count_x ; start_x += step, i++) {
immVertex2f(pos, start_x, v2d->cur.ymin);
immVertex2f(pos, start_x, v2d->cur.ymax);
@@ -1504,7 +1504,7 @@ void UI_view2d_constant_grid_draw(View2D *v2d, float step)
/* X and Y axis */
UI_GetThemeColorShade3fv(TH_BACK, -18, theme_color);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, 0.0f, v2d->cur.ymin);
immVertex2f(pos, 0.0f, v2d->cur.ymax);
immVertex2f(pos, v2d->cur.xmin, 0.0f);
@@ -1552,9 +1552,9 @@ void UI_view2d_multi_grid_draw(View2D *v2d, int colorid, float step, int level_s
if (i == 0 || (level < totlevels - 1 && i % level_size == 0))
continue;
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2f(pos, start, v2d->cur.ymin);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2f(pos, start, v2d->cur.ymax);
}
@@ -1567,9 +1567,9 @@ void UI_view2d_multi_grid_draw(View2D *v2d, int colorid, float step, int level_s
if (i == 0 || (level < totlevels - 1 && i % level_size == 0))
continue;
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2f(pos, v2d->cur.xmin, start);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2f(pos, v2d->cur.xmax, start);
}
@@ -1580,14 +1580,14 @@ void UI_view2d_multi_grid_draw(View2D *v2d, int colorid, float step, int level_s
/* X and Y axis */
UI_GetThemeColorShade3ubv(colorid, -18 + ((totlevels - 1) * -6), grid_line_color);
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2f(pos, 0.0f, v2d->cur.ymin);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2f(pos, 0.0f, v2d->cur.ymax);
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2f(pos, v2d->cur.xmin, 0.0f);
- immAttrib3ubv(color, grid_line_color);
+ immAttr3ubv(color, grid_line_color);
immVertex2f(pos, v2d->cur.xmax, 0.0f);
immEnd();
diff --git a/source/blender/editors/mesh/editmesh_knife_project.c b/source/blender/editors/mesh/editmesh_knife_project.c
index 5ccbcf063ad..da8b8d217d7 100644
--- a/source/blender/editors/mesh/editmesh_knife_project.c
+++ b/source/blender/editors/mesh/editmesh_knife_project.c
@@ -66,7 +66,7 @@ static LinkNode *knifeproject_poly_from_object(const bContext *C, Scene *scene,
struct Mesh *me_eval;
bool me_eval_needs_free;
- if (ob->type == OB_MESH || ob->derivedFinal) {
+ if (ob->type == OB_MESH || ob->runtime.mesh_eval) {
me_eval = (ob->runtime.mesh_eval ?
ob->runtime.mesh_eval : mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_BAREMESH));
me_eval_needs_free = false;
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index eeaf345e7f1..552edc5a659 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -253,14 +253,14 @@ static int edbm_subdivide_edge_ring_exec(bContext *C, wmOperator *op)
ViewLayer *view_layer = CTX_data_view_layer(C);
uint objects_len = 0;
- Object * *objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
struct EdgeRingOpSubdProps op_props;
mesh_operator_edgering_props_get(op, &op_props);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * obedit = objects[ob_index];
- BMEditMesh * em = BKE_editmesh_from_object(obedit);
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
if (em->bm->totedgesel == 0) {
continue;
@@ -2375,12 +2375,12 @@ static void mesh_set_smooth_faces(BMEditMesh *em, short smooth)
static int edbm_faces_shade_smooth_exec(bContext *C, wmOperator *UNUSED(op))
{
- ViewLayer * view_layer = CTX_data_view_layer(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
uint objects_len = 0;
- Object * *objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
+ Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object * obedit = objects[ob_index];
- BMEditMesh * em = BKE_editmesh_from_object(obedit);
+ Object *obedit = objects[ob_index];
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
if (em->bm->totfacesel == 0) {
continue;
diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c
index 06add39d90f..8cb4bfba5f5 100644
--- a/source/blender/editors/metaball/mball_edit.c
+++ b/source/blender/editors/metaball/mball_edit.c
@@ -508,6 +508,7 @@ void MBALL_OT_delete_metaelems(wmOperatorType *ot)
ot->idname = "MBALL_OT_delete_metaelems";
/* callback functions */
+ ot->invoke = WM_operator_confirm;
ot->exec = delete_metaelems_exec;
ot->poll = ED_operator_editmball;
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 3fccb5f6943..e8833ca259a 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -67,7 +67,6 @@
#include "BKE_context.h"
#include "BKE_constraint.h"
#include "BKE_curve.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_displist.h"
#include "BKE_effect.h"
#include "BKE_font.h"
@@ -869,9 +868,7 @@ static int empty_drop_named_image_invoke(bContext *C, wmOperator *op, const wmEv
{
Scene *scene = CTX_data_scene(C);
- Base *base = NULL;
Image *ima = NULL;
- Object *ob = NULL;
ima = (Image *)WM_operator_drop_load_path(C, op, ID_IM);
if (!ima) {
@@ -880,26 +877,22 @@ static int empty_drop_named_image_invoke(bContext *C, wmOperator *op, const wmEv
/* handled below */
id_us_min((ID *)ima);
- base = ED_view3d_give_base_under_cursor(C, event->mval);
+ Object *ob = NULL;
+ Object *ob_cursor = ED_view3d_give_object_under_cursor(C, event->mval);
- /* if empty under cursor, then set object */
- if (base && base->object->type == OB_EMPTY) {
- ob = base->object;
- DEG_id_tag_update(&scene->id, DEG_TAG_SELECT_UPDATE);
+ /* either change empty under cursor or create a new empty */
+ if (ob_cursor && ob_cursor->type == OB_EMPTY) {
WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene);
+ DEG_id_tag_update((ID *)ob_cursor, DEG_TAG_TRANSFORM);
+ ob = ob_cursor;
}
else {
- /* add new empty */
- float rot[3];
-
- if (!ED_object_add_generic_get_opts(C, op, 'Z', NULL, rot, NULL, NULL))
- return OPERATOR_CANCELLED;
+ ob = ED_object_add_type(C, OB_EMPTY, NULL, NULL, NULL, false);
- ob = ED_object_add_type(C, OB_EMPTY, NULL, NULL, rot, false);
-
- /* add under the mouse */
ED_object_location_from_view(C, ob->loc);
ED_view3d_cursor3d_position(C, event->mval, false, ob->loc);
+ ED_object_rotation_from_view(C, ob->rot, 'Z');
+ ob->empty_drawsize = 5.0f;
}
BKE_object_empty_draw_type_set(ob, OB_EMPTY_IMAGE);
@@ -1774,7 +1767,6 @@ static int convert_exec(bContext *C, wmOperator *op)
ViewLayer *view_layer = CTX_data_view_layer(C);
Base *basen = NULL, *basact = NULL;
Object *ob1, *obact = CTX_data_active_object(C);
- DerivedMesh *dm;
Curve *cu;
Nurb *nu;
MetaBall *mb;
@@ -1911,12 +1903,11 @@ static int convert_exec(bContext *C, wmOperator *op)
/* note: get the mesh from the original, not from the copy in some
* cases this doesn't give correct results (when MDEF is used for eg)
*/
- dm = mesh_get_derived_final(depsgraph, scene, newob, CD_MASK_MESH);
-
- DM_to_mesh(dm, newob->data, newob, CD_MASK_MESH, true);
-
- /* re-tessellation is called by DM_to_mesh */
-
+ Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, newob, CD_MASK_MESH);
+ if (newob->runtime.mesh_eval == me_eval) {
+ newob->runtime.mesh_eval = NULL;
+ }
+ BKE_mesh_nomain_to_mesh(me_eval, newob->data, newob, CD_MASK_MESH, true);
BKE_object_free_modifiers(newob, 0); /* after derivedmesh calls! */
}
else if (ob->type == OB_FONT) {
diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c
index d0d82a8ccc7..cc9f21df3f9 100644
--- a/source/blender/editors/object/object_bake_api.c
+++ b/source/blender/editors/object/object_bake_api.c
@@ -635,7 +635,7 @@ static Mesh *bake_mesh_new_from_object(Depsgraph *depsgraph, Main *bmain, Scene
{
ED_object_editmode_load(bmain, ob);
- Mesh *me = BKE_mesh_new_from_object(depsgraph, bmain, scene, ob, 1, 0, 0);
+ Mesh *me = BKE_mesh_new_from_object(depsgraph, bmain, scene, ob, 1, 0);
if (me->flag & ME_AUTOSMOOTH) {
BKE_mesh_split_faces(me, true);
}
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index c893f106363..89eea4c1b64 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -1993,7 +1993,7 @@ static void move_to_collection_menu_create(bContext *UNUSED(C), uiLayout *layout
uiItemFullO_ptr(layout,
menu->ot,
"New Collection",
- ICON_ZOOMIN,
+ ICON_ADD,
menu->ptr.data,
WM_OP_INVOKE_DEFAULT,
0,
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index cfd50b0dba6..2b5b5a078a6 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -98,6 +98,23 @@ static void modifier_skin_customdata_delete(struct Object *ob);
/******************************** API ****************************/
+static void object_force_modifier_update_for_bind(Depsgraph *depsgraph, Scene *scene, Object *ob)
+{
+ if (ob->type == OB_MESH) {
+ Mesh *me_eval = mesh_create_eval_final_view(depsgraph, scene, ob, 0);
+ BKE_id_free(NULL, me_eval);
+ }
+ else if (ob->type == OB_LATTICE) {
+ BKE_lattice_modifiers_calc(depsgraph, scene, ob);
+ }
+ else if (ob->type == OB_MBALL) {
+ BKE_displist_make_mball(depsgraph, scene, ob);
+ }
+ else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
+ BKE_displist_make_curveTypes(depsgraph, scene, ob, 0);
+ }
+}
+
ModifierData *ED_object_modifier_add(ReportList *reports, Main *bmain, Scene *scene, Object *ob, const char *name, int type)
{
ModifierData *md = NULL, *new_md = NULL;
@@ -2269,27 +2286,13 @@ static int laplaciandeform_bind_exec(bContext *C, wmOperator *op)
lmd->flag &= ~MOD_LAPLACIANDEFORM_BIND;
}
else {
- DerivedMesh *dm;
int mode = lmd->modifier.mode;
/* Force modifier to run, it will call binding routine. */
- /* TODO(Sybren): deduplicate the code below, it's used multiple times here. */
lmd->modifier.mode |= eModifierMode_Realtime;
lmd->flag |= MOD_LAPLACIANDEFORM_BIND;
- if (ob->type == OB_MESH) {
- dm = mesh_create_derived_view(depsgraph, scene, ob, 0);
- dm->release(dm);
- }
- else if (ob->type == OB_LATTICE) {
- BKE_lattice_modifiers_calc(depsgraph, scene, ob);
- }
- else if (ob->type == OB_MBALL) {
- BKE_displist_make_mball(depsgraph, scene, ob);
- }
- else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
- BKE_displist_make_curveTypes(depsgraph, scene, ob, 0);
- }
+ object_force_modifier_update_for_bind(depsgraph, scene, ob);
lmd->modifier.mode = mode;
}
@@ -2340,39 +2343,24 @@ static int surfacedeform_bind_exec(bContext *C, wmOperator *op)
if (!smd)
return OPERATOR_CANCELLED;
-
if (smd->flags & MOD_SDEF_BIND) {
/* Un-binding happens inside the modifier when it's evaluated. */
smd->flags &= ~MOD_SDEF_BIND;
}
else if (smd->target) {
- DerivedMesh *dm;
int mode = smd->modifier.mode;
/* Force modifier to run, it will call binding routine. */
smd->modifier.mode |= eModifierMode_Realtime;
smd->flags |= MOD_SDEF_BIND;
- if (ob->type == OB_MESH) {
- dm = mesh_create_derived_view(depsgraph, scene, ob, 0);
- dm->release(dm);
- }
- else if (ob->type == OB_LATTICE) {
- BKE_lattice_modifiers_calc(depsgraph, scene, ob);
- }
- else if (ob->type == OB_MBALL) {
- BKE_displist_make_mball(depsgraph, scene, ob);
- }
- else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
- BKE_displist_make_curveTypes(depsgraph, scene, ob, 0);
- }
+ object_force_modifier_update_for_bind(depsgraph, scene, ob);
smd->modifier.mode = mode;
}
DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
-
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 66cd90c1c83..9bd30aa2497 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -2865,13 +2865,13 @@ void ED_region_grid_draw(ARegion *ar, float zoomx, float zoomy)
/* the fine resolution level */
for (int i = 0; i < count_fine; i++) {
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x1, y1 * (1.0f - fac) + y2 * fac);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x2, y1 * (1.0f - fac) + y2 * fac);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x1 * (1.0f - fac) + x2 * fac, y1);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x1 * (1.0f - fac) + x2 * fac, y2);
fac += gridstep;
}
@@ -2882,13 +2882,13 @@ void ED_region_grid_draw(ARegion *ar, float zoomx, float zoomy)
/* the large resolution level */
for (int i = 0; i < count_large; i++) {
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x1, y1 * (1.0f - fac) + y2 * fac);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x2, y1 * (1.0f - fac) + y2 * fac);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x1 * (1.0f - fac) + x2 * fac, y1);
- immAttrib3fv(color, theme_color);
+ immAttr3fv(color, theme_color);
immVertex2f(pos, x1 * (1.0f - fac) + x2 * fac, y2);
fac += 4.0f * gridstep;
}
diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c
index b1bda08e9a5..728df79fbbd 100644
--- a/source/blender/editors/screen/glutil.c
+++ b/source/blender/editors/screen/glutil.c
@@ -297,16 +297,16 @@ void immDrawPixelsTexScaled_clipping(IMMDrawPixelsTexState *state,
}
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texco, (float)(0 + offset_left) / tex_w, (float)(0 + offset_bot) / tex_h);
+ immAttr2f(texco, (float)(0 + offset_left) / tex_w, (float)(0 + offset_bot) / tex_h);
immVertex2f(pos, rast_x + (float)offset_left * xzoom, rast_y + (float)offset_bot * yzoom);
- immAttrib2f(texco, (float)(subpart_w - offset_right) / tex_w, (float)(0 + offset_bot) / tex_h);
+ immAttr2f(texco, (float)(subpart_w - offset_right) / tex_w, (float)(0 + offset_bot) / tex_h);
immVertex2f(pos, rast_x + (float)(subpart_w - offset_right) * xzoom * scaleX, rast_y + (float)offset_bot * yzoom);
- immAttrib2f(texco, (float)(subpart_w - offset_right) / tex_w, (float)(subpart_h - offset_top) / tex_h);
+ immAttr2f(texco, (float)(subpart_w - offset_right) / tex_w, (float)(subpart_h - offset_top) / tex_h);
immVertex2f(pos, rast_x + (float)(subpart_w - offset_right) * xzoom * scaleX, rast_y + (float)(subpart_h - offset_top) * yzoom * scaleY);
- immAttrib2f(texco, (float)(0 + offset_left) / tex_w, (float)(subpart_h - offset_top) / tex_h);
+ immAttr2f(texco, (float)(0 + offset_left) / tex_w, (float)(subpart_h - offset_top) / tex_h);
immVertex2f(pos, rast_x + (float)offset_left * xzoom, rast_y + (float)(subpart_h - offset_top) * yzoom * scaleY);
immEnd();
}
diff --git a/source/blender/editors/sculpt_paint/paint_cursor.c b/source/blender/editors/sculpt_paint/paint_cursor.c
index 5cca61d4c78..0ee55f0f062 100644
--- a/source/blender/editors/sculpt_paint/paint_cursor.c
+++ b/source/blender/editors/sculpt_paint/paint_cursor.c
@@ -694,13 +694,13 @@ static void paint_draw_tex_overlay(
immUniform1i("image", GL_TEXTURE0);
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texCoord, 0.0f, 0.0f);
+ immAttr2f(texCoord, 0.0f, 0.0f);
immVertex2f(pos, quad.xmin, quad.ymin);
- immAttrib2f(texCoord, 1.0f, 0.0f);
+ immAttr2f(texCoord, 1.0f, 0.0f);
immVertex2f(pos, quad.xmax, quad.ymin);
- immAttrib2f(texCoord, 1.0f, 1.0f);
+ immAttr2f(texCoord, 1.0f, 1.0f);
immVertex2f(pos, quad.xmax, quad.ymax);
- immAttrib2f(texCoord, 0.0f, 1.0f);
+ immAttr2f(texCoord, 0.0f, 1.0f);
immVertex2f(pos, quad.xmin, quad.ymax);
immEnd();
@@ -777,13 +777,13 @@ static void paint_draw_cursor_overlay(
immUniform1i("image", 0);
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texCoord, 0.0f, 0.0f);
+ immAttr2f(texCoord, 0.0f, 0.0f);
immVertex2f(pos, quad.xmin, quad.ymin);
- immAttrib2f(texCoord, 1.0f, 0.0f);
+ immAttr2f(texCoord, 1.0f, 0.0f);
immVertex2f(pos, quad.xmax, quad.ymin);
- immAttrib2f(texCoord, 1.0f, 1.0f);
+ immAttr2f(texCoord, 1.0f, 1.0f);
immVertex2f(pos, quad.xmax, quad.ymax);
- immAttrib2f(texCoord, 0.0f, 1.0f);
+ immAttr2f(texCoord, 0.0f, 1.0f);
immVertex2f(pos, quad.xmin, quad.ymax);
immEnd();
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c
index e914a24092e..9057c3b0609 100644
--- a/source/blender/editors/sculpt_paint/paint_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_utils.c
@@ -53,6 +53,7 @@
#include "BKE_customdata.h"
#include "BKE_image.h"
#include "BKE_material.h"
+#include "BKE_mesh_runtime.h"
#include "BKE_object.h"
#include "BKE_paint.h"
#include "BKE_report.h"
@@ -285,13 +286,15 @@ static void imapaint_tri_weights(
/* compute uv coordinates of mouse in face */
static void imapaint_pick_uv(Mesh *me_eval, Scene *scene, Object *ob_eval, unsigned int faceindex, const int xy[2], float uv[2])
{
- const int tottri = me_eval->runtime.looptris.len;
int i, findex;
float p[2], w[3], absw, minabsw;
float matrix[4][4], proj[4][4];
GLint view[4];
const eImagePaintMode mode = scene->toolsettings->imapaint.mode;
- const MLoopTri *lt = me_eval->runtime.looptris.array;
+
+ const MLoopTri *lt = BKE_mesh_runtime_looptri_ensure(me_eval);
+ const int tottri = me_eval->runtime.looptris.len;
+
const MVert *mvert = me_eval->mvert;
const MPoly *mpoly = me_eval->mpoly;
const MLoop *mloop = me_eval->mloop;
@@ -327,7 +330,7 @@ static void imapaint_pick_uv(Mesh *me_eval, Scene *scene, Object *ob_eval, unsig
const Material *ma;
const TexPaintSlot *slot;
- ma = give_current_material(ob_eval, mp->mat_nr);
+ ma = give_current_material(ob_eval, mp->mat_nr + 1);
slot = &ma->texpaintslot[ma->paint_active_slot];
if (!(slot && slot->uvname &&
@@ -466,7 +469,7 @@ void paint_sample_color(bContext *C, ARegion *ar, int x, int y, bool texpaint_pr
if (ob) {
Mesh *me = (Mesh *)ob->data;
- Mesh *me_eval = BKE_object_get_evaluated_mesh(depsgraph, ob); /* Or shall we just do ob_eval->mesh_eval ? */
+ Mesh *me_eval = ob_eval->runtime.mesh_eval;
ViewContext vc;
const int mval[2] = {x, y};
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 139986fa1c1..7b3cfe184f5 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -173,12 +173,12 @@ static MDeformVert *defweight_prev_init(MDeformVert *dvert_prev, MDeformVert *dv
* (without rebuilding the 'derivedFinal') */
static bool vertex_paint_use_fast_update_check(Object *ob)
{
- DerivedMesh *dm = ob->derivedFinal;
+ Mesh *me_eval = ob->runtime.mesh_eval;
- if (dm) {
+ if (me_eval != NULL) {
Mesh *me = BKE_mesh_from_object(ob);
if (me && me->mloopcol) {
- return (me->mloopcol == CustomData_get_layer(&dm->loopData, CD_MLOOPCOL));
+ return (me->mloopcol == CustomData_get_layer(&me_eval->ldata, CD_MLOOPCOL));
}
}
diff --git a/source/blender/editors/space_buttons/buttons_texture.c b/source/blender/editors/space_buttons/buttons_texture.c
index de422565abd..958b55526c3 100644
--- a/source/blender/editors/space_buttons/buttons_texture.c
+++ b/source/blender/editors/space_buttons/buttons_texture.c
@@ -507,7 +507,7 @@ void uiTemplateTextureShow(uiLayout *layout, bContext *C, PointerRNA *ptr, Prope
uiBlock *block = uiLayoutGetBlock(layout);
uiBut *but;
- but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_BUTS, 0, 0, UI_UNIT_X, UI_UNIT_Y,
+ but = uiDefIconBut(block, UI_BTYPE_BUT, 0, ICON_PROPERTIES, 0, 0, UI_UNIT_X, UI_UNIT_Y,
NULL, 0.0, 0.0, 0.0, 0.0, TIP_("Show texture in texture tab"));
UI_but_func_set(but, template_texture_show, user->ptr.data, user->prop);
}
diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c
index 14ab00cbef5..7820012ad14 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -514,6 +514,7 @@ static void buttons_area_listener(
break;
case NC_BRUSH:
buttons_area_redraw(sa, BCONTEXT_TEXTURE);
+ buttons_area_redraw(sa, BCONTEXT_TOOL);
sbuts->preview = 1;
break;
case NC_TEXTURE:
diff --git a/source/blender/editors/space_clip/clip_dopesheet_draw.c b/source/blender/editors/space_clip/clip_dopesheet_draw.c
index 2aa0a3e2b9a..dec7487a754 100644
--- a/source/blender/editors/space_clip/clip_dopesheet_draw.c
+++ b/source/blender/editors/space_clip/clip_dopesheet_draw.c
@@ -82,7 +82,7 @@ static void draw_keyframe_shape(float x, float y, bool sel, float alpha,
UI_GetThemeColorShadeAlpha4fv(TH_STRIP_SELECT, 50, -255 * (1.0f - alpha), color);
}
- immAttrib4fv(color_id, color);
+ immAttr4fv(color_id, color);
immVertex2f(pos_id, x, y);
}
@@ -225,8 +225,8 @@ void clip_draw_dopesheet_main(SpaceClip *sc, ARegion *ar, Scene *scene)
immBegin(GPU_PRIM_POINTS, keyframe_len);
/* all same size with black outline */
- immAttrib1f(size_id, 2.0f * STRIP_HEIGHT_HALF);
- immAttrib4ub(outline_color_id, 0, 0, 0, 255);
+ immAttr1f(size_id, 2.0f * STRIP_HEIGHT_HALF);
+ immAttr4ub(outline_color_id, 0, 0, 0, 255);
y = (float) CHANNEL_FIRST; /* start again at the top */
for (channel = dopesheet->channels.first; channel; channel = channel->next) {
diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c
index ebdf5342172..9f4983a35b2 100644
--- a/source/blender/editors/space_clip/clip_draw.c
+++ b/source/blender/editors/space_clip/clip_draw.c
@@ -1154,16 +1154,16 @@ static void draw_plane_marker_image(Scene *scene,
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texCoord, 0.0f, 0.0f);
+ immAttr2f(texCoord, 0.0f, 0.0f);
immVertex2f(pos, 0.0f, 0.0f);
- immAttrib2f(texCoord, 1.0f, 0.0f);
+ immAttr2f(texCoord, 1.0f, 0.0f);
immVertex2f(pos, 1.0f, 0.0f);
- immAttrib2f(texCoord, 1.0f, 1.0f);
+ immAttr2f(texCoord, 1.0f, 1.0f);
immVertex2f(pos, 1.0f, 1.0f);
- immAttrib2f(texCoord, 0.0f, 1.0f);
+ immAttr2f(texCoord, 0.0f, 1.0f);
immVertex2f(pos, 0.0f, 1.0f);
immEnd();
diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index 679ae6b9648..2ae432fbc4e 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -221,13 +221,13 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
/* Filename number increment / decrement buttons. */
if (fnumbuttons && (params->flag & FILE_DIRSEL_ONLY) == 0) {
UI_block_align_begin(block);
- but = uiDefIconButO(block, UI_BTYPE_BUT, "FILE_OT_filenum", 0, ICON_ZOOMOUT,
+ but = uiDefIconButO(block, UI_BTYPE_BUT, "FILE_OT_filenum", 0, ICON_REMOVE,
min_x + line2_w + separator - chan_offs, line2_y,
btn_fn_w, btn_h,
TIP_("Decrement the filename number"));
RNA_int_set(UI_but_operator_ptr_get(but), "increment", -1);
- but = uiDefIconButO(block, UI_BTYPE_BUT, "FILE_OT_filenum", 0, ICON_ZOOMIN,
+ but = uiDefIconButO(block, UI_BTYPE_BUT, "FILE_OT_filenum", 0, ICON_ADD,
min_x + line2_w + separator + btn_fn_w - chan_offs, line2_y,
btn_fn_w, btn_h,
TIP_("Increment the filename number"));
@@ -515,15 +515,15 @@ static void draw_dividers(FileLayout *layout, View2D *v2d)
sx += step;
v1[0] = v2[0] = sx;
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2iv(pos, v1);
- immAttrib3ubv(color, col_lo);
+ immAttr3ubv(color, col_lo);
immVertex2iv(pos, v2);
v1[0] = v2[0] = sx + 1;
- immSkipAttrib(color);
+ immAttrSkip(color);
immVertex2iv(pos, v1);
- immAttrib3ubv(color, col_hi);
+ immAttr3ubv(color, col_hi);
immVertex2iv(pos, v2);
}
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index 76845c44226..6d898ee2fe9 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -56,12 +56,12 @@ typedef enum FileCheckType {
CHECK_ALL = 3
} FileCheckType;
-struct ListBase * folderlist_new(void);
+struct ListBase *folderlist_new(void);
void folderlist_free(struct ListBase *folderlist);
-struct ListBase * folderlist_duplicate(ListBase *folderlist);
+struct ListBase *folderlist_duplicate(ListBase *folderlist);
void folderlist_popdir(struct ListBase *folderlist, char *dir);
void folderlist_pushdir(struct ListBase *folderlist, const char *dir);
-const char * folderlist_peeklastdir(struct ListBase *folderdist);
+const char *folderlist_peeklastdir(struct ListBase *folderdist);
int folderlist_clear_next(struct SpaceFile *sfile);
@@ -77,24 +77,24 @@ void filelist_filter(struct FileList *filelist);
void filelist_init_icons(void);
void filelist_free_icons(void);
void filelist_imgsize(struct FileList *filelist, short w, short h);
-struct ImBuf * filelist_getimage(struct FileList *filelist, const int index);
-struct ImBuf * filelist_geticon_image(struct FileList *filelist, const int index);
+struct ImBuf *filelist_getimage(struct FileList *filelist, const int index);
+struct ImBuf *filelist_geticon_image(struct FileList *filelist, const int index);
int filelist_geticon(struct FileList *filelist, const int index, const bool is_main);
-struct FileList * filelist_new(short type);
+struct FileList *filelist_new(short type);
void filelist_clear(struct FileList *filelist);
void filelist_clear_ex(struct FileList *filelist, const bool do_cache, const bool do_selection);
void filelist_free(struct FileList *filelist);
-const char * filelist_dir(struct FileList *filelist);
+const char *filelist_dir(struct FileList *filelist);
bool filelist_is_dir(struct FileList *filelist, const char *path);
void filelist_setdir(struct FileList *filelist, char *r_dir);
int filelist_files_ensure(struct FileList *filelist);
int filelist_empty(struct FileList *filelist);
-FileDirEntry * filelist_file(struct FileList *filelist, int index);
+FileDirEntry *filelist_file(struct FileList *filelist, int index);
int filelist_file_findpath(struct FileList *filelist, const char *file);
-FileDirEntry * filelist_entry_find_uuid(struct FileList *filelist, const int uuid[4]);
+FileDirEntry *filelist_entry_find_uuid(struct FileList *filelist, const int uuid[4]);
void filelist_file_cache_slidingwindow_set(struct FileList *filelist, size_t window_size);
bool filelist_file_cache_block(struct FileList *filelist, const int index);
diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c
index c8b3b182b9c..ddb248f754d 100644
--- a/source/blender/editors/space_graph/graph_buttons.c
+++ b/source/blender/editors/space_graph/graph_buttons.c
@@ -874,7 +874,7 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, ID *id, FCurve *f
/* add driver variable - add blank */
row = uiLayoutRow(layout, true);
block = uiLayoutGetBlock(row);
- but = uiDefIconTextBut(block, UI_BTYPE_BUT, B_IPO_DEPCHANGE, ICON_ZOOMIN, IFACE_("Add Input Variable"),
+ but = uiDefIconTextBut(block, UI_BTYPE_BUT, B_IPO_DEPCHANGE, ICON_ADD, IFACE_("Add Input Variable"),
0, 0, 10 * UI_UNIT_X, UI_UNIT_Y,
NULL, 0.0, 0.0, 0, 0,
TIP_("Add a Driver Variable to keep track an input used by the driver"));
@@ -888,7 +888,7 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, ID *id, FCurve *f
/* add driver variable */
row = uiLayoutRow(layout, false);
block = uiLayoutGetBlock(row);
- but = uiDefIconTextBut(block, UI_BTYPE_BUT, B_IPO_DEPCHANGE, ICON_ZOOMIN, IFACE_("Add Input Variable"),
+ but = uiDefIconTextBut(block, UI_BTYPE_BUT, B_IPO_DEPCHANGE, ICON_ADD, IFACE_("Add Input Variable"),
0, 0, 10 * UI_UNIT_X, UI_UNIT_Y,
NULL, 0.0, 0.0, 0, 0,
TIP_("Driver variables ensure that all dependencies will be accounted for, eusuring that drivers will update correctly"));
diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c
index ad9af8cb948..927f64cb528 100644
--- a/source/blender/editors/space_graph/graph_draw.c
+++ b/source/blender/editors/space_graph/graph_draw.c
@@ -363,9 +363,9 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu)
if ((!prevbezt && (bezt->ipo == BEZT_IPO_BEZ)) || (prevbezt && (prevbezt->ipo == BEZT_IPO_BEZ))) {
UI_GetThemeColor3ubv(basecol + bezt->h1, col);
col[3] = fcurve_display_alpha(fcu) * 255;
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp);
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp + 3);
}
@@ -373,9 +373,9 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu)
if (bezt->ipo == BEZT_IPO_BEZ) {
UI_GetThemeColor3ubv(basecol + bezt->h2, col);
col[3] = fcurve_display_alpha(fcu) * 255;
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp + 3);
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp + 6);
}
}
@@ -387,9 +387,9 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu)
fp = bezt->vec[0];
UI_GetThemeColor3ubv(basecol + bezt->h1, col);
col[3] = fcurve_display_alpha(fcu) * 255;
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp);
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp + 3);
}
@@ -400,9 +400,9 @@ static void draw_fcurve_handles(SpaceIpo *sipo, FCurve *fcu)
fp = bezt->vec[1];
UI_GetThemeColor3ubv(basecol + bezt->h2, col);
col[3] = fcurve_display_alpha(fcu) * 255;
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp);
- immAttrib4ubv(color, col);
+ immAttr4ubv(color, col);
immVertex2fv(pos, fp + 3);
}
}
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index b9f49d0aeae..65170c7c203 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -1786,7 +1786,7 @@ static void node_composit_buts_file_output_ex(uiLayout *layout, bContext *C, Poi
uiItemS(layout);
- uiItemO(layout, IFACE_("Add Input"), ICON_ZOOMIN, "NODE_OT_output_file_add_socket");
+ uiItemO(layout, IFACE_("Add Input"), ICON_ADD, "NODE_OT_output_file_add_socket");
row = uiLayoutRow(layout, false);
col = uiLayoutColumn(row, true);
@@ -1795,13 +1795,13 @@ static void node_composit_buts_file_output_ex(uiLayout *layout, bContext *C, Poi
/* using different collection properties if multilayer format is enabled */
if (multilayer) {
uiTemplateList(col, C, "UI_UL_list", "file_output_node", ptr, "layer_slots", ptr, "active_input_index",
- NULL, 0, 0, 0, 0);
+ NULL, 0, 0, 0, 0, false);
RNA_property_collection_lookup_int(ptr, RNA_struct_find_property(ptr, "layer_slots"),
active_index, &active_input_ptr);
}
else {
uiTemplateList(col, C, "UI_UL_list", "file_output_node", ptr, "file_slots", ptr, "active_input_index",
- NULL, 0, 0, 0, 0);
+ NULL, 0, 0, 0, 0, false);
RNA_property_collection_lookup_int(ptr, RNA_struct_find_property(ptr, "file_slots"),
active_index, &active_input_ptr);
}
@@ -2495,8 +2495,8 @@ static void node_composit_buts_cryptomatte(uiLayout *layout, bContext *UNUSED(C)
static void node_composit_buts_cryptomatte_ex(uiLayout *layout, bContext *UNUSED(C), PointerRNA *UNUSED(ptr))
{
- uiItemO(layout, IFACE_("Add Crypto Layer"), ICON_ZOOMIN, "NODE_OT_cryptomatte_layer_add");
- uiItemO(layout, IFACE_("Remove Crypto Layer"), ICON_ZOOMOUT, "NODE_OT_cryptomatte_layer_remove");
+ uiItemO(layout, IFACE_("Add Crypto Layer"), ICON_ADD, "NODE_OT_cryptomatte_layer_add");
+ uiItemO(layout, IFACE_("Remove Crypto Layer"), ICON_REMOVE, "NODE_OT_cryptomatte_layer_remove");
}
static void node_composit_buts_brightcontrast(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -3007,9 +3007,9 @@ void ED_node_init_butfuncs(void)
NODE_TYPES_END
/* tree type icons */
- ntreeType_Composite->ui_icon = ICON_RENDERLAYERS;
- ntreeType_Shader->ui_icon = ICON_MATERIAL;
- ntreeType_Texture->ui_icon = ICON_TEXTURE;
+ ntreeType_Composite->ui_icon = ICON_NODE_COMPOSITING;
+ ntreeType_Shader->ui_icon = ICON_NODE_MATERIAL;
+ ntreeType_Texture->ui_icon = ICON_NODE_TEXTURE;
}
void ED_init_custom_node_type(bNodeType *ntype)
diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c
index c2efc548c30..0a913bcbea8 100644
--- a/source/blender/editors/space_node/node_buttons.c
+++ b/source/blender/editors/space_node/node_buttons.c
@@ -150,14 +150,14 @@ static void node_tree_interface_panel(const bContext *C, Panel *pa)
ot = WM_operatortype_find("NODE_OT_tree_socket_add", false);
uiItemL(col, IFACE_("Inputs:"), ICON_NONE);
uiTemplateList(col, (bContext *)C, "NODE_UL_interface_sockets", "inputs", &ptr, "inputs", &ptr, "active_input",
- NULL, 0, 0, 0, 0);
+ NULL, 0, 0, 0, 0, false);
uiItemFullO_ptr(col, ot, "", ICON_PLUS, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr);
RNA_enum_set(&opptr, "in_out", SOCK_IN);
col = uiLayoutColumn(split, true);
uiItemL(col, IFACE_("Outputs:"), ICON_NONE);
uiTemplateList(col, (bContext *)C, "NODE_UL_interface_sockets", "outputs", &ptr, "outputs", &ptr, "active_output",
- NULL, 0, 0, 0, 0);
+ NULL, 0, 0, 0, 0, false);
uiItemFullO_ptr(col, ot, "", ICON_PLUS, NULL, WM_OP_EXEC_DEFAULT, 0, &opptr);
RNA_enum_set(&opptr, "in_out", SOCK_OUT);
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index bba46771674..17ef2c32160 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -638,7 +638,7 @@ static void node_socket_circle_draw(const bContext *C, bNodeTree *ntree, Pointer
RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
sock->typeinfo->draw_color((bContext *)C, &ptr, &node_ptr, color);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, sock->locx, sock->locy);
}
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c
index f95081da4a5..1c45dc24108 100644
--- a/source/blender/editors/space_outliner/outliner_draw.c
+++ b/source/blender/editors/space_outliner/outliner_draw.c
@@ -1143,7 +1143,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
else if (te->idcode == SEQ_TYPE_SOUND_RAM)
data.icon = ICON_SOUND;
else if (te->idcode == SEQ_TYPE_IMAGE)
- data.icon = ICON_IMAGE_COL;
+ data.icon = ICON_IMAGE;
else
data.icon = ICON_PARTICLES;
break;
@@ -1226,6 +1226,9 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
if (ob->dup_group) {
data.icon = ICON_OUTLINER_OB_GROUP_INSTANCE;
}
+ else if (ob->empty_drawtype == OB_EMPTY_IMAGE) {
+ data.icon = ICON_OUTLINER_OB_IMAGE;
+ }
else {
data.icon = ICON_OUTLINER_OB_EMPTY;
}
@@ -1311,7 +1314,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
data.icon = ICON_OUTLINER_DATA_GREASEPENCIL; break;
case ID_LP:
{
- LightProbe * lp = (LightProbe *)tselem->id;
+ LightProbe *lp = (LightProbe *)tselem->id;
switch (lp->type) {
case LIGHTPROBE_TYPE_CUBE:
data.icon = ICON_LIGHTPROBE_CUBEMAP; break;
@@ -1328,7 +1331,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
data.icon = ICON_BRUSH_DATA; break;
case ID_SCR:
case ID_WS:
- data.icon = ICON_SPLITSCREEN; break;
+ data.icon = ICON_WORKSPACE; break;
default:
break;
}
@@ -1423,7 +1426,7 @@ static void outliner_draw_iconrow_doit(
if (active != OL_DRAWSEL_NONE) {
float ufac = UI_UNIT_X / 20.0f;
- float color[4] = {1.0f, 1.0f, 1.0f, 0.4f};
+ float color[4] = {1.0f, 1.0f, 1.0f, 0.2f};
UI_draw_roundbox_corner_set(UI_CNR_ALL);
color[3] *= alpha_fac;
@@ -1693,7 +1696,7 @@ static void outliner_draw_tree_element(
if (!(ELEM(tselem->type, TSE_RNA_PROPERTY, TSE_RNA_ARRAY_ELEM, TSE_ID_BASE))) {
tselem_draw_icon(block, xmax, (float)startx + offsx, (float)*starty, tselem, te, alpha_fac, true);
- offsx += UI_UNIT_X + 2 * ufac;
+ offsx += UI_UNIT_X + 4 * ufac;
}
else
offsx += 2 * ufac;
@@ -1714,13 +1717,13 @@ static void outliner_draw_tree_element(
(float)startx + offsx + 2 * ufac, (float)*starty + 2 * ufac, ICON_LIBRARY_DATA_DIRECT,
alpha_fac);
}
- offsx += UI_UNIT_X + 2 * ufac;
+ offsx += UI_UNIT_X + 4 * ufac;
}
else if (ELEM(tselem->type, 0, TSE_LAYER_COLLECTION) && ID_IS_STATIC_OVERRIDE(tselem->id)) {
UI_icon_draw_alpha(
(float)startx + offsx + 2 * ufac, (float)*starty + 2 * ufac, ICON_LIBRARY_DATA_OVERRIDE,
alpha_fac);
- offsx += UI_UNIT_X + 2 * ufac;
+ offsx += UI_UNIT_X + 4 * ufac;
}
GPU_blend(false);
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index 864609e4157..96193d375d5 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -1341,29 +1341,29 @@ void draw_image_seq(const bContext *C, Scene *scene, ARegion *ar, SpaceSeq *sseq
tot_clip.xmax = v2d->tot.xmin + (fabsf(BLI_rctf_size_x(&v2d->tot)) * scene->ed->over_border.xmax);
tot_clip.ymax = v2d->tot.ymin + (fabsf(BLI_rctf_size_y(&v2d->tot)) * scene->ed->over_border.ymax);
- immAttrib2f(texCoord, scene->ed->over_border.xmin, scene->ed->over_border.ymin);
+ immAttr2f(texCoord, scene->ed->over_border.xmin, scene->ed->over_border.ymin);
immVertex2f(pos, tot_clip.xmin, tot_clip.ymin);
- immAttrib2f(texCoord, scene->ed->over_border.xmin, scene->ed->over_border.ymax);
+ immAttr2f(texCoord, scene->ed->over_border.xmin, scene->ed->over_border.ymax);
immVertex2f(pos, tot_clip.xmin, tot_clip.ymax);
- immAttrib2f(texCoord, scene->ed->over_border.xmax, scene->ed->over_border.ymax);
+ immAttr2f(texCoord, scene->ed->over_border.xmax, scene->ed->over_border.ymax);
immVertex2f(pos, tot_clip.xmax, tot_clip.ymax);
- immAttrib2f(texCoord, scene->ed->over_border.xmax, scene->ed->over_border.ymin);
+ immAttr2f(texCoord, scene->ed->over_border.xmax, scene->ed->over_border.ymin);
immVertex2f(pos, tot_clip.xmax, tot_clip.ymin);
}
else if (sseq->overlay_type == SEQ_DRAW_OVERLAY_REFERENCE) {
- immAttrib2f(texCoord, 0.0f, 0.0f);
+ immAttr2f(texCoord, 0.0f, 0.0f);
immVertex2f(pos, v2d->tot.xmin, v2d->tot.ymin);
- immAttrib2f(texCoord, 0.0f, 1.0f);
+ immAttr2f(texCoord, 0.0f, 1.0f);
immVertex2f(pos, v2d->tot.xmin, v2d->tot.ymax);
- immAttrib2f(texCoord, 1.0f, 1.0f);
+ immAttr2f(texCoord, 1.0f, 1.0f);
immVertex2f(pos, v2d->tot.xmax, v2d->tot.ymax);
- immAttrib2f(texCoord, 1.0f, 0.0f);
+ immAttr2f(texCoord, 1.0f, 0.0f);
immVertex2f(pos, v2d->tot.xmax, v2d->tot.ymin);
}
}
@@ -1383,31 +1383,31 @@ void draw_image_seq(const bContext *C, Scene *scene, ARegion *ar, SpaceSeq *sseq
imagey = aspect / image_aspect;
}
- immAttrib2f(texCoord, 0.0f, 0.0f);
+ immAttr2f(texCoord, 0.0f, 0.0f);
immVertex2f(pos, -imagex, -imagey);
- immAttrib2f(texCoord, 0.0f, 1.0f);
+ immAttr2f(texCoord, 0.0f, 1.0f);
immVertex2f(pos, -imagex, imagey);
- immAttrib2f(texCoord, 1.0f, 1.0f);
+ immAttr2f(texCoord, 1.0f, 1.0f);
immVertex2f(pos, imagex, imagey);
- immAttrib2f(texCoord, 1.0f, 0.0f);
+ immAttr2f(texCoord, 1.0f, 0.0f);
immVertex2f(pos, imagex, -imagey);
}
else {
draw_metadata = ((sseq->flag & SEQ_SHOW_METADATA) != 0);
- immAttrib2f(texCoord, 0.0f, 0.0f);
+ immAttr2f(texCoord, 0.0f, 0.0f);
immVertex2f(pos, v2d->tot.xmin, v2d->tot.ymin);
- immAttrib2f(texCoord, 0.0f, 1.0f);
+ immAttr2f(texCoord, 0.0f, 1.0f);
immVertex2f(pos, v2d->tot.xmin, v2d->tot.ymax);
- immAttrib2f(texCoord, 1.0f, 1.0f);
+ immAttr2f(texCoord, 1.0f, 1.0f);
immVertex2f(pos, v2d->tot.xmax, v2d->tot.ymax);
- immAttrib2f(texCoord, 1.0f, 0.0f);
+ immAttr2f(texCoord, 1.0f, 0.0f);
immVertex2f(pos, v2d->tot.xmax, v2d->tot.ymin);
}
diff --git a/source/blender/editors/space_view3d/CMakeLists.txt b/source/blender/editors/space_view3d/CMakeLists.txt
index 4bcec142aa9..0d30d623b8d 100644
--- a/source/blender/editors/space_view3d/CMakeLists.txt
+++ b/source/blender/editors/space_view3d/CMakeLists.txt
@@ -44,7 +44,6 @@ set(INC_SYS
set(SRC
drawobject.c
- drawvolume.c
space_view3d.c
view3d_buttons.c
view3d_camera_control.c
diff --git a/source/blender/editors/space_view3d/drawvolume.c b/source/blender/editors/space_view3d/drawvolume.c
deleted file mode 100644
index 46bd57df7f5..00000000000
--- a/source/blender/editors/space_view3d/drawvolume.c
+++ /dev/null
@@ -1,853 +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) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * Contributor(s): Daniel Genrich
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-/** \file blender/editors/space_view3d/drawvolume.c
- * \ingroup spview3d
- */
-
-#include <string.h>
-#include <math.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "DNA_scene_types.h"
-#include "DNA_screen_types.h"
-#include "DNA_smoke_types.h"
-#include "DNA_view3d_types.h"
-
-#include "BLI_utildefines.h"
-#include "BLI_math.h"
-
-#include "BKE_colorband.h"
-#include "BKE_deform.h"
-#include "BKE_particle.h"
-
-#include "smoke_API.h"
-
-#include "BIF_gl.h"
-
-#include "GPU_shader.h"
-#include "GPU_texture.h"
-#include "GPU_state.h"
-
-#include "view3d_intern.h" // own include
-
-struct GPUTexture;
-
-// #define DEBUG_DRAW_TIME
-
-#ifdef DEBUG_DRAW_TIME
-# include "PIL_time.h"
-# include "PIL_time_utildefines.h"
-#endif
-
-/* *************************** Transfer functions *************************** */
-
-enum {
- TFUNC_FLAME_SPECTRUM = 0,
- TFUNC_COLOR_RAMP = 1,
-};
-
-#define TFUNC_WIDTH 256
-
-static void create_flame_spectrum_texture(float *data)
-{
-#define FIRE_THRESH 7
-#define MAX_FIRE_ALPHA 0.06f
-#define FULL_ON_FIRE 100
-
- float *spec_pixels = MEM_mallocN(TFUNC_WIDTH * 4 * 16 * 16 * sizeof(float), "spec_pixels");
-
- blackbody_temperature_to_rgb_table(data, TFUNC_WIDTH, 1500, 3000);
-
- for (int i = 0; i < 16; i++) {
- for (int j = 0; j < 16; j++) {
- for (int k = 0; k < TFUNC_WIDTH; k++) {
- int index = (j * TFUNC_WIDTH * 16 + i * TFUNC_WIDTH + k) * 4;
- if (k >= FIRE_THRESH) {
- spec_pixels[index] = (data[k * 4]);
- spec_pixels[index + 1] = (data[k * 4 + 1]);
- spec_pixels[index + 2] = (data[k * 4 + 2]);
- spec_pixels[index + 3] = MAX_FIRE_ALPHA * (
- (k > FULL_ON_FIRE) ? 1.0f : (k - FIRE_THRESH) / ((float)FULL_ON_FIRE - FIRE_THRESH));
- }
- else {
- zero_v4(&spec_pixels[index]);
- }
- }
- }
- }
-
- memcpy(data, spec_pixels, sizeof(float) * 4 * TFUNC_WIDTH);
-
- MEM_freeN(spec_pixels);
-
-#undef FIRE_THRESH
-#undef MAX_FIRE_ALPHA
-#undef FULL_ON_FIRE
-}
-
-static void create_color_ramp(const ColorBand *coba, float *data)
-{
- for (int i = 0; i < TFUNC_WIDTH; i++) {
- BKE_colorband_evaluate(coba, (float)i / TFUNC_WIDTH, &data[i * 4]);
- }
-}
-
-static GPUTexture *create_transfer_function(int type, const ColorBand *coba)
-{
- float *data = MEM_mallocN(sizeof(float) * 4 * TFUNC_WIDTH, __func__);
-
- switch (type) {
- case TFUNC_FLAME_SPECTRUM:
- create_flame_spectrum_texture(data);
- break;
- case TFUNC_COLOR_RAMP:
- create_color_ramp(coba, data);
- break;
- }
-
- GPUTexture *tex = GPU_texture_create_1D(TFUNC_WIDTH, GPU_RGBA8, data, NULL);
-
- MEM_freeN(data);
-
- return tex;
-}
-
-static GPUTexture *create_field_texture(SmokeDomainSettings *sds)
-{
- float *field = NULL;
-
- switch (sds->coba_field) {
-#ifdef WITH_SMOKE
- case FLUID_FIELD_DENSITY: field = smoke_get_density(sds->fluid); break;
- case FLUID_FIELD_HEAT: field = smoke_get_heat(sds->fluid); break;
- case FLUID_FIELD_FUEL: field = smoke_get_fuel(sds->fluid); break;
- case FLUID_FIELD_REACT: field = smoke_get_react(sds->fluid); break;
- case FLUID_FIELD_FLAME: field = smoke_get_flame(sds->fluid); break;
- case FLUID_FIELD_VELOCITY_X: field = smoke_get_velocity_x(sds->fluid); break;
- case FLUID_FIELD_VELOCITY_Y: field = smoke_get_velocity_y(sds->fluid); break;
- case FLUID_FIELD_VELOCITY_Z: field = smoke_get_velocity_z(sds->fluid); break;
- case FLUID_FIELD_COLOR_R: field = smoke_get_color_r(sds->fluid); break;
- case FLUID_FIELD_COLOR_G: field = smoke_get_color_g(sds->fluid); break;
- case FLUID_FIELD_COLOR_B: field = smoke_get_color_b(sds->fluid); break;
- case FLUID_FIELD_FORCE_X: field = smoke_get_force_x(sds->fluid); break;
- case FLUID_FIELD_FORCE_Y: field = smoke_get_force_y(sds->fluid); break;
- case FLUID_FIELD_FORCE_Z: field = smoke_get_force_z(sds->fluid); break;
-#endif
- default: return NULL;
- }
-
- return GPU_texture_create_3D(sds->res[0], sds->res[1], sds->res[2], GPU_R8, field, NULL);
-}
-
-typedef struct VolumeSlicer {
- float size[3];
- float min[3];
- float max[3];
- float (*verts)[3];
-} VolumeSlicer;
-
-/* *************************** Axis Aligned Slicing ************************** */
-
-static void create_single_slice(VolumeSlicer *slicer, const float depth,
- const int axis, const int idx)
-{
- const float vertices[3][4][3] = {
- {
- { depth, slicer->min[1], slicer->min[2] },
- { depth, slicer->max[1], slicer->min[2] },
- { depth, slicer->max[1], slicer->max[2] },
- { depth, slicer->min[1], slicer->max[2] }
- },
- {
- { slicer->min[0], depth, slicer->min[2] },
- { slicer->min[0], depth, slicer->max[2] },
- { slicer->max[0], depth, slicer->max[2] },
- { slicer->max[0], depth, slicer->min[2] }
- },
- {
- { slicer->min[0], slicer->min[1], depth },
- { slicer->min[0], slicer->max[1], depth },
- { slicer->max[0], slicer->max[1], depth },
- { slicer->max[0], slicer->min[1], depth }
- }
- };
-
- copy_v3_v3(slicer->verts[idx + 0], vertices[axis][0]);
- copy_v3_v3(slicer->verts[idx + 1], vertices[axis][1]);
- copy_v3_v3(slicer->verts[idx + 2], vertices[axis][2]);
- copy_v3_v3(slicer->verts[idx + 3], vertices[axis][0]);
- copy_v3_v3(slicer->verts[idx + 4], vertices[axis][2]);
- copy_v3_v3(slicer->verts[idx + 5], vertices[axis][3]);
-}
-
-static void create_axis_aligned_slices(VolumeSlicer *slicer, const int num_slices,
- const float view_dir[3], const int axis)
-{
- float depth, slice_size = slicer->size[axis] / num_slices;
-
- /* always process slices in back to front order! */
- if (view_dir[axis] > 0.0f) {
- depth = slicer->min[axis];
- }
- else {
- depth = slicer->max[axis];
- slice_size = -slice_size;
- }
-
- int count = 0;
- for (int slice = 0; slice < num_slices; slice++) {
- create_single_slice(slicer, depth, axis, count);
-
- count += 6;
- depth += slice_size;
- }
-}
-
-/* *************************** View Aligned Slicing ************************** */
-
-/* Code adapted from:
- * "GPU-based Volume Rendering, Real-time Volume Graphics", AK Peters/CRC Press
- */
-static int create_view_aligned_slices(VolumeSlicer *slicer,
- const int num_slices,
- const float view_dir[3])
-{
- const int indices[] = { 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5 };
-
- const float vertices[8][3] = {
- { slicer->min[0], slicer->min[1], slicer->min[2] },
- { slicer->max[0], slicer->min[1], slicer->min[2] },
- { slicer->max[0], slicer->max[1], slicer->min[2] },
- { slicer->min[0], slicer->max[1], slicer->min[2] },
- { slicer->min[0], slicer->min[1], slicer->max[2] },
- { slicer->max[0], slicer->min[1], slicer->max[2] },
- { slicer->max[0], slicer->max[1], slicer->max[2] },
- { slicer->min[0], slicer->max[1], slicer->max[2] }
- };
-
- const int edges[12][2] = {
- { 0, 1 }, { 1, 2 }, { 2, 3 },
- { 3, 0 }, { 0, 4 }, { 1, 5 },
- { 2, 6 }, { 3, 7 }, { 4, 5 },
- { 5, 6 }, { 6, 7 }, { 7, 4 }
- };
-
- const int edge_list[8][12] = {
- { 0, 1, 5, 6, 4, 8, 11, 9, 3, 7, 2, 10 },
- { 0, 4, 3, 11, 1, 2, 6, 7, 5, 9, 8, 10 },
- { 1, 5, 0, 8, 2, 3, 7, 4, 6, 10, 9, 11 },
- { 7, 11, 10, 8, 2, 6, 1, 9, 3, 0, 4, 5 },
- { 8, 5, 9, 1, 11, 10, 7, 6, 4, 3, 0, 2 },
- { 9, 6, 10, 2, 8, 11, 4, 7, 5, 0, 1, 3 },
- { 9, 8, 5, 4, 6, 1, 2, 0, 10, 7, 11, 3 },
- { 10, 9, 6, 5, 7, 2, 3, 1, 11, 4, 8, 0 }
- };
-
- /* find vertex that is the furthest from the view plane */
- int max_index = 0;
- float max_dist, min_dist;
- min_dist = max_dist = dot_v3v3(view_dir, vertices[0]);
-
- for (int i = 1; i < 8; i++) {
- float dist = dot_v3v3(view_dir, vertices[i]);
-
- if (dist > max_dist) {
- max_dist = dist;
- max_index = i;
- }
-
- if (dist < min_dist) {
- min_dist = dist;
- }
- }
-
- max_dist -= FLT_EPSILON;
- min_dist += FLT_EPSILON;
-
- /* start and direction vectors */
- float vec_start[12][3], vec_dir[12][3];
- /* lambda intersection values */
- float lambda[12], lambda_inc[12];
- float denom = 0.0f;
-
- float plane_dist = min_dist;
- float plane_dist_inc = (max_dist - min_dist) / (float)num_slices;
-
- /* for all edges */
- for (int i = 0; i < 12; i++) {
- copy_v3_v3(vec_start[i], vertices[edges[edge_list[max_index][i]][0]]);
- copy_v3_v3(vec_dir[i], vertices[edges[edge_list[max_index][i]][1]]);
- sub_v3_v3(vec_dir[i], vec_start[i]);
-
- denom = dot_v3v3(vec_dir[i], view_dir);
-
- if (1.0f + denom != 1.0f) {
- lambda_inc[i] = plane_dist_inc / denom;
- lambda[i] = (plane_dist - dot_v3v3(vec_start[i], view_dir)) / denom;
- }
- else {
- lambda[i] = -1.0f;
- lambda_inc[i] = 0.0f;
- }
- }
-
- float intersections[6][3];
- float dL[12];
- int num_points = 0;
- /* find intersections for each slice, process them in back to front order */
- for (int i = 0; i < num_slices; i++) {
- for (int e = 0; e < 12; e++) {
- dL[e] = lambda[e] + i * lambda_inc[e];
- }
-
- if ((dL[0] >= 0.0f) && (dL[0] < 1.0f)) {
- madd_v3_v3v3fl(intersections[0], vec_start[0], vec_dir[0], dL[0]);
- }
- else if ((dL[1] >= 0.0f) && (dL[1] < 1.0f)) {
- madd_v3_v3v3fl(intersections[0], vec_start[1], vec_dir[1], dL[1]);
- }
- else if ((dL[3] >= 0.0f) && (dL[3] < 1.0f)) {
- madd_v3_v3v3fl(intersections[0], vec_start[3], vec_dir[3], dL[3]);
- }
- else continue;
-
- if ((dL[2] >= 0.0f) && (dL[2] < 1.0f)) {
- madd_v3_v3v3fl(intersections[1], vec_start[2], vec_dir[2], dL[2]);
- }
- else if ((dL[0] >= 0.0f) && (dL[0] < 1.0f)) {
- madd_v3_v3v3fl(intersections[1], vec_start[0], vec_dir[0], dL[0]);
- }
- else if ((dL[1] >= 0.0f) && (dL[1] < 1.0f)) {
- madd_v3_v3v3fl(intersections[1], vec_start[1], vec_dir[1], dL[1]);
- }
- else {
- madd_v3_v3v3fl(intersections[1], vec_start[3], vec_dir[3], dL[3]);
- }
-
- if ((dL[4] >= 0.0f) && (dL[4] < 1.0f)) {
- madd_v3_v3v3fl(intersections[2], vec_start[4], vec_dir[4], dL[4]);
- }
- else if ((dL[5] >= 0.0f) && (dL[5] < 1.0f)) {
- madd_v3_v3v3fl(intersections[2], vec_start[5], vec_dir[5], dL[5]);
- }
- else {
- madd_v3_v3v3fl(intersections[2], vec_start[7], vec_dir[7], dL[7]);
- }
-
- if ((dL[6] >= 0.0f) && (dL[6] < 1.0f)) {
- madd_v3_v3v3fl(intersections[3], vec_start[6], vec_dir[6], dL[6]);
- }
- else if ((dL[4] >= 0.0f) && (dL[4] < 1.0f)) {
- madd_v3_v3v3fl(intersections[3], vec_start[4], vec_dir[4], dL[4]);
- }
- else if ((dL[5] >= 0.0f) && (dL[5] < 1.0f)) {
- madd_v3_v3v3fl(intersections[3], vec_start[5], vec_dir[5], dL[5]);
- }
- else {
- madd_v3_v3v3fl(intersections[3], vec_start[7], vec_dir[7], dL[7]);
- }
-
- if ((dL[8] >= 0.0f) && (dL[8] < 1.0f)) {
- madd_v3_v3v3fl(intersections[4], vec_start[8], vec_dir[8], dL[8]);
- }
- else if ((dL[9] >= 0.0f) && (dL[9] < 1.0f)) {
- madd_v3_v3v3fl(intersections[4], vec_start[9], vec_dir[9], dL[9]);
- }
- else {
- madd_v3_v3v3fl(intersections[4], vec_start[11], vec_dir[11], dL[11]);
- }
-
- if ((dL[10] >= 0.0f) && (dL[10] < 1.0f)) {
- madd_v3_v3v3fl(intersections[5], vec_start[10], vec_dir[10], dL[10]);
- }
- else if ((dL[8] >= 0.0f) && (dL[8] < 1.0f)) {
- madd_v3_v3v3fl(intersections[5], vec_start[8], vec_dir[8], dL[8]);
- }
- else if ((dL[9] >= 0.0f) && (dL[9] < 1.0f)) {
- madd_v3_v3v3fl(intersections[5], vec_start[9], vec_dir[9], dL[9]);
- }
- else {
- madd_v3_v3v3fl(intersections[5], vec_start[11], vec_dir[11], dL[11]);
- }
-
- for (int e = 0; e < 12; e++) {
- copy_v3_v3(slicer->verts[num_points++], intersections[indices[e]]);
- }
- }
-
- return num_points;
-}
-
-static void bind_shader(SmokeDomainSettings *sds, GPUShader *shader, GPUTexture *tex_spec,
- GPUTexture *tex_tfunc, GPUTexture *tex_coba,
- bool use_fire, const float min[3],
- const float ob_sizei[3], const float invsize[3])
-{
- int invsize_location = GPU_shader_get_uniform(shader, "invsize");
- int ob_sizei_location = GPU_shader_get_uniform(shader, "ob_sizei");
- int min_location = GPU_shader_get_uniform(shader, "min_location");
-
- int soot_location;
- int stepsize_location;
- int densityscale_location;
- int spec_location, flame_location;
- int shadow_location, actcol_location;
- int tfunc_location = 0;
- int coba_location = 0;
-
- if (use_fire) {
- spec_location = GPU_shader_get_uniform(shader, "spectrum_texture");
- flame_location = GPU_shader_get_uniform(shader, "flame_texture");
- }
- else {
- shadow_location = GPU_shader_get_uniform(shader, "shadow_texture");
- actcol_location = GPU_shader_get_uniform(shader, "active_color");
- soot_location = GPU_shader_get_uniform(shader, "soot_texture");
- stepsize_location = GPU_shader_get_uniform(shader, "step_size");
- densityscale_location = GPU_shader_get_uniform(shader, "density_scale");
-
- if (sds->use_coba) {
- tfunc_location = GPU_shader_get_uniform(shader, "transfer_texture");
- coba_location = GPU_shader_get_uniform(shader, "color_band_texture");
- }
- }
-
- GPU_shader_bind(shader);
-
- if (use_fire) {
- GPU_texture_bind(sds->tex_flame, 2);
- GPU_shader_uniform_texture(shader, flame_location, sds->tex_flame);
-
- GPU_texture_bind(tex_spec, 3);
- GPU_shader_uniform_texture(shader, spec_location, tex_spec);
- }
- else {
- float density_scale = 10.0f * sds->display_thickness;
-
- GPU_shader_uniform_vector(shader, stepsize_location, 1, 1, &sds->dx);
- GPU_shader_uniform_vector(shader, densityscale_location, 1, 1, &density_scale);
-
- GPU_texture_bind(sds->tex, 0);
- GPU_shader_uniform_texture(shader, soot_location, sds->tex);
-
- GPU_texture_bind(sds->tex_shadow, 1);
- GPU_shader_uniform_texture(shader, shadow_location, sds->tex_shadow);
-
- float active_color[3] = { 0.9, 0.9, 0.9 };
- if ((sds->active_fields & SM_ACTIVE_COLORS) == 0)
- mul_v3_v3(active_color, sds->active_color);
- GPU_shader_uniform_vector(shader, actcol_location, 3, 1, active_color);
-
- if (sds->use_coba) {
- GPU_texture_bind(tex_tfunc, 4);
- GPU_shader_uniform_texture(shader, tfunc_location, tex_tfunc);
-
- GPU_texture_bind(tex_coba, 5);
- GPU_shader_uniform_texture(shader, coba_location, tex_coba);
- }
- }
-
- GPU_shader_uniform_vector(shader, min_location, 3, 1, min);
- GPU_shader_uniform_vector(shader, ob_sizei_location, 3, 1, ob_sizei);
- GPU_shader_uniform_vector(shader, invsize_location, 3, 1, invsize);
-}
-
-static void unbind_shader(SmokeDomainSettings *sds, GPUTexture *tex_spec,
- GPUTexture *tex_tfunc, GPUTexture *tex_coba, bool use_fire)
-{
- GPU_shader_unbind();
-
- GPU_texture_unbind(sds->tex);
-
- if (use_fire) {
- GPU_texture_unbind(sds->tex_flame);
- GPU_texture_unbind(tex_spec);
- GPU_texture_free(tex_spec);
- }
- else {
- GPU_texture_unbind(sds->tex_shadow);
-
- if (sds->use_coba) {
- GPU_texture_unbind(tex_tfunc);
- GPU_texture_free(tex_tfunc);
-
- GPU_texture_unbind(tex_coba);
- GPU_texture_free(tex_coba);
- }
- }
-}
-
-static void draw_buffer(SmokeDomainSettings *sds, GPUShader *shader, const VolumeSlicer *slicer,
- const float ob_sizei[3], const float invsize[3], const int num_points, const bool do_fire)
-{
- GPUTexture *tex_spec = (do_fire) ? create_transfer_function(TFUNC_FLAME_SPECTRUM, NULL) : NULL;
- GPUTexture *tex_tfunc = (sds->use_coba) ? create_transfer_function(TFUNC_COLOR_RAMP, sds->coba) : NULL;
- GPUTexture *tex_coba = (sds->use_coba) ? create_field_texture(sds) : NULL;
-
- GLuint vertex_buffer;
- glGenBuffers(1, &vertex_buffer);
- glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
- glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 3 * num_points, &slicer->verts[0][0], GL_STATIC_DRAW);
-
- bind_shader(sds, shader, tex_spec, tex_tfunc, tex_coba, do_fire, slicer->min, ob_sizei, invsize);
-
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, NULL);
-
- glDrawArrays(GL_TRIANGLES, 0, num_points);
-
- glDisableClientState(GL_VERTEX_ARRAY);
-
- unbind_shader(sds, tex_spec, tex_tfunc, tex_coba, do_fire);
-
- /* cleanup */
-
- glBindBuffer(GL_ARRAY_BUFFER, 0);
-
- glDeleteBuffers(1, &vertex_buffer);
-}
-
-void draw_smoke_volume(SmokeDomainSettings *sds, Object *ob,
- const float min[3], const float max[3],
- const float viewnormal[3])
-{
- if (!sds->tex || !sds->tex_shadow) {
- fprintf(stderr, "Could not allocate 3D texture for volume rendering!\n");
- return;
- }
-
- const bool use_fire = (sds->active_fields & SM_ACTIVE_FIRE) && sds->tex_flame;
-
- GPUBuiltinShader builtin_shader;
-
- if (sds->use_coba) {
- builtin_shader = GPU_SHADER_SMOKE_COBA;
- }
- else {
- builtin_shader = GPU_SHADER_SMOKE;
- }
-
- GPUShader *shader = GPU_shader_get_builtin_shader(builtin_shader);
-
- if (!shader) {
- fprintf(stderr, "Unable to create GLSL smoke shader.\n");
- return;
- }
-
- GPUShader *fire_shader = NULL;
- if (use_fire) {
- fire_shader = GPU_shader_get_builtin_shader(GPU_SHADER_SMOKE_FIRE);
-
- if (!fire_shader) {
- fprintf(stderr, "Unable to create GLSL fire shader.\n");
- return;
- }
- }
-
- const float ob_sizei[3] = {
- 1.0f / fabsf(ob->size[0]),
- 1.0f / fabsf(ob->size[1]),
- 1.0f / fabsf(ob->size[2])
- };
-
- const float size[3] = { max[0] - min[0], max[1] - min[1], max[2] - min[2] };
- const float invsize[3] = { 1.0f / size[0], 1.0f / size[1], 1.0f / size[2] };
-
-#ifdef DEBUG_DRAW_TIME
- TIMEIT_START(draw);
-#endif
-
- /* setup slicing information */
-
- const bool view_aligned = (sds->slice_method == MOD_SMOKE_SLICE_VIEW_ALIGNED);
- int max_slices, max_points, axis = 0;
-
- if (view_aligned) {
- max_slices = max_iii(sds->res[0], sds->res[1], sds->res[2]) * sds->slice_per_voxel;
- max_points = max_slices * 12;
- }
- else {
- if (sds->axis_slice_method == AXIS_SLICE_FULL) {
- axis = axis_dominant_v3_single(viewnormal);
- max_slices = sds->res[axis] * sds->slice_per_voxel;
- }
- else {
- axis = (sds->slice_axis == SLICE_AXIS_AUTO) ? axis_dominant_v3_single(viewnormal) : sds->slice_axis - 1;
- max_slices = 1;
- }
-
- max_points = max_slices * 6;
- }
-
- VolumeSlicer slicer;
- copy_v3_v3(slicer.min, min);
- copy_v3_v3(slicer.max, max);
- copy_v3_v3(slicer.size, size);
- slicer.verts = MEM_mallocN(sizeof(float) * 3 * max_points, "smoke_slice_vertices");
-
- int num_points;
-
- if (view_aligned) {
- num_points = create_view_aligned_slices(&slicer, max_slices, viewnormal);
- }
- else {
- num_points = max_points;
-
- if (sds->axis_slice_method == AXIS_SLICE_FULL) {
- create_axis_aligned_slices(&slicer, max_slices, viewnormal, axis);
- }
- else {
- const float depth = (sds->slice_depth - 0.5f) * size[axis];
- create_single_slice(&slicer, depth, axis, 0);
- }
- }
-
- /* setup buffer and draw */
-
- int gl_depth = 0, gl_blend = 0, gl_depth_write = 0;
- glGetBooleanv(GL_BLEND, (GLboolean *)&gl_blend);
- glGetBooleanv(GL_DEPTH_TEST, (GLboolean *)&gl_depth);
- glGetBooleanv(GL_DEPTH_WRITEMASK, (GLboolean *)&gl_depth_write);
-
- GPU_depth_test(true);
- glDepthMask(GL_FALSE);
- GPU_blend(true);
-
- GPU_blend_set_func(GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA);
- draw_buffer(sds, shader, &slicer, ob_sizei, invsize, num_points, false);
-
- /* Draw fire separately (T47639). */
- if (use_fire && !sds->use_coba) {
- glBlendFunc(GL_ONE, GL_ONE);
- draw_buffer(sds, fire_shader, &slicer, ob_sizei, invsize, num_points, true);
- }
-
-#ifdef DEBUG_DRAW_TIME
- printf("Draw Time: %f\n", (float)TIMEIT_VALUE(draw));
- TIMEIT_END(draw);
-#endif
-
- MEM_freeN(slicer.verts);
-
- glDepthMask(gl_depth_write);
-
- if (!gl_blend) {
- GPU_blend(false);
- }
-
- if (gl_depth) {
- GPU_depth_test(true);
- }
-}
-
-#ifdef WITH_SMOKE
-static void add_tri(float (*verts)[3], float(*colors)[3], int *offset,
- float p1[3], float p2[3], float p3[3], float rgb[3])
-{
- copy_v3_v3(verts[*offset + 0], p1);
- copy_v3_v3(verts[*offset + 1], p2);
- copy_v3_v3(verts[*offset + 2], p3);
-
- copy_v3_v3(colors[*offset + 0], rgb);
- copy_v3_v3(colors[*offset + 1], rgb);
- copy_v3_v3(colors[*offset + 2], rgb);
-
- *offset += 3;
-}
-
-static void add_needle(float (*verts)[3], float (*colors)[3], float center[3],
- float dir[3], float scale, float voxel_size, int *offset)
-{
- float len = len_v3(dir);
-
- float rgb[3];
- BKE_defvert_weight_to_rgb(rgb, len);
-
- if (len != 0.0f) {
- mul_v3_fl(dir, 1.0f / len);
- len *= scale;
- }
-
- len *= voxel_size;
-
- float corners[4][3] = {
- { 0.0f, 0.2f, -0.5f },
- { -0.2f * 0.866f, -0.2f * 0.5f, -0.5f },
- { 0.2f * 0.866f, -0.2f * 0.5f, -0.5f },
- { 0.0f, 0.0f, 0.5f }
- };
-
- const float up[3] = { 0.0f, 0.0f, 1.0f };
- float rot[3][3];
-
- rotation_between_vecs_to_mat3(rot, up, dir);
- transpose_m3(rot);
-
- for (int i = 0; i < 4; i++) {
- mul_m3_v3(rot, corners[i]);
- mul_v3_fl(corners[i], len);
- add_v3_v3(corners[i], center);
- }
-
- add_tri(verts, colors, offset, corners[0], corners[1], corners[2], rgb);
- add_tri(verts, colors, offset, corners[0], corners[1], corners[3], rgb);
- add_tri(verts, colors, offset, corners[1], corners[2], corners[3], rgb);
- add_tri(verts, colors, offset, corners[2], corners[0], corners[3], rgb);
-}
-
-static void add_streamline(float (*verts)[3], float(*colors)[3], float center[3],
- float dir[3], float scale, float voxel_size, int *offset)
-{
- const float len = len_v3(dir);
-
- float rgb[3];
- BKE_defvert_weight_to_rgb(rgb, len);
-
- copy_v3_v3(colors[(*offset)], rgb);
- copy_v3_v3(verts[(*offset)++], center);
-
- mul_v3_fl(dir, scale * voxel_size);
- add_v3_v3(center, dir);
-
- copy_v3_v3(colors[(*offset)], rgb);
- copy_v3_v3(verts[(*offset)++], center);
-}
-
-typedef void (*vector_draw_func)(float(*)[3], float(*)[3], float *, float *, float, float, int *);
-#endif /* WITH_SMOKE */
-
-void draw_smoke_velocity(SmokeDomainSettings *domain, float viewnormal[3])
-{
-#ifdef WITH_SMOKE
- const float *vel_x = smoke_get_velocity_x(domain->fluid);
- const float *vel_y = smoke_get_velocity_y(domain->fluid);
- const float *vel_z = smoke_get_velocity_z(domain->fluid);
-
- if (ELEM(NULL, vel_x, vel_y, vel_z)) {
- return;
- }
-
- const int *base_res = domain->base_res;
- const int *res = domain->res;
- const int *res_min = domain->res_min;
-
- int res_max[3];
- copy_v3_v3_int(res_max, domain->res_max);
-
- const float *cell_size = domain->cell_size;
- const float step_size = ((float)max_iii(base_res[0], base_res[1], base_res[2])) / 16.0f;
-
- /* set first position so that it doesn't jump when domain moves */
- float xyz[3] = {
- res_min[0] + fmod(-(float)domain->shift[0] + res_min[0], step_size),
- res_min[1] + fmod(-(float)domain->shift[1] + res_min[1], step_size),
- res_min[2] + fmod(-(float)domain->shift[2] + res_min[2], step_size)
- };
-
- if (xyz[0] < res_min[0]) xyz[0] += step_size;
- if (xyz[1] < res_min[1]) xyz[1] += step_size;
- if (xyz[2] < res_min[2]) xyz[2] += step_size;
-
- float min[3] = {
- domain->p0[0] - domain->cell_size[0] * domain->adapt_res,
- domain->p0[1] - domain->cell_size[1] * domain->adapt_res,
- domain->p0[2] - domain->cell_size[2] * domain->adapt_res,
- };
-
- int num_points_v[3] = {
- ((float)(res_max[0] - floor(xyz[0])) / step_size) + 0.5f,
- ((float)(res_max[1] - floor(xyz[1])) / step_size) + 0.5f,
- ((float)(res_max[2] - floor(xyz[2])) / step_size) + 0.5f
- };
-
- if (domain->slice_method == MOD_SMOKE_SLICE_AXIS_ALIGNED &&
- domain->axis_slice_method == AXIS_SLICE_SINGLE)
- {
- const int axis = (domain->slice_axis == SLICE_AXIS_AUTO) ?
- axis_dominant_v3_single(viewnormal) : domain->slice_axis - 1;
-
- xyz[axis] = (float)base_res[axis] * domain->slice_depth;
- num_points_v[axis] = 1;
- res_max[axis] = xyz[axis] + 1;
- }
-
- vector_draw_func func;
- int max_points;
-
- if (domain->vector_draw_type == VECTOR_DRAW_NEEDLE) {
- func = add_needle;
- max_points = (num_points_v[0] * num_points_v[1] * num_points_v[2]) * 4 * 3;
- }
- else {
- func = add_streamline;
- max_points = (num_points_v[0] * num_points_v[1] * num_points_v[2]) * 2;
- }
-
- float (*verts)[3] = MEM_mallocN(sizeof(float) * 3 * max_points, "");
- float (*colors)[3] = MEM_mallocN(sizeof(float) * 3 * max_points, "");
-
- int num_points = 0;
-
- for (float x = floor(xyz[0]); x < res_max[0]; x += step_size) {
- for (float y = floor(xyz[1]); y < res_max[1]; y += step_size) {
- for (float z = floor(xyz[2]); z < res_max[2]; z += step_size) {
- int index = (floor(x) - res_min[0]) + (floor(y) - res_min[1]) * res[0] + (floor(z) - res_min[2]) * res[0] * res[1];
-
- float pos[3] = {
- min[0] + ((float)x + 0.5f) * cell_size[0],
- min[1] + ((float)y + 0.5f) * cell_size[1],
- min[2] + ((float)z + 0.5f) * cell_size[2]
- };
-
- float vel[3] = {
- vel_x[index], vel_y[index], vel_z[index]
- };
-
- func(verts, colors, pos, vel, domain->vector_scale, cell_size[0], &num_points);
- }
- }
- }
-
- GPU_line_width(1.0f);
-
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, verts);
-
- glEnableClientState(GL_COLOR_ARRAY);
- glColorPointer(3, GL_FLOAT, 0, colors);
-
- glDrawArrays(GL_LINES, 0, num_points);
-
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_COLOR_ARRAY);
-
- MEM_freeN(verts);
- MEM_freeN(colors);
-#else
- UNUSED_VARS(domain, viewnormal);
-#endif
-}
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 735b4e5bec0..bfd6679b513 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -824,9 +824,9 @@ static void draw_view_axis(RegionView3D *rv3d, const rcti *rect)
for (int axis_i = 0; axis_i < 3; axis_i++) {
int i = axis_order[axis_i];
- immAttrib4ubv(col, axis_col[i]);
+ immAttr4ubv(col, axis_col[i]);
immVertex2f(pos, startx, starty);
- immAttrib4ubv(col, axis_col[i]);
+ immAttr4ubv(col, axis_col[i]);
immVertex2fv(pos, axis_pos[i]);
}
@@ -874,7 +874,7 @@ static void UNUSED_FUNCTION(draw_rotation_guide)(RegionView3D *rv3d)
immBegin(GPU_PRIM_LINE_STRIP, 3);
color[3] = 0; /* more transparent toward the ends */
- immAttrib4ubv(col, color);
+ immAttr4ubv(col, color);
add_v3_v3v3(end, o, scaled_axis);
immVertex3fv(pos, end);
@@ -884,11 +884,11 @@ static void UNUSED_FUNCTION(draw_rotation_guide)(RegionView3D *rv3d)
#endif
color[3] = 127; /* more opaque toward the center */
- immAttrib4ubv(col, color);
+ immAttr4ubv(col, color);
immVertex3fv(pos, o);
color[3] = 0;
- immAttrib4ubv(col, color);
+ immAttr4ubv(col, color);
sub_v3_v3v3(end, o, scaled_axis);
immVertex3fv(pos, end);
immEnd();
@@ -913,7 +913,7 @@ static void UNUSED_FUNCTION(draw_rotation_guide)(RegionView3D *rv3d)
immBegin(GPU_PRIM_LINE_LOOP, ROT_AXIS_DETAIL);
color[3] = 63; /* somewhat faint */
- immAttrib4ubv(col, color);
+ immAttr4ubv(col, color);
float angle = 0.0f;
for (int i = 0; i < ROT_AXIS_DETAIL; ++i, angle += step) {
float p[3] = {s * cosf(angle), s * sinf(angle), 0.0f};
@@ -941,7 +941,7 @@ static void UNUSED_FUNCTION(draw_rotation_guide)(RegionView3D *rv3d)
immBindBuiltinProgram(GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR);
GPU_point_size(5.0f);
immBegin(GPU_PRIM_POINTS, 1);
- immAttrib4ubv(col, color);
+ immAttr4ubv(col, color);
immVertex3fv(pos, o);
immEnd();
immUnbindProgram();
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index e710d7b2d2a..0174e139c0a 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -2825,7 +2825,7 @@ static int viewselected_exec(bContext *C, wmOperator *op)
const int smooth_viewtx = WM_operator_smooth_viewtx_get(op);
INIT_MINMAX(min, max);
- if (is_gp_edit || is_face_map) {
+ if (is_face_map) {
ob_eval = NULL;
}
@@ -2845,7 +2845,6 @@ static int viewselected_exec(bContext *C, wmOperator *op)
}
if (is_gp_edit) {
- /* TODO(sergey): Check on this after gpencil merge. */
CTX_DATA_BEGIN(C, bGPDstroke *, gps, editable_gpencil_strokes)
{
/* we're only interested in selected points here... */
@@ -2854,6 +2853,14 @@ static int viewselected_exec(bContext *C, wmOperator *op)
}
}
CTX_DATA_END;
+
+ if ((ob_eval) && (ok)) {
+ add_v3_v3(min, ob_eval->obmat[3]);
+ add_v3_v3(max, ob_eval->obmat[3]);
+ }
+ }
+ else if (ob_eval && (ob_eval->type == OB_GPENCIL)) {
+ ok |= BKE_gpencil_data_minmax(ob_eval, gpd, min, max);
}
else if (is_face_map) {
ok = WM_gizmomap_minmax(ar->gizmo_map, true, true, min, max);
diff --git a/source/blender/editors/space_view3d/view3d_gizmo_empty.c b/source/blender/editors/space_view3d/view3d_gizmo_empty.c
index 2913ba245e7..fe1129f8028 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_empty.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_empty.c
@@ -31,6 +31,8 @@
#include "BKE_object.h"
#include "BKE_image.h"
+#include "DEG_depsgraph.h"
+
#include "DNA_object_types.h"
#include "DNA_lamp_types.h"
@@ -94,6 +96,7 @@ static void gizmo_empty_image_prop_matrix_set(
Object *ob = igzgroup->state.ob;
ob->empty_drawsize = matrix[0][0];
+ DEG_id_tag_update(&ob->id, DEG_TAG_TRANSFORM);
float dims[2];
RNA_float_get_array(gz->ptr, "dimensions", dims);
diff --git a/source/blender/editors/space_view3d/view3d_iterators.c b/source/blender/editors/space_view3d/view3d_iterators.c
index 499331639c4..1a3b0bf64cd 100644
--- a/source/blender/editors/space_view3d/view3d_iterators.c
+++ b/source/blender/editors/space_view3d/view3d_iterators.c
@@ -43,6 +43,7 @@
#include "BKE_editmesh.h"
#include "BKE_context.h"
#include "BKE_mesh_runtime.h"
+#include "BKE_mesh_iterators.h"
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
@@ -158,9 +159,8 @@ void mesh_foreachScreenVert(
void *userData, eV3DProjTest clip_flag)
{
foreachScreenVert_userData data;
- DerivedMesh *dm;
- dm = editbmesh_get_derived_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
+ Mesh *me = editbmesh_get_eval_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
ED_view3d_check_mats_rv3d(vc->rv3d);
@@ -174,9 +174,7 @@ void mesh_foreachScreenVert(
}
BM_mesh_elem_table_ensure(vc->em->bm, BM_VERT);
- dm->foreachMappedVert(dm, mesh_foreachScreenVert__mapFunc, &data, DM_FOREACH_NOP);
-
- dm->release(dm);
+ BKE_mesh_foreach_mapped_vert(me, mesh_foreachScreenVert__mapFunc, &data, MESH_FOREACH_NOP);
}
/* ------------------------------------------------------------------------ */
@@ -214,9 +212,8 @@ void mesh_foreachScreenEdge(
void *userData, eV3DProjTest clip_flag)
{
foreachScreenEdge_userData data;
- DerivedMesh *dm;
- dm = editbmesh_get_derived_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
+ Mesh *me = editbmesh_get_eval_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
ED_view3d_check_mats_rv3d(vc->rv3d);
@@ -236,9 +233,7 @@ void mesh_foreachScreenEdge(
}
BM_mesh_elem_table_ensure(vc->em->bm, BM_EDGE);
- dm->foreachMappedEdge(dm, mesh_foreachScreenEdge__mapFunc, &data);
-
- dm->release(dm);
+ BKE_mesh_foreach_mapped_edge(me, mesh_foreachScreenEdge__mapFunc, &data);
}
/* ------------------------------------------------------------------------ */
@@ -262,10 +257,8 @@ void mesh_foreachScreenFace(
void *userData, const eV3DProjTest clip_flag)
{
foreachScreenFace_userData data;
- DerivedMesh *dm;
-
- dm = editbmesh_get_derived_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
+ Mesh *me = editbmesh_get_eval_cage(vc->depsgraph, vc->scene, vc->obedit, vc->em, CD_MASK_BAREMESH);
ED_view3d_check_mats_rv3d(vc->rv3d);
data.vc = *vc;
@@ -274,9 +267,7 @@ void mesh_foreachScreenFace(
data.clip_flag = clip_flag;
BM_mesh_elem_table_ensure(vc->em->bm, BM_FACE);
- dm->foreachMappedFaceCenter(dm, mesh_foreachScreenFace__mapFunc, &data, DM_FOREACH_NOP);
-
- dm->release(dm);
+ BKE_mesh_foreach_mapped_face_center(me, mesh_foreachScreenFace__mapFunc, &data, MESH_FOREACH_NOP);
}
/* ------------------------------------------------------------------------ */
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 26a9a8f24c1..47266c2584e 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -1528,6 +1528,13 @@ Base *ED_view3d_give_base_under_cursor(bContext *C, const int mval[2])
return basact;
}
+Object *ED_view3d_give_object_under_cursor(bContext *C, const int mval[2])
+{
+ Base *base = ED_view3d_give_base_under_cursor(C, mval);
+ if (base) return base->object;
+ return NULL;
+}
+
static void deselect_all_tracks(MovieTracking *tracking)
{
MovieTrackingObject *object;
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index 58406470f36..97b9a5c84e0 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -768,10 +768,8 @@ static bool snap_calc_active_center(bContext *C, const bool select_only, float r
Object *obedit = CTX_data_edit_object(C);
if (obedit) {
- Object *ob_edit_eval = DEG_get_evaluated_object(depsgraph, obedit);
-
- if (ED_object_editmode_calc_active_center(ob_edit_eval, select_only, r_center)) {
- mul_m4_v3(ob_edit_eval->obmat, r_center);
+ if (ED_object_editmode_calc_active_center(obedit, select_only, r_center)) {
+ mul_m4_v3(obedit->obmat, r_center);
return true;
}
}
diff --git a/source/blender/editors/transform/transform_snap_object.c b/source/blender/editors/transform/transform_snap_object.c
index a3ce35a223a..48006874e34 100644
--- a/source/blender/editors/transform/transform_snap_object.c
+++ b/source/blender/editors/transform/transform_snap_object.c
@@ -100,6 +100,7 @@ typedef struct SnapObjectData {
typedef struct SnapObjectData_Mesh {
SnapObjectData sd;
BVHTreeFromMesh treedata;
+ const struct MPoly *poly;
BVHTree *bvhtree[2]; /* from loose verts and from loose edges */
uint has_looptris : 1;
uint has_loose_edge : 1;
@@ -428,12 +429,19 @@ static bool raycastMesh(
if (treedata->looptri && treedata->looptri_allocated == false) {
treedata->looptri = BKE_mesh_runtime_looptri_ensure(me);
}
+ /* required for snapping with occlusion. */
+ treedata->edge = me->medge;
+ sod->poly = me->mpoly;
}
}
if (treedata->tree == NULL) {
BKE_bvhtree_from_mesh_get(treedata, me, BVHTREE_FROM_LOOPTRI, 4);
+ /* required for snapping with occlusion. */
+ treedata->edge = me->medge;
+ sod->poly = me->mpoly;
+
if (treedata->tree == NULL) {
return retval;
}
@@ -736,22 +744,31 @@ static bool raycastObj(
switch (ob->type) {
case OB_MESH:
- if (use_obedit && BKE_object_is_in_editmode(ob)) {
+ {
+ Mesh *me = ob->data;
+ if (BKE_object_is_in_editmode(ob)) {
BMEditMesh *em = BKE_editmesh_from_object(ob);
- retval = raycastEditMesh(
- sctx,
- ray_start, ray_dir,
- ob, em, obmat, ob_index,
- ray_depth, r_loc, r_no, r_index, r_hit_list);
- }
- else {
- retval = raycastMesh(
- sctx,
- ray_start, ray_dir,
- ob, ob->data, obmat, ob_index,
- ray_depth, r_loc, r_no, r_index, r_hit_list);
+ if (use_obedit) {
+ retval = raycastEditMesh(
+ sctx,
+ ray_start, ray_dir,
+ ob, em, obmat, ob_index,
+ ray_depth, r_loc, r_no, r_index, r_hit_list);
+ break;
+ }
+ else if (em->mesh_eval_final &&
+ (em->mesh_eval_final->runtime.deformed_only == false))
+ {
+ me = em->mesh_eval_final;
+ }
}
+ retval = raycastMesh(
+ sctx,
+ ray_start, ray_dir,
+ ob, me, obmat, ob_index,
+ ray_depth, r_loc, r_no, r_index, r_hit_list);
break;
+ }
}
if (retval) {
@@ -1202,12 +1219,11 @@ static short snap_mesh_polygon(
nearest2d.get_edge_verts_index = (Nearest2DGetEdgeVertsCallback)cb_medge_verts_get;
nearest2d.copy_vert_no = (Nearest2DCopyVertNoCallback)cb_mvert_no_copy;
- MPoly *mp = &((Mesh *)ob->data)->mpoly[*r_index];
- const MLoop *ml;
+ const MPoly *mp = &((SnapObjectData_Mesh *)sod)->poly[*r_index];
+ const MLoop *ml = &treedata->loop[mp->loopstart];
if (snapdata->snap_to_flag & SCE_SNAP_MODE_EDGE) {
elem = SCE_SNAP_MODE_EDGE;
- treedata->edge = ((Mesh *)ob->data)->medge;
- ml = &treedata->loop[mp->loopstart];
+ BLI_assert(treedata->edge != NULL);
for (int i = mp->totloop; i--; ml++) {
cb_snap_edge(
&nearest2d, ml->e, &neasrest_precalc,
@@ -1217,7 +1233,6 @@ static short snap_mesh_polygon(
}
else {
elem = SCE_SNAP_MODE_VERTEX;
- ml = &treedata->loop[mp->loopstart];
for (int i = mp->totloop; i--; ml++) {
cb_snap_vert(
&nearest2d, ml->v, &neasrest_precalc,
@@ -2243,21 +2258,29 @@ static short snapObject(
switch (ob->type) {
case OB_MESH:
- if (use_obedit && BKE_object_is_in_editmode(ob)) {
+ {
+ Mesh *me = ob->data;
+ if (BKE_object_is_in_editmode(ob)) {
BMEditMesh *em = BKE_editmesh_from_object(ob);
- retval = snapEditMesh(
- sctx, snapdata, ob, em, obmat,
- dist_px,
- r_loc, r_no, r_index);
- }
- else {
- retval = snapMesh(
- sctx, snapdata, ob, ob->data, obmat,
- dist_px,
- r_loc, r_no, r_index);
+ if (use_obedit) {
+ retval = snapEditMesh(
+ sctx, snapdata, ob, em, obmat,
+ dist_px,
+ r_loc, r_no, r_index);
+ break;
+ }
+ else if (em->mesh_eval_final &&
+ (em->mesh_eval_final->runtime.deformed_only == false))
+ {
+ me = em->mesh_eval_final;
+ }
}
+ retval = snapMesh(
+ sctx, snapdata, ob, me, obmat,
+ dist_px,
+ r_loc, r_no, r_index);
break;
-
+ }
case OB_ARMATURE:
retval = snapArmature(
snapdata,
diff --git a/source/blender/editors/util/ed_transverts.c b/source/blender/editors/util/ed_transverts.c
index 3cd74f1266f..583d1116eec 100644
--- a/source/blender/editors/util/ed_transverts.c
+++ b/source/blender/editors/util/ed_transverts.c
@@ -43,6 +43,7 @@
#include "BKE_editmesh.h"
#include "BKE_DerivedMesh.h"
#include "BKE_context.h"
+#include "BKE_mesh_iterators.h"
#include "DEG_depsgraph.h"
@@ -304,9 +305,9 @@ void ED_transverts_create_from_obedit(TransVertStore *tvs, Object *obedit, const
userdata[1] = tvs->transverts;
}
- if (tvs->transverts && em->derivedCage) {
+ if (tvs->transverts && em->mesh_eval_cage) {
BM_mesh_elem_table_ensure(bm, BM_VERT);
- em->derivedCage->foreachMappedVert(em->derivedCage, set_mapped_co, userdata, DM_FOREACH_NOP);
+ BKE_mesh_foreach_mapped_vert(em->mesh_eval_cage, set_mapped_co, userdata, MESH_FOREACH_NOP);
}
}
else if (obedit->type == OB_ARMATURE) {
diff --git a/source/blender/freestyle/intern/application/AppCanvas.h b/source/blender/freestyle/intern/application/AppCanvas.h
index 9a92cf482d0..ed473e22489 100644
--- a/source/blender/freestyle/intern/application/AppCanvas.h
+++ b/source/blender/freestyle/intern/application/AppCanvas.h
@@ -69,7 +69,7 @@ public:
virtual float thickness() const;
AppView *_pViewer;
- inline const AppView * viewer() const {return _pViewer;}
+ inline const AppView *viewer() const {return _pViewer;}
/*! modifiers */
void setViewer(AppView *iViewer);
diff --git a/source/blender/freestyle/intern/application/AppConfig.h b/source/blender/freestyle/intern/application/AppConfig.h
index ae1d96e06d8..d7572aa1a04 100644
--- a/source/blender/freestyle/intern/application/AppConfig.h
+++ b/source/blender/freestyle/intern/application/AppConfig.h
@@ -44,7 +44,7 @@ namespace Config {
class Path {
protected:
- static Path * _pInstance;
+ static Path *_pInstance;
string _ProjectDir;
string _ModelsPath;
string _PatternsPath;
diff --git a/source/blender/freestyle/intern/application/Controller.cpp b/source/blender/freestyle/intern/application/Controller.cpp
index b4c815f8ad0..5ae04698a73 100644
--- a/source/blender/freestyle/intern/application/Controller.cpp
+++ b/source/blender/freestyle/intern/application/Controller.cpp
@@ -642,11 +642,11 @@ void Controller::ComputeSteerableViewMap()
NodeShape *completeNS = new NodeShape;
completeNS->material().setDiffuse(c,c,c,1);
ng[Canvas::NB_STEERABLE_VIEWMAP-1]->AddChild(completeNS);
- SteerableViewMap * svm = _Canvas->getSteerableViewMap();
+ SteerableViewMap *svm = _Canvas->getSteerableViewMap();
svm->Reset();
ViewMap::fedges_container& fedges = _ViewMap->FEdges();
- LineRep * fRep;
+ LineRep *fRep;
NodeShape *ns;
for (ViewMap::fedges_container::iterator f = fedges.begin(), fend = fedges.end();
f != fend;
@@ -722,7 +722,7 @@ void Controller::ComputeSteerableViewMap()
void Controller::saveSteerableViewMapImages()
{
- SteerableViewMap * svm = _Canvas->getSteerableViewMap();
+ SteerableViewMap *svm = _Canvas->getSteerableViewMap();
if (!svm) {
cerr << "the Steerable ViewMap has not been computed yet" << endl;
return;
@@ -1003,7 +1003,7 @@ void Controller::resetModified(bool iMod)
_Canvas->resetModified(iMod);
}
-NodeGroup * Controller::BuildRep(vector<ViewEdge*>::iterator vedges_begin, vector<ViewEdge*>::iterator vedges_end)
+NodeGroup *Controller::BuildRep(vector<ViewEdge*>::iterator vedges_begin, vector<ViewEdge*>::iterator vedges_end)
{
ViewMapTesselator2D tesselator2D;
FrsMaterial mat;
@@ -1052,7 +1052,7 @@ void Controller::resetInterpreter()
void Controller::displayDensityCurves(int x, int y)
{
- SteerableViewMap * svm = _Canvas->getSteerableViewMap();
+ SteerableViewMap *svm = _Canvas->getSteerableViewMap();
if (!svm)
return;
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
index a0b97b817fd..a42e59ddb2a 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
@@ -107,13 +107,11 @@ NodeGroup *BlenderFileLoader::Load()
bool apply_modifiers = false;
bool calc_undeformed = false;
- bool calc_tessface = false;
Mesh *mesh = BKE_mesh_new_from_object(depsgraph,
_re->main,
_re->scene,
ob,
apply_modifiers,
- calc_tessface,
calc_undeformed);
if (mesh) {
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
index 0542b7f45fd..37a3f52ccdd 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
+++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
@@ -92,7 +92,7 @@ public:
virtual ~BlenderFileLoader();
/*! Loads the 3D scene and returns a pointer to the scene root node */
- NodeGroup * Load();
+ NodeGroup *Load();
/*! Gets the number of read faces */
inline unsigned int numFacesRead() {return _numFacesRead;}
diff --git a/source/blender/freestyle/intern/geometry/Grid.h b/source/blender/freestyle/intern/geometry/Grid.h
index 7d025a6a7f1..0a9be01aba1 100644
--- a/source/blender/freestyle/intern/geometry/Grid.h
+++ b/source/blender/freestyle/intern/geometry/Grid.h
@@ -290,8 +290,9 @@ public:
* Returns the first intersection (occluder,t,u,v) or null.
* Starts with a call to InitRay.
*/
- Polygon3r * castRayToFindFirstIntersection(const Vec3r& orig, const Vec3r& dir, double& t,
- double& u, double& v, unsigned timestamp);
+ Polygon3r *castRayToFindFirstIntersection(
+ const Vec3r& orig, const Vec3r& dir, double& t,
+ double& u, double& v, unsigned timestamp);
/*! Init all structures and values for computing the cells intersected by this new ray */
diff --git a/source/blender/freestyle/intern/geometry/SweepLine.h b/source/blender/freestyle/intern/geometry/SweepLine.h
index 98e860862bb..3edd045320f 100644
--- a/source/blender/freestyle/intern/geometry/SweepLine.h
+++ b/source/blender/freestyle/intern/geometry/SweepLine.h
@@ -72,7 +72,7 @@ public:
}
public:
- void * userdata; // FIXME
+ void *userdata; // FIXME
Edge *EdgeA; // first segment
Edge *EdgeB; // second segment
diff --git a/source/blender/freestyle/intern/image/ImagePyramid.cpp b/source/blender/freestyle/intern/image/ImagePyramid.cpp
index b81f8303945..db92cc68286 100644
--- a/source/blender/freestyle/intern/image/ImagePyramid.cpp
+++ b/source/blender/freestyle/intern/image/ImagePyramid.cpp
@@ -61,7 +61,7 @@ ImagePyramid::~ImagePyramid()
}
}
-GrayImage * ImagePyramid::getLevel(int l)
+GrayImage *ImagePyramid::getLevel(int l)
{
return _levels[l];
}
diff --git a/source/blender/freestyle/intern/python/BPy_Convert.h b/source/blender/freestyle/intern/python/BPy_Convert.h
index a0e0b578c10..976b760a325 100644
--- a/source/blender/freestyle/intern/python/BPy_Convert.h
+++ b/source/blender/freestyle/intern/python/BPy_Convert.h
@@ -98,53 +98,53 @@ extern "C" {
// C++ => Python
//==============================
-PyObject * PyBool_from_bool(bool b);
-PyObject * Vector_from_Vec2f(Vec2f& v);
-PyObject * Vector_from_Vec3f(Vec3f& v);
-PyObject * Vector_from_Vec3r(Vec3r& v);
-
-PyObject * Any_BPy_Interface0D_from_Interface0D(Interface0D& if0D);
-PyObject * Any_BPy_Interface1D_from_Interface1D(Interface1D& if1D);
-PyObject * Any_BPy_FEdge_from_FEdge(FEdge& fe);
-PyObject * Any_BPy_ViewVertex_from_ViewVertex(ViewVertex& vv);
-
-PyObject * BPy_BBox_from_BBox(const BBox< Vec3r > &bb);
-PyObject * BPy_CurvePoint_from_CurvePoint(CurvePoint& cp);
-PyObject * BPy_directedViewEdge_from_directedViewEdge(ViewVertex::directedViewEdge& dve);
-PyObject * BPy_FEdge_from_FEdge(FEdge& fe);
-PyObject * BPy_FEdgeSharp_from_FEdgeSharp(FEdgeSharp& fes);
-PyObject * BPy_FEdgeSmooth_from_FEdgeSmooth(FEdgeSmooth& fes);
-PyObject * BPy_Id_from_Id(Id& id);
-PyObject * BPy_Interface0D_from_Interface0D(Interface0D& if0D);
-PyObject * BPy_Interface1D_from_Interface1D(Interface1D& if1D);
-PyObject * BPy_IntegrationType_from_IntegrationType(IntegrationType i);
-PyObject * BPy_FrsMaterial_from_FrsMaterial(const FrsMaterial& m);
-PyObject * BPy_Nature_from_Nature(unsigned short n);
-PyObject * BPy_MediumType_from_MediumType(Stroke::MediumType n);
-PyObject * BPy_SShape_from_SShape(SShape& ss);
-PyObject * BPy_Stroke_from_Stroke(Stroke& s);
-PyObject * BPy_StrokeAttribute_from_StrokeAttribute(StrokeAttribute& sa);
-PyObject * BPy_StrokeVertex_from_StrokeVertex(StrokeVertex& sv);
-PyObject * BPy_SVertex_from_SVertex(SVertex& sv);
-PyObject * BPy_ViewVertex_from_ViewVertex(ViewVertex& vv);
-PyObject * BPy_NonTVertex_from_NonTVertex(NonTVertex& ntv);
-PyObject * BPy_TVertex_from_TVertex(TVertex& tv);
-PyObject * BPy_ViewEdge_from_ViewEdge(ViewEdge& ve);
-PyObject * BPy_Chain_from_Chain(Chain& c);
-PyObject * BPy_ViewShape_from_ViewShape(ViewShape& vs);
-
-PyObject * BPy_AdjacencyIterator_from_AdjacencyIterator(AdjacencyIterator& a_it);
-PyObject * BPy_Interface0DIterator_from_Interface0DIterator(Interface0DIterator& if0D_it, bool reversed);
-PyObject * BPy_CurvePointIterator_from_CurvePointIterator(CurveInternal::CurvePointIterator& cp_it);
-PyObject * BPy_StrokeVertexIterator_from_StrokeVertexIterator(StrokeInternal::StrokeVertexIterator& sv_it,
+PyObject *PyBool_from_bool(bool b);
+PyObject *Vector_from_Vec2f(Vec2f& v);
+PyObject *Vector_from_Vec3f(Vec3f& v);
+PyObject *Vector_from_Vec3r(Vec3r& v);
+
+PyObject *Any_BPy_Interface0D_from_Interface0D(Interface0D& if0D);
+PyObject *Any_BPy_Interface1D_from_Interface1D(Interface1D& if1D);
+PyObject *Any_BPy_FEdge_from_FEdge(FEdge& fe);
+PyObject *Any_BPy_ViewVertex_from_ViewVertex(ViewVertex& vv);
+
+PyObject *BPy_BBox_from_BBox(const BBox< Vec3r > &bb);
+PyObject *BPy_CurvePoint_from_CurvePoint(CurvePoint& cp);
+PyObject *BPy_directedViewEdge_from_directedViewEdge(ViewVertex::directedViewEdge& dve);
+PyObject *BPy_FEdge_from_FEdge(FEdge& fe);
+PyObject *BPy_FEdgeSharp_from_FEdgeSharp(FEdgeSharp& fes);
+PyObject *BPy_FEdgeSmooth_from_FEdgeSmooth(FEdgeSmooth& fes);
+PyObject *BPy_Id_from_Id(Id& id);
+PyObject *BPy_Interface0D_from_Interface0D(Interface0D& if0D);
+PyObject *BPy_Interface1D_from_Interface1D(Interface1D& if1D);
+PyObject *BPy_IntegrationType_from_IntegrationType(IntegrationType i);
+PyObject *BPy_FrsMaterial_from_FrsMaterial(const FrsMaterial& m);
+PyObject *BPy_Nature_from_Nature(unsigned short n);
+PyObject *BPy_MediumType_from_MediumType(Stroke::MediumType n);
+PyObject *BPy_SShape_from_SShape(SShape& ss);
+PyObject *BPy_Stroke_from_Stroke(Stroke& s);
+PyObject *BPy_StrokeAttribute_from_StrokeAttribute(StrokeAttribute& sa);
+PyObject *BPy_StrokeVertex_from_StrokeVertex(StrokeVertex& sv);
+PyObject *BPy_SVertex_from_SVertex(SVertex& sv);
+PyObject *BPy_ViewVertex_from_ViewVertex(ViewVertex& vv);
+PyObject *BPy_NonTVertex_from_NonTVertex(NonTVertex& ntv);
+PyObject *BPy_TVertex_from_TVertex(TVertex& tv);
+PyObject *BPy_ViewEdge_from_ViewEdge(ViewEdge& ve);
+PyObject *BPy_Chain_from_Chain(Chain& c);
+PyObject *BPy_ViewShape_from_ViewShape(ViewShape& vs);
+
+PyObject *BPy_AdjacencyIterator_from_AdjacencyIterator(AdjacencyIterator& a_it);
+PyObject *BPy_Interface0DIterator_from_Interface0DIterator(Interface0DIterator& if0D_it, bool reversed);
+PyObject *BPy_CurvePointIterator_from_CurvePointIterator(CurveInternal::CurvePointIterator& cp_it);
+PyObject *BPy_StrokeVertexIterator_from_StrokeVertexIterator(StrokeInternal::StrokeVertexIterator& sv_it,
bool reversed);
-PyObject * BPy_SVertexIterator_from_SVertexIterator(ViewEdgeInternal::SVertexIterator& sv_it);
-PyObject * BPy_orientedViewEdgeIterator_from_orientedViewEdgeIterator(ViewVertexInternal::orientedViewEdgeIterator& ove_it,
+PyObject *BPy_SVertexIterator_from_SVertexIterator(ViewEdgeInternal::SVertexIterator& sv_it);
+PyObject *BPy_orientedViewEdgeIterator_from_orientedViewEdgeIterator(ViewVertexInternal::orientedViewEdgeIterator& ove_it,
bool reversed);
-PyObject * BPy_ViewEdgeIterator_from_ViewEdgeIterator(ViewEdgeInternal::ViewEdgeIterator& ve_it);
-PyObject * BPy_ChainingIterator_from_ChainingIterator(ChainingIterator& c_it);
-PyObject * BPy_ChainPredicateIterator_from_ChainPredicateIterator(ChainPredicateIterator& cp_it);
-PyObject * BPy_ChainSilhouetteIterator_from_ChainSilhouetteIterator(ChainSilhouetteIterator& cs_it);
+PyObject *BPy_ViewEdgeIterator_from_ViewEdgeIterator(ViewEdgeInternal::ViewEdgeIterator& ve_it);
+PyObject *BPy_ChainingIterator_from_ChainingIterator(ChainingIterator& c_it);
+PyObject *BPy_ChainPredicateIterator_from_ChainPredicateIterator(ChainPredicateIterator& cp_it);
+PyObject *BPy_ChainSilhouetteIterator_from_ChainSilhouetteIterator(ChainSilhouetteIterator& cs_it);
//==============================
// Python => C++
diff --git a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp
index 548ab529f34..a6683f538c6 100644
--- a/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp
+++ b/source/blender/freestyle/intern/python/BPy_IntegrationType.cpp
@@ -63,7 +63,7 @@ PyDoc_STRVAR(Integrator_integrate_doc,
" :class:`UnaryFunction0DUnsigned` type.\n"
" :rtype: int or float");
-static PyObject * Integrator_integrate(PyObject * /*self*/, PyObject *args, PyObject *kwds)
+static PyObject *Integrator_integrate(PyObject * /*self*/, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"func", "it", "it_end", "integration_type", NULL};
PyObject *obj1, *obj4 = 0;
diff --git a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp
index 0fc3ec41dec..c5a07fd295b 100644
--- a/source/blender/freestyle/intern/python/BPy_Interface1D.cpp
+++ b/source/blender/freestyle/intern/python/BPy_Interface1D.cpp
@@ -138,7 +138,7 @@ PyDoc_STRVAR(Interface1D_vertices_begin_doc,
" :return: An Interface0DIterator pointing to the first vertex.\n"
" :rtype: :class:`Interface0DIterator`");
-static PyObject * Interface1D_vertices_begin(BPy_Interface1D *self)
+static PyObject *Interface1D_vertices_begin(BPy_Interface1D *self)
{
Interface0DIterator if0D_it(self->if1D->verticesBegin());
return BPy_Interface0DIterator_from_Interface0DIterator(if0D_it, false);
@@ -153,7 +153,7 @@ PyDoc_STRVAR(Interface1D_vertices_end_doc,
" :return: An Interface0DIterator pointing after the last vertex.\n"
" :rtype: :class:`Interface0DIterator`");
-static PyObject * Interface1D_vertices_end(BPy_Interface1D *self)
+static PyObject *Interface1D_vertices_end(BPy_Interface1D *self)
{
Interface0DIterator if0D_it(self->if1D->verticesEnd());
return BPy_Interface0DIterator_from_Interface0DIterator(if0D_it, true);
@@ -173,7 +173,7 @@ PyDoc_STRVAR(Interface1D_points_begin_doc,
" :return: An Interface0DIterator pointing to the first point.\n"
" :rtype: :class:`Interface0DIterator`");
-static PyObject * Interface1D_points_begin(BPy_Interface1D *self, PyObject *args, PyObject *kwds)
+static PyObject *Interface1D_points_begin(BPy_Interface1D *self, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"t", NULL};
float f = 0.0f;
@@ -198,7 +198,7 @@ PyDoc_STRVAR(Interface1D_points_end_doc,
" :return: An Interface0DIterator pointing after the last point.\n"
" :rtype: :class:`Interface0DIterator`");
-static PyObject * Interface1D_points_end(BPy_Interface1D *self, PyObject *args, PyObject *kwds)
+static PyObject *Interface1D_points_end(BPy_Interface1D *self, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"t", NULL};
float f = 0.0f;
diff --git a/source/blender/freestyle/intern/python/BPy_SShape.cpp b/source/blender/freestyle/intern/python/BPy_SShape.cpp
index cf4880ad3f7..28c9e815196 100644
--- a/source/blender/freestyle/intern/python/BPy_SShape.cpp
+++ b/source/blender/freestyle/intern/python/BPy_SShape.cpp
@@ -122,7 +122,7 @@ PyDoc_STRVAR(SShape_add_vertex_doc,
" :arg vertex: An SVertex object.\n"
" :type vertex: :class:`SVertex`");
-static PyObject * SShape_add_vertex(BPy_SShape *self, PyObject *args, PyObject *kwds)
+static PyObject *SShape_add_vertex(BPy_SShape *self, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"edge", NULL};
PyObject *py_sv = 0;
diff --git a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp
index fb7eb49127c..b390bb293d5 100644
--- a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp
+++ b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp
@@ -135,7 +135,7 @@ static void StrokeAttribute_dealloc(BPy_StrokeAttribute *self)
Py_TYPE(self)->tp_free((PyObject *)self);
}
-static PyObject * StrokeAttribute_repr(BPy_StrokeAttribute *self)
+static PyObject *StrokeAttribute_repr(BPy_StrokeAttribute *self)
{
stringstream repr("StrokeAttribute:");
repr << " r: " << self->sa->getColorR() << " g: " << self->sa->getColorG() << " b: " << self->sa->getColorB() <<
@@ -282,7 +282,7 @@ PyDoc_STRVAR(StrokeAttribute_set_attribute_real_doc,
" :arg value: The attribute value.\n"
" :type value: float\n");
-static PyObject * StrokeAttribute_set_attribute_real(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds)
+static PyObject *StrokeAttribute_set_attribute_real(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"name", "value", NULL};
char *s = 0;
@@ -306,7 +306,7 @@ PyDoc_STRVAR(StrokeAttribute_set_attribute_vec2_doc,
" :arg value: The attribute value.\n"
" :type value: :class:`mathutils.Vector`, list or tuple of 2 real numbers\n");
-static PyObject * StrokeAttribute_set_attribute_vec2(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds)
+static PyObject *StrokeAttribute_set_attribute_vec2(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"name", "value", NULL};
char *s;
@@ -335,7 +335,7 @@ PyDoc_STRVAR(StrokeAttribute_set_attribute_vec3_doc,
" :arg value: The attribute value.\n"
" :type value: :class:`mathutils.Vector`, list or tuple of 3 real numbers\n");
-static PyObject * StrokeAttribute_set_attribute_vec3(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds)
+static PyObject *StrokeAttribute_set_attribute_vec3(BPy_StrokeAttribute *self, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"name", "value", NULL};
char *s;
diff --git a/source/blender/freestyle/intern/scene_graph/NodeCamera.h b/source/blender/freestyle/intern/scene_graph/NodeCamera.h
index c2f70d514a8..2fc6a00f955 100644
--- a/source/blender/freestyle/intern/scene_graph/NodeCamera.h
+++ b/source/blender/freestyle/intern/scene_graph/NodeCamera.h
@@ -68,12 +68,12 @@ public:
/*! Matrix is copied */
void setProjectionMatrix(double projection_matrix[16]);
- double * modelViewMatrix()
+ double *modelViewMatrix()
{
return modelview_matrix_;
}
- double * projectionMatrix()
+ double *projectionMatrix()
{
return projection_matrix_;
}
diff --git a/source/blender/freestyle/intern/view_map/Interface0D.cpp b/source/blender/freestyle/intern/view_map/Interface0D.cpp
index 1d8515700d3..5cfd216cda2 100644
--- a/source/blender/freestyle/intern/view_map/Interface0D.cpp
+++ b/source/blender/freestyle/intern/view_map/Interface0D.cpp
@@ -78,7 +78,7 @@ Geometry::Vec2r Interface0D::getPoint2D() const
return 0;
}
-FEdge * Interface0D::getFEdge(Interface0D&)
+FEdge *Interface0D::getFEdge(Interface0D&)
{
PyErr_SetString(PyExc_TypeError, "method getFEdge() not properly overridden");
return 0;
@@ -96,25 +96,25 @@ Nature::VertexNature Interface0D::getNature() const
return Nature::POINT;
}
-SVertex * Interface0D::castToSVertex()
+SVertex *Interface0D::castToSVertex()
{
PyErr_SetString(PyExc_TypeError, "method castToSVertex() not properly overridden");
return 0;
}
-ViewVertex * Interface0D::castToViewVertex()
+ViewVertex *Interface0D::castToViewVertex()
{
PyErr_SetString(PyExc_TypeError, "method castToViewVertex() not properly overridden");
return 0;
}
-NonTVertex * Interface0D::castToNonTVertex()
+NonTVertex *Interface0D::castToNonTVertex()
{
PyErr_SetString(PyExc_TypeError, "method castToNonTVertex() not properly overridden");
return 0;
}
-TVertex * Interface0D::castToTVertex()
+TVertex *Interface0D::castToTVertex()
{
PyErr_SetString(PyExc_TypeError, "method castToTVertex() not properly overridden");
return 0;
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index e8c3a19b77e..85a3b604e33 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -88,9 +88,6 @@ set(SRC
intern/gpu_viewport.c
shaders/gpu_shader_material.glsl
- shaders/gpu_shader_fire_frag.glsl
- shaders/gpu_shader_smoke_frag.glsl
- shaders/gpu_shader_smoke_vert.glsl
GPU_attr_binding.h
GPU_batch.h
@@ -239,9 +236,6 @@ data_to_c_simple(shaders/gpu_shader_keyframe_diamond_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_keyframe_diamond_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_geometry.glsl SRC)
-data_to_c_simple(shaders/gpu_shader_fire_frag.glsl SRC)
-data_to_c_simple(shaders/gpu_shader_smoke_frag.glsl SRC)
-data_to_c_simple(shaders/gpu_shader_smoke_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_material.glsl SRC)
data_to_c_simple(shaders/gpu_shader_gpencil_stroke_vert.glsl SRC)
diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index 028756bc739..008f4199b02 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -103,6 +103,7 @@ void GPU_free_images_old(struct Main *bmain);
void GPU_free_smoke(struct SmokeModifierData *smd);
void GPU_free_smoke_velocity(struct SmokeModifierData *smd);
void GPU_create_smoke(struct SmokeModifierData *smd, int highres);
+void GPU_create_smoke_coba_field(struct SmokeModifierData *smd);
void GPU_create_smoke_velocity(struct SmokeModifierData *smd);
/* Delayed free of OpenGL buffers by main thread */
diff --git a/source/blender/gpu/GPU_immediate.h b/source/blender/gpu/GPU_immediate.h
index c8a4ea6a837..846adc44cee 100644
--- a/source/blender/gpu/GPU_immediate.h
+++ b/source/blender/gpu/GPU_immediate.h
@@ -57,46 +57,46 @@ GPUBatch *immBeginBatchAtMost(GPUPrimType, uint vertex_len);
/* Provide attribute values that can change per vertex. */
/* First vertex after immBegin must have all its attributes specified. */
-/* Skipped attributes will continue using the previous value for that attrib_id. */
-void immAttrib1f(uint attrib_id, float x);
-void immAttrib2f(uint attrib_id, float x, float y);
-void immAttrib3f(uint attrib_id, float x, float y, float z);
-void immAttrib4f(uint attrib_id, float x, float y, float z, float w);
+/* Skipped attributes will continue using the previous value for that attr_id. */
+void immAttr1f(uint attr_id, float x);
+void immAttr2f(uint attr_id, float x, float y);
+void immAttr3f(uint attr_id, float x, float y, float z);
+void immAttr4f(uint attr_id, float x, float y, float z, float w);
-void immAttrib2i(uint attrib_id, int x, int y);
+void immAttr2i(uint attr_id, int x, int y);
-void immAttrib1u(uint attrib_id, uint x);
+void immAttr1u(uint attr_id, uint x);
-void immAttrib2s(uint attrib_id, short x, short y);
+void immAttr2s(uint attr_id, short x, short y);
-void immAttrib2fv(uint attrib_id, const float data[2]);
-void immAttrib3fv(uint attrib_id, const float data[3]);
-void immAttrib4fv(uint attrib_id, const float data[4]);
+void immAttr2fv(uint attr_id, const float data[2]);
+void immAttr3fv(uint attr_id, const float data[3]);
+void immAttr4fv(uint attr_id, const float data[4]);
-void immAttrib3ub(uint attrib_id, unsigned char r, unsigned char g, unsigned char b);
-void immAttrib4ub(uint attrib_id, unsigned char r, unsigned char g, unsigned char b, unsigned char a);
+void immAttr3ub(uint attr_id, unsigned char r, unsigned char g, unsigned char b);
+void immAttr4ub(uint attr_id, unsigned char r, unsigned char g, unsigned char b, unsigned char a);
-void immAttrib3ubv(uint attrib_id, const unsigned char data[4]);
-void immAttrib4ubv(uint attrib_id, const unsigned char data[4]);
+void immAttr3ubv(uint attr_id, const unsigned char data[4]);
+void immAttr4ubv(uint attr_id, const unsigned char data[4]);
/* Explicitly skip an attribute. */
-/* This advanced option kills automatic value copying for this attrib_id. */
-void immSkipAttrib(uint attrib_id);
+/* This advanced option kills automatic value copying for this attr_id. */
+void immAttrSkip(uint attr_id);
/* Provide one last attribute value & end the current vertex. */
/* This is most often used for 2D or 3D position (similar to glVertex). */
-void immVertex2f(uint attrib_id, float x, float y);
-void immVertex3f(uint attrib_id, float x, float y, float z);
-void immVertex4f(uint attrib_id, float x, float y, float z, float w);
+void immVertex2f(uint attr_id, float x, float y);
+void immVertex3f(uint attr_id, float x, float y, float z);
+void immVertex4f(uint attr_id, float x, float y, float z, float w);
-void immVertex2i(uint attrib_id, int x, int y);
+void immVertex2i(uint attr_id, int x, int y);
-void immVertex2s(uint attrib_id, short x, short y);
+void immVertex2s(uint attr_id, short x, short y);
-void immVertex2fv(uint attrib_id, const float data[2]);
-void immVertex3fv(uint attrib_id, const float data[3]);
+void immVertex2fv(uint attr_id, const float data[2]);
+void immVertex3fv(uint attr_id, const float data[3]);
-void immVertex2iv(uint attrib_id, const int data[2]);
+void immVertex2iv(uint attr_id, const int data[2]);
/* Provide uniform values that don't change for the entire draw call. */
void immUniform1i(const char *name, int x);
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index b53e6f108e7..308205339db 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -101,11 +101,6 @@ int GPU_shader_get_attribute(GPUShader *shader, const char *name);
/* Builtin/Non-generated shaders */
typedef enum GPUBuiltinShader {
- /* UNUSED (TODO REMOVE) */
- GPU_SHADER_SMOKE,
- GPU_SHADER_SMOKE_FIRE,
- GPU_SHADER_SMOKE_COBA,
-
/* specialized drawing */
GPU_SHADER_TEXT,
GPU_SHADER_TEXT_SIMPLE,
diff --git a/source/blender/gpu/GPU_shader_interface.h b/source/blender/gpu/GPU_shader_interface.h
index 458a49a366b..af89e487cf8 100644
--- a/source/blender/gpu/GPU_shader_interface.h
+++ b/source/blender/gpu/GPU_shader_interface.h
@@ -58,6 +58,7 @@ typedef enum {
GPU_UNIFORM_COLOR, /* vec4 color */
GPU_UNIFORM_EYE, /* vec3 eye */
GPU_UNIFORM_CALLID, /* int callId */
+ GPU_UNIFORM_OBJECT_INFO, /* vec3 objectInfo */
GPU_UNIFORM_CUSTOM, /* custom uniform, not one of the above built-ins */
diff --git a/source/blender/gpu/GPU_vertex_format.h b/source/blender/gpu/GPU_vertex_format.h
index 5e7e036bf41..113a3e894d0 100644
--- a/source/blender/gpu/GPU_vertex_format.h
+++ b/source/blender/gpu/GPU_vertex_format.h
@@ -80,8 +80,11 @@ typedef struct GPUVertFormat {
GPUVertAttr attribs[GPU_VERT_ATTR_MAX_LEN]; /* TODO: variable-size attribs array */
} GPUVertFormat;
+struct GPUShaderInterface;
+
void GPU_vertformat_clear(GPUVertFormat *);
void GPU_vertformat_copy(GPUVertFormat *dest, const GPUVertFormat *src);
+void GPU_vertformat_from_interface(GPUVertFormat *format, const struct GPUShaderInterface *shaderface);
uint GPU_vertformat_attr_add(
GPUVertFormat *, const char *name,
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index c1e6b9b53a0..808cb985bf5 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -759,7 +759,7 @@ static void codegen_call_functions(DynStr *ds, ListBase *nodes, GPUOutput *final
BLI_dynstr_append(ds, ";\n");
}
-static char *code_generate_fragment(GPUMaterial *material, ListBase *nodes, GPUOutput *output)
+static char *code_generate_fragment(GPUMaterial *material, ListBase *nodes, GPUOutput *output, int *rbuiltins)
{
DynStr *ds = BLI_dynstr_new();
char *code;
@@ -770,14 +770,13 @@ static char *code_generate_fragment(GPUMaterial *material, ListBase *nodes, GPUO
#endif
codegen_set_unique_ids(nodes);
- builtins = codegen_process_uniforms_functions(material, ds, nodes);
-
+ *rbuiltins = builtins = codegen_process_uniforms_functions(material, ds, nodes);
if (builtins & GPU_BARYCENTRIC_TEXCO)
- BLI_dynstr_append(ds, "\tin vec2 barycentricTexCo;\n");
+ BLI_dynstr_append(ds, "in vec2 barycentricTexCo;\n");
if (builtins & GPU_BARYCENTRIC_DIST)
- BLI_dynstr_append(ds, "\tflat in vec3 barycentricDist;\n");
+ BLI_dynstr_append(ds, "flat in vec3 barycentricDist;\n");
BLI_dynstr_append(ds, "Closure nodetree_exec(void)\n{\n");
@@ -1790,6 +1789,7 @@ GPUPass *GPU_generate_pass(
GPUNodeLink *frag_outlink,
struct GPUVertexAttribs *attribs,
ListBase *nodes,
+ int *builtins,
const char *vert_code,
const char *geom_code,
const char *frag_lib,
@@ -1804,7 +1804,7 @@ GPUPass *GPU_generate_pass(
GPU_nodes_get_vertex_attributes(nodes, attribs);
/* generate code */
- char *fragmentgen = code_generate_fragment(material, nodes, frag_outlink->output);
+ char *fragmentgen = code_generate_fragment(material, nodes, frag_outlink->output, builtins);
/* Cache lookup: Reuse shaders already compiled */
uint32_t hash = gpu_pass_hash(fragmentgen, defines, attribs);
diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h
index 39d946d89a0..96be3a1a422 100644
--- a/source/blender/gpu/intern/gpu_codegen.h
+++ b/source/blender/gpu/intern/gpu_codegen.h
@@ -179,7 +179,7 @@ typedef struct GPUPass GPUPass;
GPUPass *GPU_generate_pass(
GPUMaterial *material,
GPUNodeLink *frag_outlink, struct GPUVertexAttribs *attribs,
- ListBase *nodes,
+ ListBase *nodes, int *builtins,
const char *vert_code, const char *geom_code,
const char *frag_lib, const char *defines);
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index 7902c5296aa..685b929ac93 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -62,7 +62,7 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
-#include "BKE_bmfont.h"
+#include "BKE_colorband.h"
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_main.h"
@@ -883,6 +883,192 @@ void GPU_paint_update_image(Image *ima, ImageUser *iuser, int x, int y, int w, i
BKE_image_release_ibuf(ima, ibuf, NULL);
}
+/* *************************** Transfer functions *************************** */
+
+enum {
+ TFUNC_FLAME_SPECTRUM = 0,
+ TFUNC_COLOR_RAMP = 1,
+};
+
+#define TFUNC_WIDTH 256
+
+#ifdef WITH_SMOKE
+static void create_flame_spectrum_texture(float *data)
+{
+#define FIRE_THRESH 7
+#define MAX_FIRE_ALPHA 0.06f
+#define FULL_ON_FIRE 100
+
+ float *spec_pixels = MEM_mallocN(TFUNC_WIDTH * 4 * 16 * 16 * sizeof(float), "spec_pixels");
+
+ blackbody_temperature_to_rgb_table(data, TFUNC_WIDTH, 1500, 3000);
+
+ for (int i = 0; i < 16; i++) {
+ for (int j = 0; j < 16; j++) {
+ for (int k = 0; k < TFUNC_WIDTH; k++) {
+ int index = (j * TFUNC_WIDTH * 16 + i * TFUNC_WIDTH + k) * 4;
+ if (k >= FIRE_THRESH) {
+ spec_pixels[index] = (data[k * 4]);
+ spec_pixels[index + 1] = (data[k * 4 + 1]);
+ spec_pixels[index + 2] = (data[k * 4 + 2]);
+ spec_pixels[index + 3] = MAX_FIRE_ALPHA * (
+ (k > FULL_ON_FIRE) ? 1.0f : (k - FIRE_THRESH) / ((float)FULL_ON_FIRE - FIRE_THRESH));
+ }
+ else {
+ zero_v4(&spec_pixels[index]);
+ }
+ }
+ }
+ }
+
+ memcpy(data, spec_pixels, sizeof(float) * 4 * TFUNC_WIDTH);
+
+ MEM_freeN(spec_pixels);
+
+#undef FIRE_THRESH
+#undef MAX_FIRE_ALPHA
+#undef FULL_ON_FIRE
+}
+
+static void create_color_ramp(const ColorBand *coba, float *data)
+{
+ for (int i = 0; i < TFUNC_WIDTH; i++) {
+ BKE_colorband_evaluate(coba, (float)i / TFUNC_WIDTH, &data[i * 4]);
+ }
+}
+
+static GPUTexture *create_transfer_function(int type, const ColorBand *coba)
+{
+ float *data = MEM_mallocN(sizeof(float) * 4 * TFUNC_WIDTH, __func__);
+
+ switch (type) {
+ case TFUNC_FLAME_SPECTRUM:
+ create_flame_spectrum_texture(data);
+ break;
+ case TFUNC_COLOR_RAMP:
+ create_color_ramp(coba, data);
+ break;
+ }
+
+ GPUTexture *tex = GPU_texture_create_1D(TFUNC_WIDTH, GPU_RGBA8, data, NULL);
+
+ MEM_freeN(data);
+
+ return tex;
+}
+
+static void swizzle_texture_channel_rrrr(GPUTexture *tex)
+{
+ GPU_texture_bind(tex, 0);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, GL_RED);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, GL_RED);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, GL_RED);
+ GPU_texture_unbind(tex);
+}
+
+static GPUTexture *create_field_texture(SmokeDomainSettings *sds)
+{
+ float *field = NULL;
+
+ switch (sds->coba_field) {
+ case FLUID_FIELD_DENSITY: field = smoke_get_density(sds->fluid); break;
+ case FLUID_FIELD_HEAT: field = smoke_get_heat(sds->fluid); break;
+ case FLUID_FIELD_FUEL: field = smoke_get_fuel(sds->fluid); break;
+ case FLUID_FIELD_REACT: field = smoke_get_react(sds->fluid); break;
+ case FLUID_FIELD_FLAME: field = smoke_get_flame(sds->fluid); break;
+ case FLUID_FIELD_VELOCITY_X: field = smoke_get_velocity_x(sds->fluid); break;
+ case FLUID_FIELD_VELOCITY_Y: field = smoke_get_velocity_y(sds->fluid); break;
+ case FLUID_FIELD_VELOCITY_Z: field = smoke_get_velocity_z(sds->fluid); break;
+ case FLUID_FIELD_COLOR_R: field = smoke_get_color_r(sds->fluid); break;
+ case FLUID_FIELD_COLOR_G: field = smoke_get_color_g(sds->fluid); break;
+ case FLUID_FIELD_COLOR_B: field = smoke_get_color_b(sds->fluid); break;
+ case FLUID_FIELD_FORCE_X: field = smoke_get_force_x(sds->fluid); break;
+ case FLUID_FIELD_FORCE_Y: field = smoke_get_force_y(sds->fluid); break;
+ case FLUID_FIELD_FORCE_Z: field = smoke_get_force_z(sds->fluid); break;
+ default: return NULL;
+ }
+
+ GPUTexture *tex = GPU_texture_create_nD(
+ sds->res[0], sds->res[1], sds->res[2], 3,
+ field, GPU_R8, GPU_DATA_FLOAT, 0, true, NULL);
+
+ swizzle_texture_channel_rrrr(tex);
+ return tex;
+}
+
+static GPUTexture *create_density_texture(SmokeDomainSettings *sds, int highres)
+{
+ float *data = NULL, *source;
+ int cell_count = (highres) ? smoke_turbulence_get_cells(sds->wt) : sds->total_cells;
+ const bool has_color = (highres) ? smoke_turbulence_has_colors(sds->wt) : smoke_has_colors(sds->fluid);
+ int *dim = (highres) ? sds->res_wt : sds->res;
+ GPUTextureFormat format = (has_color) ? GPU_RGBA8 : GPU_R8;
+
+ if (has_color) {
+ data = MEM_callocN(sizeof(float) * cell_count * 4, "smokeColorTexture");
+ }
+
+ if (highres) {
+ if (has_color) {
+ smoke_turbulence_get_rgba(sds->wt, data, 0);
+ }
+ else {
+ source = smoke_turbulence_get_density(sds->wt);
+ }
+ }
+ else {
+ if (has_color) {
+ smoke_get_rgba(sds->fluid, data, 0);
+ }
+ else {
+ source = smoke_get_density(sds->fluid);
+ }
+ }
+
+ GPUTexture *tex = GPU_texture_create_nD(
+ dim[0], dim[1], dim[2], 3,
+ (data) ? data : source,
+ format, GPU_DATA_FLOAT, 0, true, NULL);
+ if (data) {
+ MEM_freeN(data);
+ }
+
+ if (format == GPU_R8) {
+ /* Swizzle the RGBA components to read the Red channel so
+ * that the shader stay the same for colored and non color
+ * density textures. */
+ swizzle_texture_channel_rrrr(tex);
+ }
+ return tex;
+}
+
+static GPUTexture *create_flame_texture(SmokeDomainSettings *sds, int highres)
+{
+ float *source = NULL;
+ const bool has_fuel = (highres) ? smoke_turbulence_has_fuel(sds->wt) : smoke_has_fuel(sds->fluid);
+ int *dim = (highres) ? sds->res_wt : sds->res;
+
+ if (!has_fuel)
+ return NULL;
+
+ if (highres) {
+ source = smoke_turbulence_get_flame(sds->wt);
+ }
+ else {
+ source = smoke_get_flame(sds->fluid);
+ }
+
+ GPUTexture *tex = GPU_texture_create_nD(
+ dim[0], dim[1], dim[2], 3,
+ source, GPU_R8, GPU_DATA_FLOAT, 0, true, NULL);
+
+ swizzle_texture_channel_rrrr(tex);
+
+ return tex;
+}
+#endif /* WITH_SMOKE */
+
void GPU_free_smoke(SmokeModifierData *smd)
{
if (smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain) {
@@ -897,85 +1083,66 @@ void GPU_free_smoke(SmokeModifierData *smd)
if (smd->domain->tex_flame)
GPU_texture_free(smd->domain->tex_flame);
smd->domain->tex_flame = NULL;
+
+ if (smd->domain->tex_flame_coba)
+ GPU_texture_free(smd->domain->tex_flame_coba);
+ smd->domain->tex_flame_coba = NULL;
+
+ if (smd->domain->tex_coba)
+ GPU_texture_free(smd->domain->tex_coba);
+ smd->domain->tex_coba = NULL;
+
+ if (smd->domain->tex_field)
+ GPU_texture_free(smd->domain->tex_field);
+ smd->domain->tex_field = NULL;
}
}
-void GPU_create_smoke(SmokeModifierData *smd, int highres)
+void GPU_create_smoke_coba_field(SmokeModifierData *smd)
{
#ifdef WITH_SMOKE
if (smd->type & MOD_SMOKE_TYPE_DOMAIN) {
SmokeDomainSettings *sds = smd->domain;
- if (!sds->tex && !highres) {
- /* rgba texture for color + density */
- if (smoke_has_colors(sds->fluid)) {
- float *data = MEM_callocN(sizeof(float) * sds->total_cells * 4, "smokeColorTexture");
- smoke_get_rgba(sds->fluid, data, 0);
- sds->tex = GPU_texture_create_3D(sds->res[0], sds->res[1], sds->res[2], GPU_RGBA8, data, NULL);
- MEM_freeN(data);
- }
- /* density only */
- else {
- sds->tex = GPU_texture_create_3D(
- sds->res[0], sds->res[1], sds->res[2],
- GPU_R8, smoke_get_density(sds->fluid), NULL);
-
- /* Swizzle the RGBA components to read the Red channel so
- * that the shader stay the same for colored and non color
- * density textures. */
- GPU_texture_bind(sds->tex, 0);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, GL_RED);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, GL_RED);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, GL_RED);
- GPU_texture_unbind(sds->tex);
- }
- sds->tex_flame = (
- smoke_has_fuel(sds->fluid) ?
- GPU_texture_create_3D(
- sds->res[0], sds->res[1], sds->res[2],
- GPU_R8, smoke_get_flame(sds->fluid), NULL) :
- NULL);
+
+ if (!sds->tex_field) {
+ sds->tex_field = create_field_texture(sds);
}
- else if (!sds->tex && highres) {
- /* rgba texture for color + density */
- if (smoke_turbulence_has_colors(sds->wt)) {
- float *data = MEM_callocN(sizeof(float) * smoke_turbulence_get_cells(sds->wt) * 4, "smokeColorTexture");
- smoke_turbulence_get_rgba(sds->wt, data, 0);
- sds->tex = GPU_texture_create_3D(sds->res_wt[0], sds->res_wt[1], sds->res_wt[2], GPU_RGBA8, data, NULL);
- MEM_freeN(data);
- }
- /* density only */
- else {
- sds->tex = GPU_texture_create_3D(
- sds->res_wt[0], sds->res_wt[1], sds->res_wt[2],
- GPU_R8, smoke_turbulence_get_density(sds->wt), NULL);
-
- /* Swizzle the RGBA components to read the Red channel so
- * that the shader stay the same for colored and non color
- * density textures. */
- GPU_texture_bind(sds->tex, 0);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_R, GL_RED);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_G, GL_RED);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_B, GL_RED);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_SWIZZLE_A, GL_RED);
- GPU_texture_unbind(sds->tex);
- }
- sds->tex_flame = (
- smoke_turbulence_has_fuel(sds->wt) ?
- GPU_texture_create_3D(
- sds->res_wt[0], sds->res_wt[1], sds->res_wt[2],
- GPU_R8, smoke_turbulence_get_flame(sds->wt), NULL) :
- NULL);
+ if (!sds->tex_coba) {
+ sds->tex_coba = create_transfer_function(TFUNC_COLOR_RAMP, sds->coba);
}
+ }
+#else // WITH_SMOKE
+ smd->domain->tex_field = NULL;
+#endif // WITH_SMOKE
+}
- sds->tex_shadow = GPU_texture_create_3D(
- sds->res[0], sds->res[1], sds->res[2],
- GPU_R8, sds->shadow, NULL);
+void GPU_create_smoke(SmokeModifierData *smd, int highres)
+{
+#ifdef WITH_SMOKE
+ if (smd->type & MOD_SMOKE_TYPE_DOMAIN) {
+ SmokeDomainSettings *sds = smd->domain;
+
+ if (!sds->tex) {
+ sds->tex = create_density_texture(sds, highres);
+ }
+ if (!sds->tex_flame) {
+ sds->tex_flame = create_flame_texture(sds, highres);
+ }
+ if (!sds->tex_flame_coba && sds->tex_flame) {
+ sds->tex_flame_coba = create_transfer_function(TFUNC_FLAME_SPECTRUM, NULL);
+ }
+ if (!sds->tex_shadow) {
+ sds->tex_shadow = GPU_texture_create_nD(
+ sds->res[0], sds->res[1], sds->res[2], 3,
+ sds->shadow,
+ GPU_R8, GPU_DATA_FLOAT, 0, true, NULL);
+ }
}
#else // WITH_SMOKE
(void)highres;
smd->domain->tex = NULL;
smd->domain->tex_flame = NULL;
+ smd->domain->tex_flame_coba = NULL;
smd->domain->tex_shadow = NULL;
#endif // WITH_SMOKE
}
diff --git a/source/blender/gpu/intern/gpu_immediate.c b/source/blender/gpu/intern/gpu_immediate.c
index 6e3de51df6b..a71ba68821b 100644
--- a/source/blender/gpu/intern/gpu_immediate.c
+++ b/source/blender/gpu/intern/gpu_immediate.c
@@ -412,56 +412,56 @@ static void setAttribValueBit(uint attrib_id)
/* --- generic attribute functions --- */
-void immAttrib1f(uint attrib_id, float x)
+void immAttr1f(uint attrib_id, float x)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_F32);
- assert(attrib->comp_len == 1);
+ assert(attr->comp_type == GPU_COMP_F32);
+ assert(attr->comp_len == 1);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- float *data = (float *)(imm.vertex_data + attrib->offset);
+ float *data = (float *)(imm.vertex_data + attr->offset);
/* printf("%s %td %p\n", __FUNCTION__, (GLubyte*)data - imm.buffer_data, data); */
data[0] = x;
}
-void immAttrib2f(uint attrib_id, float x, float y)
+void immAttr2f(uint attrib_id, float x, float y)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_F32);
- assert(attrib->comp_len == 2);
+ assert(attr->comp_type == GPU_COMP_F32);
+ assert(attr->comp_len == 2);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- float *data = (float *)(imm.vertex_data + attrib->offset);
+ float *data = (float *)(imm.vertex_data + attr->offset);
/* printf("%s %td %p\n", __FUNCTION__, (GLubyte*)data - imm.buffer_data, data); */
data[0] = x;
data[1] = y;
}
-void immAttrib3f(uint attrib_id, float x, float y, float z)
+void immAttr3f(uint attrib_id, float x, float y, float z)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_F32);
- assert(attrib->comp_len == 3);
+ assert(attr->comp_type == GPU_COMP_F32);
+ assert(attr->comp_len == 3);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- float *data = (float *)(imm.vertex_data + attrib->offset);
+ float *data = (float *)(imm.vertex_data + attr->offset);
/* printf("%s %td %p\n", __FUNCTION__, (GLubyte*)data - imm.buffer_data, data); */
data[0] = x;
@@ -469,19 +469,19 @@ void immAttrib3f(uint attrib_id, float x, float y, float z)
data[2] = z;
}
-void immAttrib4f(uint attrib_id, float x, float y, float z, float w)
+void immAttr4f(uint attrib_id, float x, float y, float z, float w)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_F32);
- assert(attrib->comp_len == 4);
+ assert(attr->comp_type == GPU_COMP_F32);
+ assert(attr->comp_len == 4);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- float *data = (float *)(imm.vertex_data + attrib->offset);
+ float *data = (float *)(imm.vertex_data + attr->offset);
/* printf("%s %td %p\n", __FUNCTION__, (GLubyte*)data - imm.buffer_data, data); */
data[0] = x;
@@ -490,87 +490,87 @@ void immAttrib4f(uint attrib_id, float x, float y, float z, float w)
data[3] = w;
}
-void immAttrib1u(uint attrib_id, uint x)
+void immAttr1u(uint attrib_id, uint x)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_U32);
- assert(attrib->comp_len == 1);
+ assert(attr->comp_type == GPU_COMP_U32);
+ assert(attr->comp_len == 1);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- uint *data = (uint *)(imm.vertex_data + attrib->offset);
+ uint *data = (uint *)(imm.vertex_data + attr->offset);
data[0] = x;
}
-void immAttrib2i(uint attrib_id, int x, int y)
+void immAttr2i(uint attrib_id, int x, int y)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_I32);
- assert(attrib->comp_len == 2);
+ assert(attr->comp_type == GPU_COMP_I32);
+ assert(attr->comp_len == 2);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- int *data = (int *)(imm.vertex_data + attrib->offset);
+ int *data = (int *)(imm.vertex_data + attr->offset);
data[0] = x;
data[1] = y;
}
-void immAttrib2s(uint attrib_id, short x, short y)
+void immAttr2s(uint attrib_id, short x, short y)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_I16);
- assert(attrib->comp_len == 2);
+ assert(attr->comp_type == GPU_COMP_I16);
+ assert(attr->comp_len == 2);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- short *data = (short *)(imm.vertex_data + attrib->offset);
+ short *data = (short *)(imm.vertex_data + attr->offset);
data[0] = x;
data[1] = y;
}
-void immAttrib2fv(uint attrib_id, const float data[2])
+void immAttr2fv(uint attrib_id, const float data[2])
{
- immAttrib2f(attrib_id, data[0], data[1]);
+ immAttr2f(attrib_id, data[0], data[1]);
}
-void immAttrib3fv(uint attrib_id, const float data[3])
+void immAttr3fv(uint attrib_id, const float data[3])
{
- immAttrib3f(attrib_id, data[0], data[1], data[2]);
+ immAttr3f(attrib_id, data[0], data[1], data[2]);
}
-void immAttrib4fv(uint attrib_id, const float data[4])
+void immAttr4fv(uint attrib_id, const float data[4])
{
- immAttrib4f(attrib_id, data[0], data[1], data[2], data[3]);
+ immAttr4f(attrib_id, data[0], data[1], data[2], data[3]);
}
-void immAttrib3ub(uint attrib_id, uchar r, uchar g, uchar b)
+void immAttr3ub(uint attrib_id, uchar r, uchar g, uchar b)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_U8);
- assert(attrib->comp_len == 3);
+ assert(attr->comp_type == GPU_COMP_U8);
+ assert(attr->comp_len == 3);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- GLubyte *data = imm.vertex_data + attrib->offset;
+ GLubyte *data = imm.vertex_data + attr->offset;
/* printf("%s %td %p\n", __FUNCTION__, data - imm.buffer_data, data); */
data[0] = r;
@@ -578,19 +578,19 @@ void immAttrib3ub(uint attrib_id, uchar r, uchar g, uchar b)
data[2] = b;
}
-void immAttrib4ub(uint attrib_id, uchar r, uchar g, uchar b, uchar a)
+void immAttr4ub(uint attrib_id, uchar r, uchar g, uchar b, uchar a)
{
- GPUVertAttr *attrib = imm.vertex_format.attribs + attrib_id;
+ GPUVertAttr *attr = imm.vertex_format.attribs + attrib_id;
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
- assert(attrib->comp_type == GPU_COMP_U8);
- assert(attrib->comp_len == 4);
+ assert(attr->comp_type == GPU_COMP_U8);
+ assert(attr->comp_len == 4);
assert(imm.vertex_idx < imm.vertex_len);
assert(imm.prim_type != GPU_PRIM_NONE); /* make sure we're between a Begin/End pair */
#endif
setAttribValueBit(attrib_id);
- GLubyte *data = imm.vertex_data + attrib->offset;
+ GLubyte *data = imm.vertex_data + attr->offset;
/* printf("%s %td %p\n", __FUNCTION__, data - imm.buffer_data, data); */
data[0] = r;
@@ -599,17 +599,17 @@ void immAttrib4ub(uint attrib_id, uchar r, uchar g, uchar b, uchar a)
data[3] = a;
}
-void immAttrib3ubv(uint attrib_id, const uchar data[3])
+void immAttr3ubv(uint attrib_id, const uchar data[3])
{
- immAttrib3ub(attrib_id, data[0], data[1], data[2]);
+ immAttr3ub(attrib_id, data[0], data[1], data[2]);
}
-void immAttrib4ubv(uint attrib_id, const uchar data[4])
+void immAttr4ubv(uint attrib_id, const uchar data[4])
{
- immAttrib4ub(attrib_id, data[0], data[1], data[2], data[3]);
+ immAttr4ub(attrib_id, data[0], data[1], data[2], data[3]);
}
-void immSkipAttrib(uint attrib_id)
+void immAttrSkip(uint attrib_id)
{
#if TRUST_NO_ONE
assert(attrib_id < imm.vertex_format.attr_len);
@@ -652,49 +652,49 @@ static void immEndVertex(void) /* and move on to the next vertex */
void immVertex2f(uint attrib_id, float x, float y)
{
- immAttrib2f(attrib_id, x, y);
+ immAttr2f(attrib_id, x, y);
immEndVertex();
}
void immVertex3f(uint attrib_id, float x, float y, float z)
{
- immAttrib3f(attrib_id, x, y, z);
+ immAttr3f(attrib_id, x, y, z);
immEndVertex();
}
void immVertex4f(uint attrib_id, float x, float y, float z, float w)
{
- immAttrib4f(attrib_id, x, y, z, w);
+ immAttr4f(attrib_id, x, y, z, w);
immEndVertex();
}
void immVertex2i(uint attrib_id, int x, int y)
{
- immAttrib2i(attrib_id, x, y);
+ immAttr2i(attrib_id, x, y);
immEndVertex();
}
void immVertex2s(uint attrib_id, short x, short y)
{
- immAttrib2s(attrib_id, x, y);
+ immAttr2s(attrib_id, x, y);
immEndVertex();
}
void immVertex2fv(uint attrib_id, const float data[2])
{
- immAttrib2f(attrib_id, data[0], data[1]);
+ immAttr2f(attrib_id, data[0], data[1]);
immEndVertex();
}
void immVertex3fv(uint attrib_id, const float data[3])
{
- immAttrib3f(attrib_id, data[0], data[1], data[2]);
+ immAttr3f(attrib_id, data[0], data[1], data[2]);
immEndVertex();
}
void immVertex2iv(uint attrib_id, const int data[2])
{
- immAttrib2i(attrib_id, data[0], data[1]);
+ immAttr2i(attrib_id, data[0], data[1]);
immEndVertex();
}
diff --git a/source/blender/gpu/intern/gpu_immediate_util.c b/source/blender/gpu/intern/gpu_immediate_util.c
index d0f0c3aacce..983c70281a2 100644
--- a/source/blender/gpu/intern/gpu_immediate_util.c
+++ b/source/blender/gpu/intern/gpu_immediate_util.c
@@ -89,35 +89,35 @@ void immRecti(uint pos, int x1, int y1, int x2, int y2)
void immRectf_fast_with_color(uint pos, uint col, float x1, float y1, float x2, float y2, const float color[4])
{
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x1, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x2, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x2, y2);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x1, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x2, y2);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2f(pos, x1, y2);
}
void immRecti_fast_with_color(uint pos, uint col, int x1, int y1, int x2, int y2, const float color[4])
{
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2i(pos, x1, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2i(pos, x2, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2i(pos, x2, y2);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2i(pos, x1, y1);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2i(pos, x2, y2);
- immAttrib4fv(col, color);
+ immAttr4fv(col, color);
immVertex2i(pos, x1, y2);
}
@@ -425,16 +425,16 @@ void imm_draw_cylinder_fill_normal_3d(
n2[0] = cos2; n2[1] = sin2; n2[2] = 1 - n2[2];
/* first tri */
- immAttrib3fv(nor, n2);
+ immAttr3fv(nor, n2);
immVertex3fv(pos, v1);
immVertex3fv(pos, v2);
- immAttrib3fv(nor, n1);
+ immAttr3fv(nor, n1);
immVertex3fv(pos, v3);
/* second tri */
immVertex3fv(pos, v3);
immVertex3fv(pos, v4);
- immAttrib3fv(nor, n2);
+ immAttr3fv(nor, n2);
immVertex3fv(pos, v1);
}
}
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index ac97867f40f..986003c99e6 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -688,6 +688,7 @@ GPUMaterial *GPU_material_from_nodetree(
mat->outlink,
&mat->attribs,
&mat->nodes,
+ &mat->builtins,
vert_code,
geom_code,
frag_lib,
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 274ad1c8c0c..d428e2f9bd9 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -167,10 +167,6 @@ extern char datatoc_gpu_shader_text_simple_geom_glsl[];
extern char datatoc_gpu_shader_keyframe_diamond_vert_glsl[];
extern char datatoc_gpu_shader_keyframe_diamond_frag_glsl[];
-extern char datatoc_gpu_shader_fire_frag_glsl[];
-extern char datatoc_gpu_shader_smoke_vert_glsl[];
-extern char datatoc_gpu_shader_smoke_frag_glsl[];
-
extern char datatoc_gpu_shader_gpencil_stroke_vert_glsl[];
extern char datatoc_gpu_shader_gpencil_stroke_frag_glsl[];
extern char datatoc_gpu_shader_gpencil_stroke_geom_glsl[];
@@ -664,16 +660,6 @@ int GPU_shader_get_attribute(GPUShader *shader, const char *name)
}
static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
- [GPU_SHADER_SMOKE] =
- { datatoc_gpu_shader_smoke_vert_glsl,
- datatoc_gpu_shader_smoke_frag_glsl },
- [GPU_SHADER_SMOKE_FIRE] =
- { datatoc_gpu_shader_smoke_vert_glsl,
- datatoc_gpu_shader_smoke_frag_glsl },
- [GPU_SHADER_SMOKE_COBA] =
- { datatoc_gpu_shader_smoke_vert_glsl,
- datatoc_gpu_shader_smoke_frag_glsl },
-
[GPU_SHADER_TEXT] =
{ datatoc_gpu_shader_text_vert_glsl,
datatoc_gpu_shader_text_frag_glsl,
@@ -997,9 +983,6 @@ static const char *gpu_shader_get_builtin_shader_defines(
case GPU_SHADER_2D_NODELINK_INST:
return "#define USE_INSTANCE\n";
- case GPU_SHADER_SMOKE_COBA:
- return "#define USE_COBA\n";
-
case GPU_SHADER_INSTANCE_VARIYING_ID_VARIYING_SIZE:
case GPU_SHADER_INSTANCE_VARIYING_COLOR_VARIYING_SIZE:
return "#define UNIFORM_SCALE\n";
diff --git a/source/blender/gpu/intern/gpu_shader_interface.c b/source/blender/gpu/intern/gpu_shader_interface.c
index f6bbc228ae9..d46fc979363 100644
--- a/source/blender/gpu/intern/gpu_shader_interface.c
+++ b/source/blender/gpu/intern/gpu_shader_interface.c
@@ -72,6 +72,7 @@ static const char *BuiltinUniform_name(GPUUniformBuiltin u)
[GPU_UNIFORM_COLOR] = "color",
[GPU_UNIFORM_EYE] = "eye",
[GPU_UNIFORM_CALLID] = "callId",
+ [GPU_UNIFORM_OBJECT_INFO] = "unfobjectinfo",
[GPU_UNIFORM_CUSTOM] = NULL,
[GPU_NUM_UNIFORMS] = NULL,
diff --git a/source/blender/gpu/intern/gpu_texture.c b/source/blender/gpu/intern/gpu_texture.c
index abb632ce718..6a8e686afb3 100644
--- a/source/blender/gpu/intern/gpu_texture.c
+++ b/source/blender/gpu/intern/gpu_texture.c
@@ -138,6 +138,7 @@ static int gpu_get_component_count(GPUTextureFormat format)
{
switch (format) {
case GPU_RGBA8:
+ case GPU_RGBA8UI:
case GPU_RGBA16F:
case GPU_RGBA16:
case GPU_RGBA32F:
@@ -183,7 +184,7 @@ static void gpu_validate_data_format(GPUTextureFormat tex_format, GPUDataFormat
}
}
/* Byte formats */
- else if (ELEM(tex_format, GPU_R8, GPU_RG8, GPU_RGBA8)) {
+ else if (ELEM(tex_format, GPU_R8, GPU_RG8, GPU_RGBA8, GPU_RGBA8UI)) {
BLI_assert(ELEM(data_format, GPU_DATA_UNSIGNED_BYTE, GPU_DATA_FLOAT));
}
/* Special case */
@@ -298,6 +299,7 @@ static uint gpu_get_bytesize(GPUTextureFormat data_type)
case GPU_RG16:
case GPU_DEPTH24_STENCIL8:
case GPU_DEPTH_COMPONENT32F:
+ case GPU_RGBA8UI:
case GPU_RGBA8:
case GPU_R11F_G11F_B10F:
case GPU_R32F:
@@ -335,6 +337,7 @@ static GLenum gpu_get_gl_internalformat(GPUTextureFormat format)
case GPU_RG16I: return GL_RG16I;
case GPU_RG16: return GL_RG16;
case GPU_RGBA8: return GL_RGBA8;
+ case GPU_RGBA8UI: return GL_RGBA8UI;
case GPU_R32F: return GL_R32F;
case GPU_R32UI: return GL_R32UI;
case GPU_R32I: return GL_R32I;
diff --git a/source/blender/gpu/intern/gpu_vertex_format.c b/source/blender/gpu/intern/gpu_vertex_format.c
index f1aaa99fbc6..c3de3d52b47 100644
--- a/source/blender/gpu/intern/gpu_vertex_format.c
+++ b/source/blender/gpu/intern/gpu_vertex_format.c
@@ -29,6 +29,8 @@
* GPU vertex format
*/
+#include "GPU_shader_interface.h"
+
#include "GPU_vertex_format.h"
#include "gpu_vertex_format_private.h"
#include <stddef.h>
@@ -278,6 +280,115 @@ void VertexFormat_pack(GPUVertFormat *format)
format->packed = true;
}
+static uint calc_input_component_size(const GPUShaderInput *input)
+{
+ int size = input->size;
+ switch (input->gl_type) {
+ case GL_FLOAT_VEC2:
+ case GL_INT_VEC2:
+ case GL_UNSIGNED_INT_VEC2:
+ return size * 2;
+ case GL_FLOAT_VEC3:
+ case GL_INT_VEC3:
+ case GL_UNSIGNED_INT_VEC3:
+ return size * 3;
+ case GL_FLOAT_VEC4:
+ case GL_FLOAT_MAT2:
+ case GL_INT_VEC4:
+ case GL_UNSIGNED_INT_VEC4:
+ return size * 4;
+ case GL_FLOAT_MAT3:
+ return size * 9;
+ case GL_FLOAT_MAT4:
+ return size * 16;
+ case GL_FLOAT_MAT2x3:
+ case GL_FLOAT_MAT3x2:
+ return size * 6;
+ case GL_FLOAT_MAT2x4:
+ case GL_FLOAT_MAT4x2:
+ return size * 8;
+ case GL_FLOAT_MAT3x4:
+ case GL_FLOAT_MAT4x3:
+ return size * 12;
+ default:
+ return size;
+ }
+}
+
+static void get_fetch_mode_and_comp_type(
+ int gl_type,
+ GPUVertCompType *r_comp_type,
+ uint *r_gl_comp_type,
+ GPUVertFetchMode *r_fetch_mode)
+{
+ switch (gl_type) {
+ case GL_FLOAT:
+ case GL_FLOAT_VEC2:
+ case GL_FLOAT_VEC3:
+ case GL_FLOAT_VEC4:
+ case GL_FLOAT_MAT2:
+ case GL_FLOAT_MAT3:
+ case GL_FLOAT_MAT4:
+ case GL_FLOAT_MAT2x3:
+ case GL_FLOAT_MAT2x4:
+ case GL_FLOAT_MAT3x2:
+ case GL_FLOAT_MAT3x4:
+ case GL_FLOAT_MAT4x2:
+ case GL_FLOAT_MAT4x3:
+ *r_comp_type = GPU_COMP_F32;
+ *r_gl_comp_type = GL_FLOAT;
+ *r_fetch_mode = GPU_FETCH_FLOAT;
+ break;
+ case GL_INT:
+ case GL_INT_VEC2:
+ case GL_INT_VEC3:
+ case GL_INT_VEC4:
+ *r_comp_type = GPU_COMP_I32;
+ *r_gl_comp_type = GL_INT;
+ *r_fetch_mode = GPU_FETCH_INT;
+ break;
+ case GL_UNSIGNED_INT:
+ case GL_UNSIGNED_INT_VEC2:
+ case GL_UNSIGNED_INT_VEC3:
+ case GL_UNSIGNED_INT_VEC4:
+ *r_comp_type = GPU_COMP_U32;
+ *r_gl_comp_type = GL_UNSIGNED_INT;
+ *r_fetch_mode = GPU_FETCH_INT;
+ break;
+ default:
+ BLI_assert(0);
+ }
+}
+
+void GPU_vertformat_from_interface(GPUVertFormat *format, const GPUShaderInterface *shaderface)
+{
+ const char *name_buffer = shaderface->name_buffer;
+
+ for (int i = 0; i < GPU_NUM_SHADERINTERFACE_BUCKETS; i++) {
+ const GPUShaderInput *input = shaderface->attrib_buckets[i];
+ if (input == NULL) {
+ continue;
+ }
+
+ const GPUShaderInput *next = input;
+ while (next != NULL) {
+ input = next;
+ next = input->next;
+
+ format->name_len++; /* multiname support */
+ format->attr_len++;
+
+ GPUVertAttr *attrib = format->attribs + input->location;
+
+ attrib->name[attrib->name_len++] = copy_attrib_name(format, name_buffer + input->name_offset);
+ attrib->offset = 0; /* offsets & stride are calculated later (during pack) */
+ attrib->comp_len = calc_input_component_size(input);
+ attrib->sz = attrib->comp_len * 4;
+ get_fetch_mode_and_comp_type(input->gl_type, &attrib->comp_type, &attrib->gl_comp_type, &attrib->fetch_mode);
+ }
+ }
+}
+
/* OpenGL ES packs in a different order as desktop GL but component conversion is the same.
* Of the code here, only struct GPUPackedNormal needs to change. */
diff --git a/source/blender/gpu/shaders/gpu_shader_fire_frag.glsl b/source/blender/gpu/shaders/gpu_shader_fire_frag.glsl
deleted file mode 100644
index fc9cafb6b02..00000000000
--- a/source/blender/gpu/shaders/gpu_shader_fire_frag.glsl
+++ /dev/null
@@ -1,15 +0,0 @@
-
-in vec3 coords;
-out vec4 fragColor;
-
-uniform sampler3D flame_texture;
-uniform sampler1D spectrum_texture;
-
-void main()
-{
- float flame = texture(flame_texture, coords).r;
- vec4 emission = texture(spectrum_texture, flame);
-
- fragColor.rgb = emission.a * emission.rgb;
- fragColor.a = emission.a;
-}
diff --git a/source/blender/gpu/shaders/gpu_shader_smoke_frag.glsl b/source/blender/gpu/shaders/gpu_shader_smoke_frag.glsl
deleted file mode 100644
index b57bd5b6a37..00000000000
--- a/source/blender/gpu/shaders/gpu_shader_smoke_frag.glsl
+++ /dev/null
@@ -1,47 +0,0 @@
-
-in vec3 coords;
-out vec4 fragColor;
-
-uniform vec3 active_color;
-uniform float step_size;
-uniform float density_scale;
-
-uniform sampler3D soot_texture;
-uniform sampler3D shadow_texture;
-
-#ifdef USE_COBA
-uniform sampler1D transfer_texture;
-uniform sampler3D color_band_texture;
-#endif
-
-void main()
-{
- /* compute color and density from volume texture */
- vec4 soot = texture(soot_texture, coords);
-
-#ifndef USE_COBA
- vec3 soot_color;
- if (soot.a != 0) {
- soot_color = active_color * soot.rgb / soot.a;
- }
- else {
- soot_color = vec3(0);
- }
- float soot_density = density_scale * soot.a;
-
- /* compute transmittance and alpha */
- float soot_transmittance = pow(2.71828182846, -soot_density * step_size);
- float soot_alpha = 1.0 - soot_transmittance;
-
- /* shade */
- float shadow = texture(shadow_texture, coords).r;
- soot_color *= soot_transmittance * shadow;
-
- /* premultiply alpha */
- fragColor = vec4(soot_alpha * soot_color, soot_alpha);
-#else
- float color_band = texture(color_band_texture, coords).r;
- vec4 transfer_function = texture(transfer_texture, color_band);
- fragColor = transfer_function * density_scale;
-#endif
-}
diff --git a/source/blender/gpu/shaders/gpu_shader_smoke_vert.glsl b/source/blender/gpu/shaders/gpu_shader_smoke_vert.glsl
deleted file mode 100644
index 8c30e9baf9e..00000000000
--- a/source/blender/gpu/shaders/gpu_shader_smoke_vert.glsl
+++ /dev/null
@@ -1,15 +0,0 @@
-
-uniform mat4 ModelViewProjectionMatrix;
-
-out vec3 coords;
-
-uniform vec3 min_location;
-uniform vec3 invsize;
-uniform vec3 ob_sizei;
-
-void main()
-{
- // TODO: swap gl_Vertex for vec3 pos, update smoke setup code
- gl_Position = ModelViewProjectionMatrix * vec4(gl_Vertex.xyz * ob_sizei, 1.0);
- coords = (gl_Vertex.xyz - min_location) * invsize;
-}
diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h
index 210fd6e86f5..d407845e45d 100644
--- a/source/blender/imbuf/IMB_imbuf_types.h
+++ b/source/blender/imbuf/IMB_imbuf_types.h
@@ -222,12 +222,10 @@ typedef struct ImBuf {
struct DDSData dds_data;
} ImBuf;
-/* Moved from BKE_bmfont_types.h because it is a userflag bit mask. */
/**
* \brief userflags: Flags used internally by blender for imagebuffers
*/
-#define IB_BITMAPFONT (1 << 0) /* this image is a font */
#define IB_BITMAPDIRTY (1 << 1) /* image needs to be saved is not the same as filename */
#define IB_MIPMAP_INVALID (1 << 2) /* image mipmaps are invalid, need recreate */
#define IB_RECT_INVALID (1 << 3) /* float buffer changed, needs recreation of byte rect */
diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c
index 58554693aeb..f7005d7ee89 100644
--- a/source/blender/imbuf/intern/allocimbuf.c
+++ b/source/blender/imbuf/intern/allocimbuf.c
@@ -155,13 +155,6 @@ void imb_freetilesImBuf(ImBuf *ibuf)
ibuf->mall &= ~IB_tiles;
}
-static void imb_free_bitmap_font(ImBuf *ibuf)
-{
- if (ibuf->userdata && (ibuf->userflags & IB_BITMAPFONT)) {
- MEM_freeN(ibuf->userdata);
- }
-}
-
static void freeencodedbufferImBuf(ImBuf *ibuf)
{
if (ibuf == NULL) return;
@@ -215,7 +208,6 @@ void IMB_freeImBuf(ImBuf *ibuf)
imb_freerectImBuf(ibuf);
imb_freerectfloatImBuf(ibuf);
imb_freetilesImBuf(ibuf);
- imb_free_bitmap_font(ibuf);
IMB_freezbufImBuf(ibuf);
IMB_freezbuffloatImBuf(ibuf);
freeencodedbufferImBuf(ibuf);
diff --git a/source/blender/imbuf/intern/dds/BlockDXT.cpp b/source/blender/imbuf/intern/dds/BlockDXT.cpp
index 7273ec1659c..0887576eedf 100644
--- a/source/blender/imbuf/intern/dds/BlockDXT.cpp
+++ b/source/blender/imbuf/intern/dds/BlockDXT.cpp
@@ -430,7 +430,7 @@ void AlphaBlockDXT5::decodeBlock(ColorBlock *block) const
void AlphaBlockDXT5::flip4()
{
- uint64 * b = (uint64 *)this;
+ uint64 *b = (uint64 *)this;
// @@ The masks might have to be byte swapped.
uint64 tmp = (*b & (uint64)(0x000000000000FFFFLL));
@@ -444,7 +444,7 @@ void AlphaBlockDXT5::flip4()
void AlphaBlockDXT5::flip2()
{
- uint * b = (uint *)this;
+ uint *b = (uint *)this;
// @@ The masks might have to be byte swapped.
uint tmp = (*b & 0xFF000000);
diff --git a/source/blender/imbuf/intern/dds/ColorBlock.h b/source/blender/imbuf/intern/dds/ColorBlock.h
index 7b5291cf976..67c0b64d53e 100644
--- a/source/blender/imbuf/intern/dds/ColorBlock.h
+++ b/source/blender/imbuf/intern/dds/ColorBlock.h
@@ -45,9 +45,9 @@ struct ColorBlock {
ColorBlock();
ColorBlock(const uint * linearImage);
ColorBlock(const ColorBlock & block);
- ColorBlock(const Image * img, uint x, uint y);
+ ColorBlock(const Image *img, uint x, uint y);
- void init(const Image * img, uint x, uint y);
+ void init(const Image *img, uint x, uint y);
void init(uint w, uint h, const uint * data, uint x, uint y);
void init(uint w, uint h, const float * data, uint x, uint y);
diff --git a/source/blender/imbuf/intern/dds/Image.cpp b/source/blender/imbuf/intern/dds/Image.cpp
index fd3ca1c35e6..2e9ae9da388 100644
--- a/source/blender/imbuf/intern/dds/Image.cpp
+++ b/source/blender/imbuf/intern/dds/Image.cpp
@@ -82,7 +82,7 @@ const Color32 * Image::scanline(uint h) const
return m_data + h * m_width;
}
-Color32 * Image::scanline(uint h)
+Color32 *Image::scanline(uint h)
{
if (h >= m_height) {
printf("DDS: scanline beyond dimensions of image\n");
@@ -91,12 +91,12 @@ Color32 * Image::scanline(uint h)
return m_data + h * m_width;
}
-const Color32 * Image::pixels() const
+const Color32 *Image::pixels() const
{
return m_data;
}
-Color32 * Image::pixels()
+Color32 *Image::pixels()
{
return m_data;
}
diff --git a/source/blender/imbuf/intern/dds/Image.h b/source/blender/imbuf/intern/dds/Image.h
index bb74a9d5d15..9a8bacd93a3 100644
--- a/source/blender/imbuf/intern/dds/Image.h
+++ b/source/blender/imbuf/intern/dds/Image.h
@@ -65,11 +65,11 @@ public:
uint width() const;
uint height() const;
- const Color32 * scanline(uint h) const;
- Color32 * scanline(uint h);
+ const Color32 *scanline(uint h) const;
+ Color32 *scanline(uint h);
- const Color32 * pixels() const;
- Color32 * pixels();
+ const Color32 *pixels() const;
+ Color32 *pixels();
const Color32 & pixel(uint idx) const;
Color32 & pixel(uint idx);
@@ -87,7 +87,7 @@ private:
uint m_width;
uint m_height;
Format m_format;
- Color32 * m_data;
+ Color32 *m_data;
};
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index 2a79880f221..6223e456241 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -328,6 +328,7 @@ typedef struct bGPdata_Runtime {
typedef struct bGPgrid {
float color[3];
float scale[2];
+ float offset[2];
char _pad1[4];
int lines;
@@ -442,6 +443,8 @@ typedef enum eGPdata_Flag {
GP_DATA_STROKE_FORCE_RECALC = (1 << 17),
/* Special mode drawing polygons */
GP_DATA_STROKE_POLYGON = (1 << 18),
+ /* Use adaptative UV scales */
+ GP_DATA_UV_ADAPTATIVE = (1 << 19),
} eGPdata_Flag;
/* gpd->onion_flag */
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index 656f9fa3034..c591b57002a 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -100,8 +100,14 @@ typedef struct Mesh_Runtime {
/** 'BVHCache', for 'BKE_bvhutil.c' */
struct LinkNode *bvh_cache;
- int deformed_only; /* set by modifier stack if only deformed from original */
- char padding[4];
+ /** Set by modifier stack if only deformed from original. */
+ char deformed_only;
+ /**
+ * Copied from edit-mesh (hint, draw with editmesh data).
+ * In the future we may leave the mesh-data empty
+ * since its not needed if we can use edit-mesh data. */
+ char is_original;
+ char padding[6];
} Mesh_Runtime;
typedef struct Mesh {
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h
index 0b24c1cfb67..636377ffd36 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -174,8 +174,6 @@ typedef struct MLoop {
*
* \note A #MLoopTri may be in the middle of an ngon and not reference **any** edges.
*/
-#
-#
typedef struct MLoopTri {
unsigned int tri[3];
unsigned int poly;
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index e17c7e17450..9a57f1ae37b 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -455,6 +455,7 @@ enum {
/* uiList filter orderby type */
enum {
UILST_FLT_SORT_ALPHA = 1 << 0,
+ UILST_FLT_FORCED_REVERSE = 1 << 1, /* Special flag to indicate reverse was set by external parameter */
UILST_FLT_SORT_REVERSE = 1u << 31 /* Special value, bitflag used to reverse order! */
};
diff --git a/source/blender/makesdna/DNA_shader_fx_types.h b/source/blender/makesdna/DNA_shader_fx_types.h
index 3884f72fb56..7c138f21887 100644
--- a/source/blender/makesdna/DNA_shader_fx_types.h
+++ b/source/blender/makesdna/DNA_shader_fx_types.h
@@ -45,6 +45,7 @@ typedef enum ShaderFxType {
eShaderFxType_Rim = 7,
eShaderFxType_Colorize = 8,
eShaderFxType_Shadow = 9,
+ eShaderFxType_Glow = 10,
NUM_SHADER_FX_TYPES
} ShaderFxType;
@@ -127,6 +128,27 @@ typedef enum eFlipShaderFx_Flag {
FX_FLIP_VERTICAL = (1 << 1),
} eFlipShaderFx_Flag;
+typedef struct GlowShaderFxData {
+ ShaderFxData shaderfx;
+ float glow_color[3];
+ float select_color[3];
+ float threshold;
+ int flag; /* flags */
+ int mode;
+ int blur[2];
+ int samples;
+ ShaderFxData_Runtime runtime;
+} GlowShaderFxData;
+
+typedef enum GlowShaderFxModes {
+ eShaderFxGlowMode_Luminance = 0,
+ eShaderFxGlowMode_Color = 1,
+} GlowShaderFxModes;
+
+typedef enum eGlowShaderFx_Flag {
+ FX_GLOW_USE_ALPHA = (1 << 0),
+} eGlowShaderFx_Flag;
+
typedef struct LightShaderFxData {
ShaderFxData shaderfx;
struct Object *object;
diff --git a/source/blender/makesdna/DNA_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h
index cc2f1a8c358..b8ac0de0090 100644
--- a/source/blender/makesdna/DNA_smoke_types.h
+++ b/source/blender/makesdna/DNA_smoke_types.h
@@ -137,6 +137,9 @@ typedef struct SmokeDomainSettings {
struct GPUTexture *tex_wt;
struct GPUTexture *tex_shadow;
struct GPUTexture *tex_flame;
+ struct GPUTexture *tex_flame_coba;
+ struct GPUTexture *tex_coba;
+ struct GPUTexture *tex_field;
struct GPUTexture *tex_velocity_x;
struct GPUTexture *tex_velocity_y;
struct GPUTexture *tex_velocity_z;
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 47402085de1..01ee5c233c7 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -200,7 +200,13 @@ typedef struct ThemeUI {
char gizmo_secondary[4];
char gizmo_a[4];
char gizmo_b[4];
- char pad2[4];
+
+ /* Icon Colors. */
+ char icon_collection[4]; /* Collection items */
+ char icon_object[4]; /* Object items */
+ char icon_object_data[4]; /* Object data items */
+ char icon_modifier[4]; /* Modifier and constraint items */
+ char icon_shading[4]; /* Shading related items */
} ThemeUI;
/* try to put them all in one, if needed a special struct can be created as well
@@ -878,8 +884,9 @@ typedef enum eText_Draw_Options {
/* Grease Pencil Settings.
* UserDef.gp_settings */
typedef enum eGP_UserdefSettings {
- GP_PAINT_DOSMOOTH = (1 << 0),
- GP_PAINT_DOSIMPLIFY = (1 << 1),
+ GP_PAINT_DOSMOOTH = (1 << 0),
+ GP_PAINT_DOSIMPLIFY = (1 << 1),
+ GP_PAINT_REVERSE_LAYERS = (1 << 2),
} eGP_UserdefSettings;
enum {
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 1b8846df4bc..fca1a79c775 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -177,6 +177,10 @@ typedef struct View3DOverlay {
/* Paint mode settings */
int paint_flag;
+ /* Weight paint mode settings */
+ int wpaint_flag;
+ char _pad2[4];
+
/* Alpha for texture, weight, vertex paint overlay */
float texture_paint_mode_opacity;
float vertex_paint_mode_opacity;
@@ -460,6 +464,11 @@ enum {
V3D_OVERLAY_PAINT_WIRE = (1 << 0),
};
+/* View3DOverlay->wpaint_flag */
+enum {
+ V3D_OVERLAY_WPAINT_CONTOURS = (1 << 0),
+};
+
/* View3D->around */
enum {
/* center of the bounding box */
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index ccce54227fe..c1eed8093c8 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -390,7 +390,7 @@ extern StructRNA RNA_MeshLoopColorLayer;
extern StructRNA RNA_MeshDeformModifier;
extern StructRNA RNA_MeshEdge;
extern StructRNA RNA_MeshPolygon;
-extern StructRNA RNA_MeshTessFace;
+extern StructRNA RNA_MeshLoopTriangle;
extern StructRNA RNA_MeshLoop;
extern StructRNA RNA_MeshFloatProperty;
extern StructRNA RNA_MeshFloatPropertyLayer;
@@ -619,6 +619,7 @@ extern StructRNA RNA_ShaderFx;
extern StructRNA RNA_ShaderFxBlur;
extern StructRNA RNA_ShaderFxColorize;
extern StructRNA RNA_ShaderFxFlip;
+extern StructRNA RNA_ShaderFxGlow;
extern StructRNA RNA_ShaderFxLight;
extern StructRNA RNA_ShaderFxPixel;
extern StructRNA RNA_ShaderFxRim;
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index cc1c1bffff2..921a7e3561a 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -83,7 +83,7 @@ const EnumPropertyItem rna_enum_id_type_items[] = {
{ID_TE, "TEXTURE", ICON_TEXTURE_DATA, "Texture", ""},
{ID_WM, "WINDOWMANAGER", ICON_FULLSCREEN, "Window Manager", ""},
{ID_WO, "WORLD", ICON_WORLD_DATA, "World", ""},
- {ID_WS, "WORKSPACE", ICON_SPLITSCREEN, "Workspace", ""},
+ {ID_WS, "WORKSPACE", ICON_WORKSPACE, "Workspace", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -433,7 +433,7 @@ static struct ID *rna_ID_make_local(struct ID *self, Main *bmain, bool clear_pro
}
-static AnimData * rna_ID_animation_data_create(ID *id, Main *bmain)
+static AnimData *rna_ID_animation_data_create(ID *id, Main *bmain)
{
AnimData *adt = BKE_animdata_add_id(id);
DEG_relations_tag_update(bmain);
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index bd0b3e9d760..cb1453fd0bf 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -7075,7 +7075,7 @@ int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *pt
case PROP_COLLECTION:
{
StructRNA *srna = va_arg(args, StructRNA *);
- ListBase **arg = va_arg(args, ListBase * *);
+ ListBase **arg = va_arg(args, ListBase **);
err = rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata,
srna, tid, fid, pid);
break;
diff --git a/source/blender/makesrna/intern/rna_action.c b/source/blender/makesrna/intern/rna_action.c
index 12e28d457fb..fe4c92b9163 100644
--- a/source/blender/makesrna/intern/rna_action.c
+++ b/source/blender/makesrna/intern/rna_action.c
@@ -322,7 +322,7 @@ static void rna_def_dopesheet(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_only_errors", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_ONLY_ERRORS);
RNA_def_property_ui_text(prop, "Show Errors", "Only include F-Curves and drivers that are disabled or have errors");
- RNA_def_property_ui_icon(prop, ICON_HELP, 0); /* XXX: this doesn't quite fit */
+ RNA_def_property_ui_icon(prop, ICON_ERROR, 0);
RNA_def_property_update(prop, NC_ANIMATION | ND_ANIMCHAN | NA_EDITED, NULL);
/* Object Collection Filtering Settings */
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index 5d66742e8a3..665a694653c 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -46,8 +46,8 @@
#include "WM_types.h"
static const EnumPropertyItem prop_direction_items[] = {
- {0, "ADD", ICON_ZOOMIN, "Add", "Add effect of brush"},
- {BRUSH_DIR_IN, "SUBTRACT", ICON_ZOOMOUT, "Subtract", "Subtract effect of brush"},
+ {0, "ADD", ICON_ADD, "Add", "Add effect of brush"},
+ {BRUSH_DIR_IN, "SUBTRACT", ICON_REMOVE, "Subtract", "Subtract effect of brush"},
{0, NULL, 0, NULL, NULL}
};
@@ -589,39 +589,39 @@ static const EnumPropertyItem *rna_Brush_direction_itemf(bContext *C, PointerRNA
/* sculpt mode */
static const EnumPropertyItem prop_flatten_contrast_items[] = {
- {BRUSH_DIR_IN, "CONTRAST", ICON_ZOOMIN, "Contrast", "Subtract effect of brush"},
- {0, "FLATTEN", ICON_ZOOMOUT, "Flatten", "Add effect of brush"},
+ {BRUSH_DIR_IN, "CONTRAST", ICON_ADD, "Contrast", "Subtract effect of brush"},
+ {0, "FLATTEN", ICON_REMOVE, "Flatten", "Add effect of brush"},
{0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem prop_fill_deepen_items[] = {
- {0, "FILL", ICON_ZOOMIN, "Fill", "Add effect of brush"},
- {BRUSH_DIR_IN, "DEEPEN", ICON_ZOOMOUT, "Deepen", "Subtract effect of brush"},
+ {0, "FILL", ICON_ADD, "Fill", "Add effect of brush"},
+ {BRUSH_DIR_IN, "DEEPEN", ICON_REMOVE, "Deepen", "Subtract effect of brush"},
{0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem prop_scrape_peaks_items[] = {
- {0, "SCRAPE", ICON_ZOOMIN, "Scrape", "Add effect of brush"},
- {BRUSH_DIR_IN, "PEAKS", ICON_ZOOMOUT, "Peaks", "Subtract effect of brush"},
+ {0, "SCRAPE", ICON_ADD, "Scrape", "Add effect of brush"},
+ {BRUSH_DIR_IN, "PEAKS", ICON_REMOVE, "Peaks", "Subtract effect of brush"},
{0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem prop_pinch_magnify_items[] = {
- {BRUSH_DIR_IN, "MAGNIFY", ICON_ZOOMIN, "Magnify", "Subtract effect of brush"},
- {0, "PINCH", ICON_ZOOMOUT, "Pinch", "Add effect of brush"},
+ {BRUSH_DIR_IN, "MAGNIFY", ICON_ADD, "Magnify", "Subtract effect of brush"},
+ {0, "PINCH", ICON_REMOVE, "Pinch", "Add effect of brush"},
{0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem prop_inflate_deflate_items[] = {
- {0, "INFLATE", ICON_ZOOMIN, "Inflate", "Add effect of brush"},
- {BRUSH_DIR_IN, "DEFLATE", ICON_ZOOMOUT, "Deflate", "Subtract effect of brush"},
+ {0, "INFLATE", ICON_ADD, "Inflate", "Add effect of brush"},
+ {BRUSH_DIR_IN, "DEFLATE", ICON_REMOVE, "Deflate", "Subtract effect of brush"},
{0, NULL, 0, NULL, NULL}
};
/* texture paint mode */
static const EnumPropertyItem prop_soften_sharpen_items[] = {
- {BRUSH_DIR_IN, "SHARPEN", ICON_ZOOMIN, "Sharpen", "Sharpen effect of brush"},
- {0, "SOFTEN", ICON_ZOOMOUT, "Soften", "Blur effect of brush"},
+ {BRUSH_DIR_IN, "SHARPEN", ICON_ADD, "Sharpen", "Sharpen effect of brush"},
+ {0, "SOFTEN", ICON_REMOVE, "Soften", "Blur effect of brush"},
{0, NULL, 0, NULL, NULL}
};
@@ -710,6 +710,11 @@ static const EnumPropertyItem *rna_Brush_stroke_itemf(bContext *C, PointerRNA *U
}
/* Grease Pencil Drawing Brushes Settings */
+static char *rna_BrushGpencilSettings_path(PointerRNA *UNUSED(ptr))
+{
+ return BLI_strdup("tool_settings.gpencil_paint.brush.gpencil_settings");
+}
+
static void rna_BrushGpencilSettings_default_eraser_update(Main *bmain, Scene *scene, PointerRNA *UNUSED(ptr))
{
ToolSettings *ts = scene->toolsettings;
@@ -967,6 +972,7 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
srna = RNA_def_struct(brna, "BrushGpencilSettings", NULL);
RNA_def_struct_sdna(srna, "BrushGpencilSettings");
+ RNA_def_struct_path_func(srna, "rna_BrushGpencilSettings_path");
RNA_def_struct_ui_text(srna, "Grease Pencil Brush Settings", "Settings for grease pencil brush");
/* grease pencil drawing brushes */
@@ -988,9 +994,10 @@ static void rna_def_gpencil_options(BlenderRNA *brna)
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
/* Strength factor for new strokes */
- prop = RNA_def_property(srna, "pen_strength", PROP_FLOAT, PROP_NONE);
+ prop = RNA_def_property(srna, "pen_strength", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "draw_strength");
RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 3);
RNA_def_property_ui_text(prop, "Strength", "Color strength for new strokes (affect alpha factor of color)");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL);
diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c
index 4cbe365167c..3cf959eaee1 100644
--- a/source/blender/makesrna/intern/rna_color.c
+++ b/source/blender/makesrna/intern/rna_color.c
@@ -1005,7 +1005,7 @@ static void rna_def_histogram(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_line", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", HISTO_FLAG_LINE);
RNA_def_property_ui_text(prop, "Show Line", "Display lines rather than filled shapes");
- RNA_def_property_ui_icon(prop, ICON_IPO, 0);
+ RNA_def_property_ui_icon(prop, ICON_GRAPH, 0);
}
static void rna_def_scopes(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c
index ba87d08fdac..1e7ed90a4a5 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -48,63 +48,63 @@
/* please keep the names in sync with constraint.c */
const EnumPropertyItem rna_enum_constraint_type_items[] = {
{0, "", 0, N_("Motion Tracking"), ""},
- {CONSTRAINT_TYPE_CAMERASOLVER, "CAMERA_SOLVER", ICON_CONSTRAINT_DATA, "Camera Solver", ""},
- {CONSTRAINT_TYPE_FOLLOWTRACK, "FOLLOW_TRACK", ICON_CONSTRAINT_DATA, "Follow Track", ""},
- {CONSTRAINT_TYPE_OBJECTSOLVER, "OBJECT_SOLVER", ICON_CONSTRAINT_DATA, "Object Solver", ""},
+ {CONSTRAINT_TYPE_CAMERASOLVER, "CAMERA_SOLVER", ICON_CONSTRAINT, "Camera Solver", ""},
+ {CONSTRAINT_TYPE_FOLLOWTRACK, "FOLLOW_TRACK", ICON_CONSTRAINT, "Follow Track", ""},
+ {CONSTRAINT_TYPE_OBJECTSOLVER, "OBJECT_SOLVER", ICON_CONSTRAINT, "Object Solver", ""},
{0, "", 0, N_("Transform"), ""},
- {CONSTRAINT_TYPE_LOCLIKE, "COPY_LOCATION", ICON_CONSTRAINT_DATA, "Copy Location",
+ {CONSTRAINT_TYPE_LOCLIKE, "COPY_LOCATION", ICON_CONSTRAINT, "Copy Location",
"Copy the location of a target (with an optional offset), so that they move together"},
- {CONSTRAINT_TYPE_ROTLIKE, "COPY_ROTATION", ICON_CONSTRAINT_DATA, "Copy Rotation",
+ {CONSTRAINT_TYPE_ROTLIKE, "COPY_ROTATION", ICON_CONSTRAINT, "Copy Rotation",
"Copy the rotation of a target (with an optional offset), so that they rotate together"},
- {CONSTRAINT_TYPE_SIZELIKE, "COPY_SCALE", ICON_CONSTRAINT_DATA, "Copy Scale",
+ {CONSTRAINT_TYPE_SIZELIKE, "COPY_SCALE", ICON_CONSTRAINT, "Copy Scale",
"Copy the scale factors of a target (with an optional offset), so that they are scaled by the same amount"},
- {CONSTRAINT_TYPE_TRANSLIKE, "COPY_TRANSFORMS", ICON_CONSTRAINT_DATA, "Copy Transforms",
+ {CONSTRAINT_TYPE_TRANSLIKE, "COPY_TRANSFORMS", ICON_CONSTRAINT, "Copy Transforms",
"Copy all the transformations of a target, so that they move together"},
- {CONSTRAINT_TYPE_DISTLIMIT, "LIMIT_DISTANCE", ICON_CONSTRAINT_DATA, "Limit Distance",
+ {CONSTRAINT_TYPE_DISTLIMIT, "LIMIT_DISTANCE", ICON_CONSTRAINT, "Limit Distance",
"Restrict movements to within a certain distance of a target (at the time of constraint evaluation only)"},
- {CONSTRAINT_TYPE_LOCLIMIT, "LIMIT_LOCATION", ICON_CONSTRAINT_DATA, "Limit Location",
+ {CONSTRAINT_TYPE_LOCLIMIT, "LIMIT_LOCATION", ICON_CONSTRAINT, "Limit Location",
"Restrict movement along each axis within given ranges"},
- {CONSTRAINT_TYPE_ROTLIMIT, "LIMIT_ROTATION", ICON_CONSTRAINT_DATA, "Limit Rotation",
+ {CONSTRAINT_TYPE_ROTLIMIT, "LIMIT_ROTATION", ICON_CONSTRAINT, "Limit Rotation",
"Restrict rotation along each axis within given ranges"},
- {CONSTRAINT_TYPE_SIZELIMIT, "LIMIT_SCALE", ICON_CONSTRAINT_DATA, "Limit Scale",
+ {CONSTRAINT_TYPE_SIZELIMIT, "LIMIT_SCALE", ICON_CONSTRAINT, "Limit Scale",
"Restrict scaling along each axis with given ranges"},
- {CONSTRAINT_TYPE_SAMEVOL, "MAINTAIN_VOLUME", ICON_CONSTRAINT_DATA, "Maintain Volume",
+ {CONSTRAINT_TYPE_SAMEVOL, "MAINTAIN_VOLUME", ICON_CONSTRAINT, "Maintain Volume",
"Compensate for scaling one axis by applying suitable scaling to the other two axes"},
- {CONSTRAINT_TYPE_TRANSFORM, "TRANSFORM", ICON_CONSTRAINT_DATA, "Transformation",
+ {CONSTRAINT_TYPE_TRANSFORM, "TRANSFORM", ICON_CONSTRAINT, "Transformation",
"Use one transform property from target to control another (or same) property on owner"},
- {CONSTRAINT_TYPE_TRANSFORM_CACHE, "TRANSFORM_CACHE", ICON_CONSTRAINT_DATA, "Transform Cache",
+ {CONSTRAINT_TYPE_TRANSFORM_CACHE, "TRANSFORM_CACHE", ICON_CONSTRAINT, "Transform Cache",
"Look up the transformation matrix from an external file"},
{0, "", 0, N_("Tracking"), ""},
- {CONSTRAINT_TYPE_CLAMPTO, "CLAMP_TO", ICON_CONSTRAINT_DATA, "Clamp To",
+ {CONSTRAINT_TYPE_CLAMPTO, "CLAMP_TO", ICON_CONSTRAINT, "Clamp To",
"Restrict movements to lie along a curve by remapping location along curve's longest axis"},
- {CONSTRAINT_TYPE_DAMPTRACK, "DAMPED_TRACK", ICON_CONSTRAINT_DATA, "Damped Track",
+ {CONSTRAINT_TYPE_DAMPTRACK, "DAMPED_TRACK", ICON_CONSTRAINT, "Damped Track",
"Point towards a target by performing the smallest rotation necessary"},
- {CONSTRAINT_TYPE_KINEMATIC, "IK", ICON_CONSTRAINT_DATA, "Inverse Kinematics",
+ {CONSTRAINT_TYPE_KINEMATIC, "IK", ICON_CONSTRAINT, "Inverse Kinematics",
"Control a chain of bones by specifying the endpoint target (Bones only)"},
- {CONSTRAINT_TYPE_LOCKTRACK, "LOCKED_TRACK", ICON_CONSTRAINT_DATA, "Locked Track",
+ {CONSTRAINT_TYPE_LOCKTRACK, "LOCKED_TRACK", ICON_CONSTRAINT, "Locked Track",
"Rotate around the specified ('locked') axis to point towards a target"},
- {CONSTRAINT_TYPE_SPLINEIK, "SPLINE_IK", ICON_CONSTRAINT_DATA, "Spline IK",
+ {CONSTRAINT_TYPE_SPLINEIK, "SPLINE_IK", ICON_CONSTRAINT, "Spline IK",
"Align chain of bones along a curve (Bones only)"},
- {CONSTRAINT_TYPE_STRETCHTO, "STRETCH_TO", ICON_CONSTRAINT_DATA, "Stretch To",
+ {CONSTRAINT_TYPE_STRETCHTO, "STRETCH_TO", ICON_CONSTRAINT, "Stretch To",
"Stretch along Y-Axis to point towards a target"},
- {CONSTRAINT_TYPE_TRACKTO, "TRACK_TO", ICON_CONSTRAINT_DATA, "Track To",
+ {CONSTRAINT_TYPE_TRACKTO, "TRACK_TO", ICON_CONSTRAINT, "Track To",
"Legacy tracking constraint prone to twisting artifacts"},
{0, "", 0, N_("Relationship"), ""},
- {CONSTRAINT_TYPE_ACTION, "ACTION", ICON_CONSTRAINT_DATA, "Action",
+ {CONSTRAINT_TYPE_ACTION, "ACTION", ICON_CONSTRAINT, "Action",
"Use transform property of target to look up pose for owner from an Action"},
- {CONSTRAINT_TYPE_CHILDOF, "CHILD_OF", ICON_CONSTRAINT_DATA, "Child Of",
+ {CONSTRAINT_TYPE_CHILDOF, "CHILD_OF", ICON_CONSTRAINT, "Child Of",
"Make target the 'detachable' parent of owner"},
- {CONSTRAINT_TYPE_MINMAX, "FLOOR", ICON_CONSTRAINT_DATA, "Floor",
+ {CONSTRAINT_TYPE_MINMAX, "FLOOR", ICON_CONSTRAINT, "Floor",
"Use position (and optionally rotation) of target to define a 'wall' or 'floor' that the owner can not cross"},
- {CONSTRAINT_TYPE_FOLLOWPATH, "FOLLOW_PATH", ICON_CONSTRAINT_DATA, "Follow Path",
+ {CONSTRAINT_TYPE_FOLLOWPATH, "FOLLOW_PATH", ICON_CONSTRAINT, "Follow Path",
"Use to animate an object/bone following a path"},
- {CONSTRAINT_TYPE_PIVOT, "PIVOT", ICON_CONSTRAINT_DATA, "Pivot",
+ {CONSTRAINT_TYPE_PIVOT, "PIVOT", ICON_CONSTRAINT, "Pivot",
"Change pivot point for transforms (buggy)"},
/* {CONSTRAINT_TYPE_RIGIDBODYJOINT, "RIGID_BODY_JOINT", ICON_CONSTRAINT_DATA, "Rigid Body Joint",
"Use to define a Rigid Body Constraint (for Game Engine use only)"}, */
/* {CONSTRAINT_TYPE_PYTHON, "SCRIPT", ICON_CONSTRAINT_DATA, "Script",
"Custom constraint(s) written in Python (Not yet implemented)"}, */
- {CONSTRAINT_TYPE_SHRINKWRAP, "SHRINKWRAP", ICON_CONSTRAINT_DATA, "Shrinkwrap",
+ {CONSTRAINT_TYPE_SHRINKWRAP, "SHRINKWRAP", ICON_CONSTRAINT, "Shrinkwrap",
"Restrict movements to surface of target mesh"},
{0, NULL, 0, NULL, NULL}
};
diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c
index cc1dc5e17b9..f576ad4866c 100644
--- a/source/blender/makesrna/intern/rna_curve.c
+++ b/source/blender/makesrna/intern/rna_curve.c
@@ -956,20 +956,20 @@ static void rna_def_font(BlenderRNA *UNUSED(brna), StructRNA *srna)
PropertyRNA *prop;
static const EnumPropertyItem prop_align_items[] = {
- {CU_ALIGN_X_LEFT, "LEFT", 0, "Left", "Align text to the left"},
- {CU_ALIGN_X_MIDDLE, "CENTER", 0, "Center", "Center text"},
- {CU_ALIGN_X_RIGHT, "RIGHT", 0, "Right", "Align text to the right"},
- {CU_ALIGN_X_JUSTIFY, "JUSTIFY", 0, "Justify", "Align to the left and the right"},
- {CU_ALIGN_X_FLUSH, "FLUSH", 0, "Flush", "Align to the left and the right, with equal character spacing"},
+ {CU_ALIGN_X_LEFT, "LEFT", ICON_ALIGN_LEFT, "Left", "Align text to the left"},
+ {CU_ALIGN_X_MIDDLE, "CENTER", ICON_ALIGN_CENTER, "Center", "Center text"},
+ {CU_ALIGN_X_RIGHT, "RIGHT", ICON_ALIGN_RIGHT, "Right", "Align text to the right"},
+ {CU_ALIGN_X_JUSTIFY, "JUSTIFY", ICON_ALIGN_JUSTIFY, "Justify", "Align to the left and the right"},
+ {CU_ALIGN_X_FLUSH, "FLUSH", ICON_ALIGN_FLUSH, "Flush", "Align to the left and the right, with equal character spacing"},
{0, NULL, 0, NULL, NULL}
};
static const EnumPropertyItem prop_align_y_items[] = {
- {CU_ALIGN_Y_TOP_BASELINE, "TOP_BASELINE", 0, "Top Base-Line", "Align to top but use the base-line of the text"},
- {CU_ALIGN_Y_TOP, "TOP", 0, "Top", "Align text to the top"},
- {CU_ALIGN_Y_CENTER, "CENTER", 0, "Center", "Align text to the middle"},
- {CU_ALIGN_Y_BOTTOM, "BOTTOM", 0, "Bottom", "Align text to the bottom"},
- {CU_ALIGN_Y_BOTTOM_BASELINE, "BOTTOM_BASELINE", 0, "Bottom Base-Line",
+ {CU_ALIGN_Y_TOP_BASELINE, "TOP_BASELINE", ICON_ALIGN_TOP, "Top Base-Line", "Align to top but use the base-line of the text"},
+ {CU_ALIGN_Y_TOP, "TOP", ICON_ALIGN_TOP, "Top", "Align text to the top"},
+ {CU_ALIGN_Y_CENTER, "CENTER", ICON_ALIGN_MIDDLE, "Center", "Align text to the middle"},
+ {CU_ALIGN_Y_BOTTOM, "BOTTOM", ICON_ALIGN_BOTTOM, "Bottom", "Align text to the bottom"},
+ {CU_ALIGN_Y_BOTTOM_BASELINE, "BOTTOM_BASELINE", ICON_ALIGN_BOTTOM, "Bottom Base-Line",
"Align text to the bottom but use the base-line of the text"},
{0, NULL, 0, NULL, NULL}
};
@@ -1179,16 +1179,19 @@ static void rna_def_charinfo(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_bold", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_BOLD);
RNA_def_property_ui_text(prop, "Bold", "");
+ RNA_def_property_ui_icon(prop, ICON_BOLD, 0);
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop = RNA_def_property(srna, "use_italic", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_ITALIC);
RNA_def_property_ui_text(prop, "Italic", "");
+ RNA_def_property_ui_icon(prop, ICON_ITALIC, 0);
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop = RNA_def_property(srna, "use_underline", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_UNDERLINE);
RNA_def_property_ui_text(prop, "Underline", "");
+ RNA_def_property_ui_icon(prop, ICON_UNDERLINE, 0);
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
/* probably there is no reason to expose this */
@@ -1202,6 +1205,7 @@ static void rna_def_charinfo(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_small_caps", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_CHINFO_SMALLCAPS);
RNA_def_property_ui_text(prop, "Small Caps", "");
+ RNA_def_property_ui_icon(prop, ICON_SMALL_CAPS, 0);
RNA_def_property_update(prop, 0, "rna_Curve_update_data");
prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED);
diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c
index 36330f1e17a..a02868622e4 100644
--- a/source/blender/makesrna/intern/rna_gpencil.c
+++ b/source/blender/makesrna/intern/rna_gpencil.c
@@ -1097,7 +1097,7 @@ static void rna_def_gpencil_layer(BlenderRNA *brna)
/* Flags */
prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_HIDE);
- RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1);
RNA_def_property_ui_text(prop, "Hide", "Set layer Visibility");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
@@ -1279,6 +1279,13 @@ static void rna_def_gpencil_grid(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Grid Subdivisions", "Number of subdivisions in each side of symmetry line");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+ prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_XYZ);
+ RNA_def_property_float_sdna(prop, NULL, "offset");
+ RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
+ RNA_def_property_array(prop, 2);
+ RNA_def_property_ui_text(prop, "Offset", "Offset of the canvas");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
prop = RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "axis");
RNA_def_property_enum_items(prop, rna_enum_gpencil_grid_axis_items);
@@ -1383,6 +1390,11 @@ static void rna_def_gpencil_data(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Force Fill Update", "Force recalc of fill data after use deformation modifiers (reduce FPS)");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+ prop = RNA_def_property(srna, "use_adaptative_uv", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_UV_ADAPTATIVE);
+ RNA_def_property_ui_text(prop, "Adaptative UV", "Automatic UVs are calculated depending of the stroke size");
+ RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update");
+
prop = RNA_def_property(srna, "edit_line_color", PROP_FLOAT, PROP_COLOR_GAMMA);
RNA_def_property_float_sdna(prop, NULL, "line_color");
RNA_def_property_array(prop, 4);
diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h
index 2578f88a520..155c030587d 100644
--- a/source/blender/makesrna/intern/rna_internal.h
+++ b/source/blender/makesrna/intern/rna_internal.h
@@ -490,7 +490,7 @@ int rna_parameter_size(struct PropertyRNA *parm);
struct Mesh *rna_Main_meshes_new_from_object(
struct Main *bmain, struct ReportList *reports, struct Depsgraph *depsgraph,
- struct Object *ob, bool apply_modifiers, bool calc_tessface, bool calc_undeformed);
+ struct Object *ob, bool apply_modifiers, bool calc_undeformed);
/* XXX, these should not need to be defined here~! */
struct MTex *rna_mtex_texture_slots_add(struct ID *self, struct bContext *C, struct ReportList *reports);
diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c
index 05efe350a2f..11fb5f7f94b 100644
--- a/source/blender/makesrna/intern/rna_key.c
+++ b/source/blender/makesrna/intern/rna_key.c
@@ -722,7 +722,7 @@ static void rna_def_keyblock(BlenderRNA *brna)
prop = RNA_def_property(srna, "mute", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYBLOCK_MUTE);
RNA_def_property_ui_text(prop, "Mute", "Mute this shape key");
- RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1);
RNA_def_property_update(prop, 0, "rna_Key_update_data");
prop = RNA_def_property(srna, "slider_min", PROP_FLOAT, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index 70dcf20dcc6..59c9e523914 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -310,7 +310,7 @@ static Mesh *rna_Main_meshes_new(Main *bmain, const char *name)
/* copied from Mesh_getFromObject and adapted to RNA interface */
Mesh *rna_Main_meshes_new_from_object(
Main *bmain, ReportList *reports, Depsgraph *depsgraph,
- Object *ob, bool apply_modifiers, bool calc_tessface, bool calc_undeformed)
+ Object *ob, bool apply_modifiers, bool calc_undeformed)
{
Scene *sce = DEG_get_evaluated_scene(depsgraph);
@@ -326,7 +326,7 @@ Mesh *rna_Main_meshes_new_from_object(
return NULL;
}
- return BKE_mesh_new_from_object(depsgraph, bmain, sce, ob, apply_modifiers, calc_tessface, calc_undeformed);
+ return BKE_mesh_new_from_object(depsgraph, bmain, sce, ob, apply_modifiers, calc_undeformed);
}
static Lamp *rna_Main_lights_new(Main *bmain, const char *name, int type)
@@ -893,7 +893,6 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
parm = RNA_def_boolean(func, "apply_modifiers", 0, "", "Apply modifiers");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- RNA_def_boolean(func, "calc_tessface", true, "Calculate Tessellation", "Calculate tessellation faces");
RNA_def_boolean(func, "calc_undeformed", false, "Calculate Undeformed", "Calculate undeformed vertex coordinates");
parm = RNA_def_pointer(func, "mesh", "Mesh", "",
"Mesh created from object, remove it if it is only used for export");
diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c
index ee0c9e392c4..ac65c25f1da 100644
--- a/source/blender/makesrna/intern/rna_material.c
+++ b/source/blender/makesrna/intern/rna_material.c
@@ -555,7 +555,7 @@ static void rna_def_material_greasepencil(BlenderRNA *brna)
/* Flags */
prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_COLOR_HIDE);
- RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, 1);
+ RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1);
RNA_def_property_ui_text(prop, "Hide", "Set color Visibility");
RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_nopreview_update");
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index 24896570fb5..a5bae7115f9 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -70,6 +70,7 @@ const EnumPropertyItem rna_enum_mesh_delimit_mode_items[] = {
#include "BKE_customdata.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
+#include "BKE_mesh_runtime.h"
#include "BKE_report.h"
#include "DEG_depsgraph.h"
@@ -139,12 +140,6 @@ static CustomData *rna_mesh_ldata(PointerRNA *ptr)
return rna_mesh_ldata_helper(me);
}
-static CustomData *rna_mesh_fdata(PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- return rna_mesh_fdata_helper(me);
-}
-
/* -------------------------------------------------------------------- */
/* Generic CustomData Layer Functions */
@@ -195,12 +190,6 @@ static void rna_MeshLoopLayer_name_set(PointerRNA *ptr, const char *value)
{
rna_cd_layer_name_set(rna_mesh_ldata(ptr), (CustomDataLayer *)ptr->data, value);
}
-#if 0
-static void rna_MeshTessfaceLayer_name_set(PointerRNA *ptr, const char *value)
-{
- rna_cd_layer_name_set(rna_mesh_fdata(ptr), (CustomDataLayer *)ptr->data, value);
-}
-#endif
/* only for layers shared between types */
static void rna_MeshAnyLayer_name_set(PointerRNA *ptr, const char *value)
{
@@ -435,232 +424,57 @@ static void rna_MeshPolygon_flip(ID *id, MPoly *mp)
BKE_mesh_polygon_flip(mp, me->mloop, &me->ldata);
BKE_mesh_tessface_clear(me);
+ BKE_mesh_runtime_clear_geometry(me);
}
-static void rna_MeshTessFace_normal_get(PointerRNA *ptr, float *values)
+static void rna_MeshLoopTriangle_verts_get(PointerRNA *ptr, int *values)
{
Mesh *me = rna_mesh(ptr);
- MFace *mface = (MFace *)ptr->data;
-
- if (mface->v4)
- normal_quad_v3(values, me->mvert[mface->v1].co, me->mvert[mface->v2].co,
- me->mvert[mface->v3].co, me->mvert[mface->v4].co);
- else
- normal_tri_v3(values, me->mvert[mface->v1].co, me->mvert[mface->v2].co, me->mvert[mface->v3].co);
+ MLoopTri *lt = (MLoopTri *)ptr->data;
+ values[0] = me->mloop[lt->tri[0]].v;
+ values[1] = me->mloop[lt->tri[1]].v;
+ values[2] = me->mloop[lt->tri[2]].v;
}
-static void rna_MeshTessFace_split_normals_get(PointerRNA *ptr, float *values)
-{
- Mesh *me = rna_mesh(ptr);
- MFace *mface = (MFace *)ptr->data;
- const short (*vec)[4][3] = CustomData_get(&me->fdata, (int)(mface - me->mface), CD_TESSLOOPNORMAL);
- int i = 4;
-
- if (!vec) {
- while (i--) zero_v3(&values[i * 3]);
- }
- else {
- while (i--) normal_short_to_float_v3(&values[i * 3], (const short *)(*vec)[i]);
- }
-}
-static float rna_MeshTessFace_area_get(PointerRNA *ptr)
+static void rna_MeshLoopTriangle_normal_get(PointerRNA *ptr, float *values)
{
Mesh *me = rna_mesh(ptr);
- MFace *mface = (MFace *)ptr->data;
-
- if (mface->v4)
- return area_quad_v3(me->mvert[mface->v1].co, me->mvert[mface->v2].co, me->mvert[mface->v3].co,
- me->mvert[mface->v4].co);
- else
- return area_tri_v3(me->mvert[mface->v1].co, me->mvert[mface->v2].co, me->mvert[mface->v3].co);
-}
-
-static void rna_MeshTextureFace_uv1_get(PointerRNA *ptr, float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- values[0] = mtface->uv[0][0];
- values[1] = mtface->uv[0][1];
-}
-
-static void rna_MeshTextureFace_uv1_set(PointerRNA *ptr, const float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- mtface->uv[0][0] = values[0];
- mtface->uv[0][1] = values[1];
-}
-
-static void rna_MeshTextureFace_uv2_get(PointerRNA *ptr, float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- values[0] = mtface->uv[1][0];
- values[1] = mtface->uv[1][1];
-}
-
-static void rna_MeshTextureFace_uv2_set(PointerRNA *ptr, const float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- mtface->uv[1][0] = values[0];
- mtface->uv[1][1] = values[1];
-}
-
-static void rna_MeshTextureFace_uv3_get(PointerRNA *ptr, float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- values[0] = mtface->uv[2][0];
- values[1] = mtface->uv[2][1];
-}
-
-static void rna_MeshTextureFace_uv3_set(PointerRNA *ptr, const float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- mtface->uv[2][0] = values[0];
- mtface->uv[2][1] = values[1];
-}
-
-static void rna_MeshTextureFace_uv4_get(PointerRNA *ptr, float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- values[0] = mtface->uv[3][0];
- values[1] = mtface->uv[3][1];
-}
+ MLoopTri *lt = (MLoopTri *)ptr->data;
+ unsigned int v1 = me->mloop[lt->tri[0]].v;
+ unsigned int v2 = me->mloop[lt->tri[1]].v;
+ unsigned int v3 = me->mloop[lt->tri[2]].v;
-static void rna_MeshTextureFace_uv4_set(PointerRNA *ptr, const float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
-
- mtface->uv[3][0] = values[0];
- mtface->uv[3][1] = values[1];
+ normal_tri_v3(values, me->mvert[v1].co, me->mvert[v2].co, me->mvert[v3].co);
}
-static int rna_CustomDataData_numverts(PointerRNA *ptr, int type)
+static void rna_MeshLoopTriangle_split_normals_get(PointerRNA *ptr, float *values)
{
Mesh *me = rna_mesh(ptr);
- CustomData *fdata = rna_mesh_fdata(ptr);
- CustomDataLayer *cdl;
- int a, b;
+ const float (*lnors)[3] = CustomData_get_layer(&me->ldata, CD_NORMAL);
- for (cdl = fdata->layers, a = 0; a < fdata->totlayer; cdl++, a++) {
- if (cdl->type == type) {
- b = ((char *)ptr->data - ((char *)cdl->data)) / CustomData_sizeof(type);
- if (b >= 0 && b < me->totface) {
- return (me->mface[b].v4 ? 4 : 3);
- }
- }
+ if (!lnors) {
+ zero_v3(values + 0);
+ zero_v3(values + 3);
+ zero_v3(values + 6);
+ }
+ else {
+ MLoopTri *lt = (MLoopTri *)ptr->data;
+ copy_v3_v3(values + 0, lnors[lt->tri[0]]);
+ copy_v3_v3(values + 3, lnors[lt->tri[1]]);
+ copy_v3_v3(values + 6, lnors[lt->tri[2]]);
}
-
- return 0;
-}
-
-static int rna_MeshTextureFace_uv_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
-{
- length[0] = rna_CustomDataData_numverts(ptr, CD_MTFACE);
- length[1] = 2;
- return length[0] * length[1];
-}
-
-static void rna_MeshTextureFace_uv_get(PointerRNA *ptr, float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
- int totvert = rna_CustomDataData_numverts(ptr, CD_MTFACE);
-
- memcpy(values, mtface->uv, totvert * 2 * sizeof(float));
-}
-
-static void rna_MeshTextureFace_uv_set(PointerRNA *ptr, const float *values)
-{
- MTFace *mtface = (MTFace *)ptr->data;
- int totvert = rna_CustomDataData_numverts(ptr, CD_MTFACE);
-
- memcpy(mtface->uv, values, totvert * 2 * sizeof(float));
-}
-
-/* notice red and blue are swapped */
-static void rna_MeshColor_color1_get(PointerRNA *ptr, float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- values[3] = mcol[0].a / 255.0f;
- values[2] = mcol[0].r / 255.0f;
- values[1] = mcol[0].g / 255.0f;
- values[0] = mcol[0].b / 255.0f;
-}
-
-static void rna_MeshColor_color1_set(PointerRNA *ptr, const float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- mcol[0].a = round_fl_to_uchar_clamp(values[3] * 255.0f);
- mcol[0].r = round_fl_to_uchar_clamp(values[2] * 255.0f);
- mcol[0].g = round_fl_to_uchar_clamp(values[1] * 255.0f);
- mcol[0].b = round_fl_to_uchar_clamp(values[0] * 255.0f);
-}
-
-static void rna_MeshColor_color2_get(PointerRNA *ptr, float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- values[3] = mcol[1].a / 255.0f;
- values[2] = mcol[1].r / 255.0f;
- values[1] = mcol[1].g / 255.0f;
- values[0] = mcol[1].b / 255.0f;
-}
-
-static void rna_MeshColor_color2_set(PointerRNA *ptr, const float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- mcol[1].a = round_fl_to_uchar_clamp(values[3] * 255.0f);
- mcol[1].r = round_fl_to_uchar_clamp(values[2] * 255.0f);
- mcol[1].g = round_fl_to_uchar_clamp(values[1] * 255.0f);
- mcol[1].b = round_fl_to_uchar_clamp(values[0] * 255.0f);
-}
-
-static void rna_MeshColor_color3_get(PointerRNA *ptr, float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- values[3] = mcol[2].a / 255.0f;
- values[2] = mcol[2].r / 255.0f;
- values[1] = mcol[2].g / 255.0f;
- values[0] = mcol[2].b / 255.0f;
-}
-
-static void rna_MeshColor_color3_set(PointerRNA *ptr, const float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- mcol[2].a = round_fl_to_uchar_clamp(values[3] * 255.0f);
- mcol[2].r = round_fl_to_uchar_clamp(values[2] * 255.0f);
- mcol[2].g = round_fl_to_uchar_clamp(values[1] * 255.0f);
- mcol[2].b = round_fl_to_uchar_clamp(values[0] * 255.0f);
-}
-
-static void rna_MeshColor_color4_get(PointerRNA *ptr, float *values)
-{
- MCol *mcol = (MCol *)ptr->data;
-
- values[3] = mcol[3].a / 255.0f;
- values[2] = mcol[3].r / 255.0f;
- values[1] = mcol[3].g / 255.0f;
- values[0] = mcol[3].b / 255.0f;
}
-static void rna_MeshColor_color4_set(PointerRNA *ptr, const float *values)
+static float rna_MeshLoopTriangle_area_get(PointerRNA *ptr)
{
- MCol *mcol = (MCol *)ptr->data;
+ Mesh *me = rna_mesh(ptr);
+ MLoopTri *lt = (MLoopTri *)ptr->data;
+ unsigned int v1 = me->mloop[lt->tri[0]].v;
+ unsigned int v2 = me->mloop[lt->tri[1]].v;
+ unsigned int v3 = me->mloop[lt->tri[2]].v;
- mcol[3].a = round_fl_to_uchar_clamp(values[3] * 255.0f);
- mcol[3].r = round_fl_to_uchar_clamp(values[2] * 255.0f);
- mcol[3].g = round_fl_to_uchar_clamp(values[1] * 255.0f);
- mcol[3].b = round_fl_to_uchar_clamp(values[0] * 255.0f);
+ return area_tri_v3(me->mvert[v1].co, me->mvert[v2].co, me->mvert[v3].co);
}
static void rna_MeshLoopColor_color_get(PointerRNA *ptr, float *values)
@@ -902,93 +716,8 @@ static void rna_MeshUVLoopLayer_clone_set(PointerRNA *ptr, bool value)
rna_CustomDataLayer_clone_set(ptr, rna_mesh_ldata(ptr), value, CD_MLOOPUV);
}
-/* face uv_textures */
-
-DEFINE_CUSTOMDATA_LAYER_COLLECTION(tessface_uv_texture, fdata, CD_MTFACE)
-DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(tessface_uv_texture, fdata, CD_MTFACE, active, MeshTextureFaceLayer)
-
-static void rna_MeshTextureFaceLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
- rna_iterator_array_begin(iter, layer->data, sizeof(MTFace), (me->edit_btmesh) ? 0 : me->totface, 0, NULL);
-}
-
-static int rna_MeshTextureFaceLayer_data_length(PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- return (me->edit_btmesh) ? 0 : me->totface;
-}
-
-static bool rna_MeshTextureFaceLayer_active_render_get(PointerRNA *ptr)
-{
- return rna_CustomDataLayer_active_get(ptr, rna_mesh_fdata(ptr), CD_MTFACE, 1);
-}
-
-static bool rna_MeshTextureFaceLayer_active_get(PointerRNA *ptr)
-{
- return rna_CustomDataLayer_active_get(ptr, rna_mesh_fdata(ptr), CD_MTFACE, 0);
-}
-
-static bool rna_MeshTextureFaceLayer_clone_get(PointerRNA *ptr)
-{
- return rna_CustomDataLayer_clone_get(ptr, rna_mesh_fdata(ptr), CD_MTFACE);
-}
-
-static void rna_MeshTextureFaceLayer_active_render_set(PointerRNA *ptr, bool value)
-{
- rna_CustomDataLayer_active_set(ptr, rna_mesh_fdata(ptr), value, CD_MTFACE, 1);
-}
-
-static void rna_MeshTextureFaceLayer_active_set(PointerRNA *ptr, int value)
-{
- rna_CustomDataLayer_active_set(ptr, rna_mesh_fdata(ptr), value, CD_MTFACE, 0);
-}
-
-static void rna_MeshTextureFaceLayer_clone_set(PointerRNA *ptr, int value)
-{
- rna_CustomDataLayer_clone_set(ptr, rna_mesh_fdata(ptr), value, CD_MTFACE);
-}
-
/* vertex_color_layers */
-DEFINE_CUSTOMDATA_LAYER_COLLECTION(tessface_vertex_color, fdata, CD_MCOL)
-DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(tessface_vertex_color, fdata, CD_MCOL, active, MeshColorLayer)
-DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(tessface_vertex_color, fdata, CD_MCOL, render, MeshColorLayer)
-
-static void rna_MeshColorLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
- rna_iterator_array_begin(iter, layer->data, sizeof(MCol) * 4, me->totface, 0, NULL);
-}
-
-static int rna_MeshColorLayer_data_length(PointerRNA *ptr)
-{
- Mesh *me = rna_mesh(ptr);
- return me->totface;
-}
-
-static bool rna_MeshColorLayer_active_render_get(PointerRNA *ptr)
-{
- return rna_CustomDataLayer_active_get(ptr, rna_mesh_fdata(ptr), CD_MCOL, 1);
-}
-
-static bool rna_MeshColorLayer_active_get(PointerRNA *ptr)
-{
- return rna_CustomDataLayer_active_get(ptr, rna_mesh_fdata(ptr), CD_MCOL, 0);
-}
-
-static void rna_MeshColorLayer_active_render_set(PointerRNA *ptr, bool value)
-{
- rna_CustomDataLayer_active_set(ptr, rna_mesh_fdata(ptr), value, CD_MCOL, 1);
-}
-
-static void rna_MeshColorLayer_active_set(PointerRNA *ptr, int value)
-{
- rna_CustomDataLayer_active_set(ptr, rna_mesh_fdata(ptr), value, CD_MCOL, 0);
-}
-
DEFINE_CUSTOMDATA_LAYER_COLLECTION(vertex_color, ldata, CD_MLOOPCOL)
DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(vertex_color, ldata, CD_MLOOPCOL, active, MeshLoopColorLayer)
DEFINE_CUSTOMDATA_LAYER_COLLECTION_ACTIVEITEM(vertex_color, ldata, CD_MLOOPCOL, render, MeshLoopColorLayer)
@@ -1242,30 +971,6 @@ static void rna_Mesh_face_map_remove(struct Mesh *me, ReportList *reports, struc
/* End face maps */
-static int rna_MeshTessFace_verts_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
-{
- MFace *face = (MFace *)ptr->data;
-
- if (face)
- length[0] = (face->v4) ? 4 : 3;
- else
- length[0] = 4; /* XXX rna_raw_access wants the length of a dummy face. this needs fixing. - Campbell */
-
- return length[0];
-}
-
-static void rna_MeshTessFace_verts_get(PointerRNA *ptr, int *values)
-{
- MFace *face = (MFace *)ptr->data;
- memcpy(values, &face->v1, (face->v4 ? 4 : 3) * sizeof(int));
-}
-
-static void rna_MeshTessFace_verts_set(PointerRNA *ptr, const int *values)
-{
- MFace *face = (MFace *)ptr->data;
- memcpy(&face->v1, values, (face->v4 ? 4 : 3) * sizeof(int));
-}
-
/* poly.vertices - this is faked loop access for convenience */
static int rna_MeshPoly_vertices_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
{
@@ -1320,11 +1025,25 @@ static int rna_MeshEdge_index_get(PointerRNA *ptr)
return (int)(edge - me->medge);
}
-static int rna_MeshTessFace_index_get(PointerRNA *ptr)
+static int rna_MeshLoopTriangle_index_get(PointerRNA *ptr)
+{
+ Mesh *me = rna_mesh(ptr);
+ MLoopTri *ltri = (MLoopTri *)ptr->data;
+ return (int)(ltri - me->runtime.looptris.array);
+}
+
+static int rna_MeshLoopTriangle_material_index_get(PointerRNA *ptr)
+{
+ Mesh *me = rna_mesh(ptr);
+ MLoopTri *ltri = (MLoopTri *)ptr->data;
+ return me->mpoly[ltri->poly].mat_nr;
+}
+
+static bool rna_MeshLoopTriangle_use_smooth_get(PointerRNA *ptr)
{
Mesh *me = rna_mesh(ptr);
- MFace *face = (MFace *)ptr->data;
- return (int)(face - me->mface);
+ MLoopTri *ltri = (MLoopTri *)ptr->data;
+ return me->mpoly[ltri->poly].flag & ME_SMOOTH;
}
static int rna_MeshPolygon_index_get(PointerRNA *ptr)
@@ -1363,9 +1082,9 @@ static char *rna_MeshPolygon_path(PointerRNA *ptr)
return BLI_sprintfN("polygons[%d]", (int)((MPoly *)ptr->data - rna_mesh(ptr)->mpoly));
}
-static char *rna_MeshTessFace_path(PointerRNA *ptr)
+static char *rna_MeshLoopTriangle_path(PointerRNA *ptr)
{
- return BLI_sprintfN("tessfaces[%d]", (int)((MFace *)ptr->data - rna_mesh(ptr)->mface));
+ return BLI_sprintfN("loop_triangles[%d]", (int)((MLoopTri *)ptr->data - rna_mesh(ptr)->runtime.looptris.array));
}
static char *rna_MeshEdge_path(PointerRNA *ptr)
@@ -1384,14 +1103,6 @@ static char *rna_MeshVertex_path(PointerRNA *ptr)
return BLI_sprintfN("vertices[%d]", (int)((MVert *)ptr->data - rna_mesh(ptr)->mvert));
}
-static char *rna_MeshTextureFaceLayer_path(PointerRNA *ptr)
-{
- CustomDataLayer *cdl = ptr->data;
- char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
- return BLI_sprintfN("tessface_uv_textures[\"%s\"]", name_esc);
-}
-
static char *rna_VertCustomData_data_path(PointerRNA *ptr, const char *collection, int type)
{
CustomDataLayer *cdl;
@@ -1455,46 +1166,11 @@ static char *rna_LoopCustomData_data_path(PointerRNA *ptr, const char *collectio
return NULL;
}
-static char *rna_FaceCustomData_data_path(PointerRNA *ptr, const char *collection, int type)
-{
- CustomDataLayer *cdl;
- Mesh *me = rna_mesh(ptr);
- CustomData *fdata = rna_mesh_fdata(ptr);
- int a, b, totloop = (me->edit_btmesh) ? 0 : me->totloop;
-
- for (cdl = fdata->layers, a = 0; a < fdata->totlayer; cdl++, a++) {
- if (cdl->type == type) {
- b = ((char *)ptr->data - ((char *)cdl->data)) / CustomData_sizeof(type);
- if (b >= 0 && b < totloop) {
- char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
- return BLI_sprintfN("%s[\"%s\"].data[%d]", collection, name_esc, b);
- }
- }
- }
-
- return NULL;
-}
-
-
static char *rna_MeshUVLoop_path(PointerRNA *ptr)
{
return rna_LoopCustomData_data_path(ptr, "uv_layers", CD_MLOOPUV);
}
-static char *rna_MeshTextureFace_path(PointerRNA *ptr)
-{
- return rna_FaceCustomData_data_path(ptr, "tessface_uv_textures", CD_MTFACE);
-}
-
-static char *rna_MeshColorLayer_path(PointerRNA *ptr)
-{
- CustomDataLayer *cdl = ptr->data;
- char name_esc[sizeof(cdl->name) * 2];
- BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
- return BLI_sprintfN("tessface_vertex_colors[\"%s\"]", name_esc);
-}
-
static char *rna_MeshLoopColorLayer_path(PointerRNA *ptr)
{
CustomDataLayer *cdl = ptr->data;
@@ -1721,34 +1397,6 @@ static void rna_Mesh_vertex_color_remove(struct Mesh *me, ReportList *reports, C
}
}
-static PointerRNA rna_Mesh_tessface_vertex_color_new(struct Mesh *me, ReportList *reports, const char *name)
-{
- PointerRNA ptr;
- CustomData *fdata;
- CustomDataLayer *cdl = NULL;
- int index;
-
- if (me->edit_btmesh) {
- BKE_report(reports, RPT_ERROR, "Cannot add tessface colors in edit mode");
- return PointerRNA_NULL;
- }
-
- if (me->mpoly) {
- BKE_report(reports, RPT_ERROR, "Cannot add tessface colors when MPoly's exist");
- return PointerRNA_NULL;
- }
-
- index = ED_mesh_color_add(me, name, false);
-
- if (index != -1) {
- fdata = rna_mesh_fdata_helper(me);
- cdl = &fdata->layers[CustomData_get_layer_index_n(fdata, CD_MCOL, index)];
- }
-
- RNA_pointer_create(&me->id, &RNA_MeshColorLayer, cdl, &ptr);
- return ptr;
-}
-
#define DEFINE_CUSTOMDATA_PROPERTY_API(elemname, datatype, cd_prop_type, cdata, countvar, layertype) \
static PointerRNA rna_Mesh_##elemname##_##datatype##_property_new(struct Mesh *me, const char *name) \
{ \
@@ -1796,38 +1444,6 @@ static void rna_Mesh_uv_layers_remove(struct Mesh *me, ReportList *reports, Cust
}
}
-/* while this is supposed to be readonly,
- * keep it to support importers that only make tessfaces */
-
-static PointerRNA rna_Mesh_tessface_uv_texture_new(struct Mesh *me, ReportList *reports, const char *name)
-{
- PointerRNA ptr;
- CustomData *fdata;
- CustomDataLayer *cdl = NULL;
- int index;
-
- if (me->edit_btmesh) {
- BKE_report(reports, RPT_ERROR, "Cannot add tessface uv's in edit mode");
- return PointerRNA_NULL;
- }
-
- if (me->mpoly) {
- BKE_report(reports, RPT_ERROR, "Cannot add tessface uv's when MPoly's exist");
- return PointerRNA_NULL;
- }
-
- index = ED_mesh_uv_texture_add(me, name, false);
-
- if (index != -1) {
- fdata = rna_mesh_fdata_helper(me);
- cdl = &fdata->layers[CustomData_get_layer_index_n(fdata, CD_MTFACE, index)];
- }
-
- RNA_pointer_create(&me->id, &RNA_MeshTextureFaceLayer, cdl, &ptr);
- return ptr;
-}
-
-
static bool rna_Mesh_is_editmode_get(PointerRNA *ptr)
{
Mesh *me = rna_mesh(ptr);
@@ -1840,14 +1456,6 @@ static void UNUSED_FUNCTION(rna_mesh_unused)(void)
/* unused functions made by macros */
(void)rna_Mesh_skin_vertice_index_range;
(void)rna_Mesh_vertex_paint_mask_index_range;
- (void)rna_Mesh_tessface_uv_texture_active_set;
- (void)rna_Mesh_tessface_uv_texture_index_range;
- (void)rna_Mesh_tessface_vertex_color_active_set;
- (void)rna_Mesh_tessface_vertex_color_index_range;
- (void)rna_Mesh_tessface_vertex_color_render_get;
- (void)rna_Mesh_tessface_vertex_color_render_index_get;
- (void)rna_Mesh_tessface_vertex_color_render_index_set;
- (void)rna_Mesh_tessface_vertex_color_render_set;
(void)rna_Mesh_uv_layer_render_get;
(void)rna_Mesh_uv_layer_render_index_get;
(void)rna_Mesh_uv_layer_render_index_set;
@@ -2009,83 +1617,70 @@ static void rna_def_medge(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Index", "Index of this edge");
}
-static void rna_def_mface(BlenderRNA *brna)
+static void rna_def_mlooptri(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
- const int splitnor_dim[] = {4, 3};
+ const int splitnor_dim[] = {3, 3};
- srna = RNA_def_struct(brna, "MeshTessFace", NULL);
- RNA_def_struct_sdna(srna, "MFace");
- RNA_def_struct_ui_text(srna, "Mesh TessFace", "TessFace in a Mesh data-block");
- RNA_def_struct_path_func(srna, "rna_MeshTessFace_path");
+ srna = RNA_def_struct(brna, "MeshLoopTriangle", NULL);
+ RNA_def_struct_sdna(srna, "MLoopTri");
+ RNA_def_struct_ui_text(srna, "Mesh Loop Triangle", "Tessellated triangle in a Mesh data-block");
+ RNA_def_struct_path_func(srna, "rna_MeshLoopTriangle_path");
RNA_def_struct_ui_icon(srna, ICON_FACESEL);
- /* XXX allows creating invalid meshes */
prop = RNA_def_property(srna, "vertices", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_array(prop, 4);
- RNA_def_property_flag(prop, PROP_DYNAMIC);
- RNA_def_property_dynamic_array_funcs(prop, "rna_MeshTessFace_verts_get_length");
- RNA_def_property_int_funcs(prop, "rna_MeshTessFace_verts_get", "rna_MeshTessFace_verts_set", NULL);
- RNA_def_property_ui_text(prop, "Vertices", "Vertex indices");
-
- /* leaving this fixed size array for foreach_set used in import scripts */
- prop = RNA_def_property(srna, "vertices_raw", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_sdna(prop, NULL, "v1");
- RNA_def_property_array(prop, 4);
- RNA_def_property_ui_text(prop, "Vertices", "Fixed size vertex indices array");
-
- prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_sdna(prop, NULL, "mat_nr");
- RNA_def_property_ui_text(prop, "Material Index", "");
-#if 0
- RNA_def_property_int_funcs(prop, NULL, NULL, "rna_MeshPoly_material_index_range"); /* reuse for tessface is ok */
-#endif
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_FACE_SEL);
- RNA_def_property_ui_text(prop, "Select", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_int_funcs(prop, "rna_MeshLoopTriangle_verts_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Vertices", "Indices of triangle vertices");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_HIDE);
- RNA_def_property_ui_text(prop, "Hide", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
+ prop = RNA_def_property(srna, "loops", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "tri");
+ RNA_def_property_ui_text(prop, "Loops", "Indices of mesh loops that make up the triangle");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- prop = RNA_def_property(srna, "use_smooth", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_SMOOTH);
- RNA_def_property_ui_text(prop, "Smooth", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+ prop = RNA_def_property(srna, "polygon_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "poly");
+ RNA_def_property_ui_text(prop, "Polygon", "Index of mesh polygon that the triangle is a part of");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
prop = RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION);
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_float_funcs(prop, "rna_MeshTessFace_normal_get", NULL, NULL);
- RNA_def_property_ui_text(prop, "Face Normal", "Local space unit length normal vector for this face");
+ RNA_def_property_float_funcs(prop, "rna_MeshLoopTriangle_normal_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Triangle Normal", "Local space unit length normal vector for this triangle");
prop = RNA_def_property(srna, "split_normals", PROP_FLOAT, PROP_DIRECTION);
RNA_def_property_multi_array(prop, 2, splitnor_dim);
RNA_def_property_range(prop, -1.0f, 1.0f);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_float_funcs(prop, "rna_MeshTessFace_split_normals_get", NULL, NULL);
+ RNA_def_property_float_funcs(prop, "rna_MeshLoopTriangle_split_normals_get", NULL, NULL);
RNA_def_property_ui_text(prop, "Split Normals",
- "Local space unit length split normals vectors of the vertices of this face "
- "(must be computed beforehand using calc_normals_split or calc_tangents, "
- "and then calc_tessface)");
+ "Local space unit length split normals vectors of the vertices of this triangle "
+ "(must be computed beforehand using calc_normals_split or calc_tangents)");
prop = RNA_def_property(srna, "area", PROP_FLOAT, PROP_UNSIGNED);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_float_funcs(prop, "rna_MeshTessFace_area_get", NULL, NULL);
- RNA_def_property_ui_text(prop, "Face Area", "Read only area of this face");
+ RNA_def_property_float_funcs(prop, "rna_MeshLoopTriangle_area_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Triangle Area", "Area of this triangle");
prop = RNA_def_property(srna, "index", PROP_INT, PROP_UNSIGNED);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_int_funcs(prop, "rna_MeshTessFace_index_get", NULL, NULL);
- RNA_def_property_ui_text(prop, "Index", "Index of this face");
-}
+ RNA_def_property_int_funcs(prop, "rna_MeshLoopTriangle_index_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Index", "Index of this loop triangle");
+ prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_int_funcs(prop, "rna_MeshLoopTriangle_material_index_get", NULL, NULL);
+ RNA_def_property_ui_text(prop, "Material Index", "");
+
+ prop = RNA_def_property(srna, "use_smooth", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_MeshLoopTriangle_use_smooth_get", NULL);
+ RNA_def_property_ui_text(prop, "Smooth", "");
+}
static void rna_def_mloop(BlenderRNA *brna)
{
@@ -2295,179 +1890,6 @@ static void rna_def_mloopuv(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "UV Edge Select", "");
}
-static void rna_def_mtface(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
- const int uv_dim[] = {4, 2};
-
- srna = RNA_def_struct(brna, "MeshTextureFaceLayer", NULL);
- RNA_def_struct_ui_text(srna, "Mesh UV Map", "UV map with assigned image textures in a Mesh data-block");
- RNA_def_struct_sdna(srna, "CustomDataLayer");
- RNA_def_struct_path_func(srna, "rna_MeshTextureFaceLayer_path");
- RNA_def_struct_ui_icon(srna, ICON_GROUP_UVS);
-
- prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_struct_name_property(srna, prop);
- RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MeshUVLayer_name_set");
- RNA_def_property_ui_text(prop, "Name", "Name of UV map");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_funcs(prop, "rna_MeshTextureFaceLayer_active_get", "rna_MeshTextureFaceLayer_active_set");
- RNA_def_property_ui_text(prop, "Active", "Set the map as active for display and editing");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "active_rnd", 0);
- RNA_def_property_boolean_funcs(prop, "rna_MeshTextureFaceLayer_active_render_get",
- "rna_MeshTextureFaceLayer_active_render_set");
- RNA_def_property_ui_text(prop, "Active Render", "Set the map as active for rendering");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active_clone", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "active_clone", 0);
- RNA_def_property_boolean_funcs(prop, "rna_MeshTextureFaceLayer_clone_get", "rna_MeshTextureFaceLayer_clone_set");
- RNA_def_property_ui_text(prop, "Active Clone", "Set the map as active for cloning");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_struct_type(prop, "MeshTextureFace");
- RNA_def_property_ui_text(prop, "Data", "");
- RNA_def_property_collection_funcs(prop, "rna_MeshTextureFaceLayer_data_begin", "rna_iterator_array_next",
- "rna_iterator_array_end", "rna_iterator_array_get",
- "rna_MeshTextureFaceLayer_data_length", NULL, NULL, NULL);
-
- srna = RNA_def_struct(brna, "MeshTextureFace", NULL);
- RNA_def_struct_sdna(srna, "MTFace");
- RNA_def_struct_ui_text(srna, "Mesh UV Map Face", "UV map and image texture for a face");
- RNA_def_struct_path_func(srna, "rna_MeshTextureFace_path");
- RNA_def_struct_ui_icon(srna, ICON_FACESEL_HLT);
-
- /* these are for editing only, access at loops now */
-#if 0
- prop = RNA_def_property(srna, "select_uv", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", TF_SEL1);
- RNA_def_property_array(prop, 4);
- RNA_def_property_ui_text(prop, "UV Selected", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
-
- prop = RNA_def_property(srna, "pin_uv", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "unwrap", TF_PIN1);
- RNA_def_property_array(prop, 4);
- RNA_def_property_ui_text(prop, "UV Pinned", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
-#endif
-
- prop = RNA_def_property(srna, "uv1", PROP_FLOAT, PROP_XYZ);
- RNA_def_property_array(prop, 2);
- RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv1_get", "rna_MeshTextureFace_uv1_set", NULL);
- RNA_def_property_ui_text(prop, "UV 1", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "uv2", PROP_FLOAT, PROP_XYZ);
- RNA_def_property_array(prop, 2);
- RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv2_get", "rna_MeshTextureFace_uv2_set", NULL);
- RNA_def_property_ui_text(prop, "UV 2", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "uv3", PROP_FLOAT, PROP_XYZ);
- RNA_def_property_array(prop, 2);
- RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv3_get", "rna_MeshTextureFace_uv3_set", NULL);
- RNA_def_property_ui_text(prop, "UV 3", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "uv4", PROP_FLOAT, PROP_XYZ);
- RNA_def_property_array(prop, 2);
- RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv4_get", "rna_MeshTextureFace_uv4_set", NULL);
- RNA_def_property_ui_text(prop, "UV 4", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "uv", PROP_FLOAT, PROP_NONE);
- RNA_def_property_multi_array(prop, 2, uv_dim);
- RNA_def_property_flag(prop, PROP_DYNAMIC);
- RNA_def_property_dynamic_array_funcs(prop, "rna_MeshTextureFace_uv_get_length");
- RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv_get", "rna_MeshTextureFace_uv_set", NULL);
- RNA_def_property_ui_text(prop, "UV", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "uv_raw", PROP_FLOAT, PROP_NONE);
- RNA_def_property_multi_array(prop, 2, uv_dim);
- RNA_def_property_float_sdna(prop, NULL, "uv");
- RNA_def_property_ui_text(prop, "UV Raw", "Fixed size UV coordinates array");
-
-}
-
-static void rna_def_mcol(BlenderRNA *brna)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- srna = RNA_def_struct(brna, "MeshColorLayer", NULL);
- RNA_def_struct_ui_text(srna, "Mesh Vertex Color Layer", "Layer of vertex colors in a Mesh data-block");
- RNA_def_struct_sdna(srna, "CustomDataLayer");
- RNA_def_struct_path_func(srna, "rna_MeshColorLayer_path");
- RNA_def_struct_ui_icon(srna, ICON_GROUP_VCOL);
-
- prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_struct_name_property(srna, prop);
- RNA_def_property_string_funcs(prop, NULL, NULL, NULL);
- RNA_def_property_ui_text(prop, "Name", "Name of Vertex color layer");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_funcs(prop, "rna_MeshColorLayer_active_get", "rna_MeshColorLayer_active_set");
- RNA_def_property_ui_text(prop, "Active", "Sets the layer as active for display and editing");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "active_rnd", 0);
- RNA_def_property_boolean_funcs(prop, "rna_MeshColorLayer_active_render_get",
- "rna_MeshColorLayer_active_render_set");
- RNA_def_property_ui_text(prop, "Active Render", "Sets the layer as active for rendering");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_struct_type(prop, "MeshColor");
- RNA_def_property_ui_text(prop, "Data", "");
- RNA_def_property_collection_funcs(prop, "rna_MeshColorLayer_data_begin", "rna_iterator_array_next",
- "rna_iterator_array_end", "rna_iterator_array_get",
- "rna_MeshColorLayer_data_length", NULL, NULL, NULL);
-
- srna = RNA_def_struct(brna, "MeshColor", NULL);
- RNA_def_struct_sdna(srna, "MCol");
- RNA_def_struct_ui_text(srna, "Mesh Vertex Color", "Vertex colors for a face in a Mesh");
- RNA_def_struct_path_func(srna, "rna_MeshColor_path");
-
- prop = RNA_def_property(srna, "color1", PROP_FLOAT, PROP_COLOR);
- RNA_def_property_array(prop, 4);
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_float_funcs(prop, "rna_MeshColor_color1_get", "rna_MeshColor_color1_set", NULL);
- RNA_def_property_ui_text(prop, "Color 1", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "color2", PROP_FLOAT, PROP_COLOR);
- RNA_def_property_array(prop, 4);
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_float_funcs(prop, "rna_MeshColor_color2_get", "rna_MeshColor_color2_set", NULL);
- RNA_def_property_ui_text(prop, "Color 2", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "color3", PROP_FLOAT, PROP_COLOR);
- RNA_def_property_array(prop, 4);
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_float_funcs(prop, "rna_MeshColor_color3_get", "rna_MeshColor_color3_set", NULL);
- RNA_def_property_ui_text(prop, "Color 3", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "color4", PROP_FLOAT, PROP_COLOR);
- RNA_def_property_array(prop, 4);
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_float_funcs(prop, "rna_MeshColor_color4_get", "rna_MeshColor_color4_set", NULL);
- RNA_def_property_ui_text(prop, "Color 4", "");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-}
-
static void rna_def_mloopcol(BlenderRNA *brna)
{
StructRNA *srna;
@@ -2723,33 +2145,15 @@ static void rna_def_mesh_edges(BlenderRNA *brna, PropertyRNA *cprop)
#endif
}
-/* mesh.faces */
-static void rna_def_mesh_tessfaces(BlenderRNA *brna, PropertyRNA *cprop)
+/* mesh.loop_triangles */
+static void rna_def_mesh_looptris(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
- PropertyRNA *prop;
- FunctionRNA *func;
- PropertyRNA *parm;
-
- RNA_def_property_srna(cprop, "MeshTessFaces");
- srna = RNA_def_struct(brna, "MeshTessFaces", NULL);
+ RNA_def_property_srna(cprop, "MeshLoopTriangle");
+ srna = RNA_def_struct(brna, "MeshLoopTriangles", NULL);
RNA_def_struct_sdna(srna, "Mesh");
- RNA_def_struct_ui_text(srna, "Mesh Faces", "Collection of mesh faces");
-
- prop = RNA_def_property(srna, "active", PROP_INT, PROP_NONE);
- RNA_def_property_int_sdna(prop, NULL, "act_face");
- RNA_def_property_ui_text(prop, "Active Face", "The active face for this mesh");
-
- func = RNA_def_function(srna, "add", "ED_mesh_tessfaces_add");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
- parm = RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of faces to add", 0, INT_MAX);
- RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
-#if 0 /* BMESH_TODO Remove until BMesh merge */
- func = RNA_def_function(srna, "remove", "ED_mesh_faces_remove");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
- RNA_def_int(func, "count", 0, 0, INT_MAX, "Count", "Number of faces to remove", 0, INT_MAX);
-#endif
+ RNA_def_struct_ui_text(srna, "Mesh Loop Triangles", "Tessellation of mesh polygons into triangles");
}
/* mesh.loops */
@@ -2799,43 +2203,6 @@ static void rna_def_mesh_polygons(BlenderRNA *brna, PropertyRNA *cprop)
}
-/* mesh.vertex_colors */
-static void rna_def_tessface_vertex_colors(BlenderRNA *brna, PropertyRNA *cprop)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- FunctionRNA *func;
- PropertyRNA *parm;
-
- RNA_def_property_srna(cprop, "VertexColors");
- srna = RNA_def_struct(brna, "VertexColors", NULL);
- RNA_def_struct_sdna(srna, "Mesh");
- RNA_def_struct_ui_text(srna, "Vertex Colors", "Collection of vertex colors");
-
- /* eventually deprecate this */
- func = RNA_def_function(srna, "new", "rna_Mesh_tessface_vertex_color_new");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
- RNA_def_function_ui_description(func, "Add a vertex color layer to Mesh");
- RNA_def_string(func, "name", "Col", 0, "", "Vertex color name");
- parm = RNA_def_pointer(func, "layer", "MeshColorLayer", "", "The newly created layer");
- RNA_def_parameter_flags(parm, 0, PARM_RNAPTR);
- RNA_def_function_return(func, parm);
-
- prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "MeshColorLayer");
- RNA_def_property_pointer_funcs(prop, "rna_Mesh_tessface_vertex_color_active_get",
- "rna_Mesh_tessface_vertex_color_active_set", NULL, NULL);
- RNA_def_property_ui_text(prop, "Active Vertex Color Layer", "Active vertex color layer");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_funcs(prop, "rna_Mesh_tessface_vertex_color_active_index_get",
- "rna_Mesh_tessface_vertex_color_active_index_set", "rna_Mesh_vertex_color_index_range");
- RNA_def_property_ui_text(prop, "Active Vertex Color Index", "Active vertex color index");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-}
-
static void rna_def_loop_colors(BlenderRNA *brna, PropertyRNA *cprop)
{
StructRNA *srna;
@@ -3045,43 +2412,6 @@ static void rna_def_polygon_string_layers(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_return(func, parm);
}
-/* mesh.tessface_uv_layers */
-static void rna_def_tessface_uv_textures(BlenderRNA *brna, PropertyRNA *cprop)
-{
- StructRNA *srna;
- PropertyRNA *prop;
-
- FunctionRNA *func;
- PropertyRNA *parm;
-
- RNA_def_property_srna(cprop, "TessfaceUVTextures");
- srna = RNA_def_struct(brna, "TessfaceUVTextures", NULL);
- RNA_def_struct_sdna(srna, "Mesh");
- RNA_def_struct_ui_text(srna, "UV Maps", "Collection of UV maps for tessellated faces");
-
- /* eventually deprecate this */
- func = RNA_def_function(srna, "new", "rna_Mesh_tessface_uv_texture_new");
- RNA_def_function_flag(func, FUNC_USE_REPORTS);
- RNA_def_function_ui_description(func, "Add a UV tessface-texture layer to Mesh (only for meshes with no polygons)");
- RNA_def_string(func, "name", "UVMap", 0, "", "UV map name");
- parm = RNA_def_pointer(func, "layer", "MeshTextureFaceLayer", "", "The newly created layer");
- RNA_def_parameter_flags(parm, 0, PARM_RNAPTR);
- RNA_def_function_return(func, parm);
-
- prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
- RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
- RNA_def_property_pointer_funcs(prop, "rna_Mesh_tessface_uv_texture_active_get",
- "rna_Mesh_tessface_uv_texture_active_set", NULL, NULL);
- RNA_def_property_ui_text(prop, "Active UV Map", "Active UV Map");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-
- prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
- RNA_def_property_int_funcs(prop, "rna_Mesh_tessface_uv_texture_active_index_get",
- "rna_Mesh_tessface_uv_texture_active_index_set", "rna_Mesh_uv_layer_index_range");
- RNA_def_property_ui_text(prop, "Active UV Map Index", "Active UV Map index");
- RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
-}
-
static void rna_def_skin_vertices(BlenderRNA *brna, PropertyRNA *UNUSED(cprop))
{
StructRNA *srna;
@@ -3256,12 +2586,6 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Edges", "Edges of the mesh");
rna_def_mesh_edges(brna, prop);
- prop = RNA_def_property(srna, "tessfaces", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_collection_sdna(prop, NULL, "mface", "totface");
- RNA_def_property_struct_type(prop, "MeshTessFace");
- RNA_def_property_ui_text(prop, "TessFaces", "Tessellated faces of the mesh (derived from polygons)");
- rna_def_mesh_tessfaces(brna, prop);
-
prop = RNA_def_property(srna, "loops", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "mloop", "totloop");
RNA_def_property_struct_type(prop, "MeshLoop");
@@ -3274,6 +2598,12 @@ static void rna_def_mesh(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Polygons", "Polygons of the mesh");
rna_def_mesh_polygons(brna, prop);
+ prop = RNA_def_property(srna, "loop_triangles", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "runtime.looptris.array", "runtime.looptris.len");
+ RNA_def_property_struct_type(prop, "MeshLoopTriangle");
+ RNA_def_property_ui_text(prop, "Loop Triangles", "Tessellation of mesh polygons into triangles");
+ rna_def_mesh_looptris(brna, prop);
+
/* TODO, should this be allowed to be its self? */
prop = RNA_def_property(srna, "texture_mesh", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "texcomesh");
@@ -3314,27 +2644,6 @@ static void rna_def_mesh(BlenderRNA *brna)
"rna_Mesh_uv_layer_stencil_index_set", "rna_Mesh_uv_layer_index_range");
RNA_def_property_ui_text(prop, "Mask UV loop layer Index", "Mask UV loop layer index");
- /* Tessellated face UV maps - used by renderers */
- prop = RNA_def_property(srna, "tessface_uv_textures", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_collection_sdna(prop, NULL, "fdata.layers", "fdata.totlayer");
- RNA_def_property_collection_funcs(prop, "rna_Mesh_tessface_uv_textures_begin", NULL, NULL, NULL,
- "rna_Mesh_tessface_uv_textures_length", NULL, NULL, NULL);
- RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
- RNA_def_property_ui_text(prop, "Tessellated Face UV Maps",
- "All UV maps for tessellated faces (read-only, for use by renderers)");
- rna_def_tessface_uv_textures(brna, prop);
-
- /* Tessellated face colors - used by renderers */
-
- prop = RNA_def_property(srna, "tessface_vertex_colors", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_collection_sdna(prop, NULL, "fdata.layers", "fdata.totlayer");
- RNA_def_property_collection_funcs(prop, "rna_Mesh_tessface_vertex_colors_begin", NULL, NULL, NULL,
- "rna_Mesh_tessface_vertex_colors_length", NULL, NULL, NULL);
- RNA_def_property_struct_type(prop, "MeshColorLayer");
- RNA_def_property_ui_text(prop, "Tessellated Face Colors",
- "All tessellated face colors (read-only, for use by renderers)");
- rna_def_tessface_vertex_colors(brna, prop);
-
/* Vertex colors */
prop = RNA_def_property(srna, "vertex_colors", PROP_COLLECTION, PROP_NONE);
@@ -3570,12 +2879,10 @@ void RNA_def_mesh(BlenderRNA *brna)
rna_def_mvert(brna);
rna_def_mvert_group(brna);
rna_def_medge(brna);
- rna_def_mface(brna);
+ rna_def_mlooptri(brna);
rna_def_mloop(brna);
rna_def_mpolygon(brna);
rna_def_mloopuv(brna);
- rna_def_mtface(brna);
- rna_def_mcol(brna);
rna_def_mloopcol(brna);
rna_def_mproperties(brna);
rna_def_face_map(brna);
diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c
index 7328686af7f..b1556edd4b7 100644
--- a/source/blender/makesrna/intern/rna_mesh_api.c
+++ b/source/blender/makesrna/intern/rna_mesh_api.c
@@ -50,6 +50,7 @@
#include "BKE_mesh.h"
#include "BKE_mesh_tangent.h"
#include "BKE_mesh_mapping.h"
+#include "BKE_mesh_runtime.h"
#include "ED_mesh.h"
static const char *rna_Mesh_unit_test_compare(struct Mesh *mesh, struct Mesh *mesh2)
@@ -101,9 +102,9 @@ static void rna_Mesh_free_tangents(Mesh *mesh)
CustomData_free_layers(&mesh->ldata, CD_MLOOPTANGENT, mesh->totloop);
}
-static void rna_Mesh_calc_tessface(Mesh *mesh, bool free_mpoly)
+static void rna_Mesh_calc_looptri(Mesh *mesh)
{
- ED_mesh_calc_tessface(mesh, free_mpoly != 0);
+ BKE_mesh_runtime_looptri_ensure(mesh);
}
static void rna_Mesh_calc_smooth_groups(Mesh *mesh, bool use_bitflags, int *r_poly_group_len,
@@ -206,6 +207,7 @@ static void rna_Mesh_flip_normals(Mesh *mesh)
BKE_mesh_polygons_flip(mesh->mpoly, mesh->mloop, &mesh->ldata, mesh->totpoly);
BKE_mesh_tessface_clear(mesh);
BKE_mesh_calc_normals(mesh);
+ BKE_mesh_runtime_clear_geometry(mesh);
DEG_id_tag_update(&mesh->id, 0);
}
@@ -269,12 +271,8 @@ void RNA_api_mesh(StructRNA *srna)
func = RNA_def_function(srna, "free_tangents", "rna_Mesh_free_tangents");
RNA_def_function_ui_description(func, "Free tangents");
- func = RNA_def_function(srna, "calc_tessface", "rna_Mesh_calc_tessface");
- RNA_def_function_ui_description(func, "Calculate face tessellation (supports editmode too)");
- RNA_def_boolean(func, "free_mpoly", 0, "Free MPoly", "Free data used by polygons and loops. "
- "WARNING: This destructive operation removes regular faces, "
- "only used on temporary mesh data-blocks to reduce memory footprint of render "
- "engines and export scripts");
+ func = RNA_def_function(srna, "calc_loop_triangles", "rna_Mesh_calc_looptri");
+ RNA_def_function_ui_description(func, "Calculate loop triangle tessellation (supports editmode too)");
func = RNA_def_function(srna, "calc_smooth_groups", "rna_Mesh_calc_smooth_groups");
RNA_def_function_ui_description(func, "Calculate smooth groups from sharp edges");
@@ -308,7 +306,7 @@ void RNA_api_mesh(StructRNA *srna)
func = RNA_def_function(srna, "update", "ED_mesh_update");
RNA_def_boolean(func, "calc_edges", 0, "Calculate Edges", "Force recalculation of edges");
- RNA_def_boolean(func, "calc_tessface", 0, "Calculate Tessellation", "Force recalculation of tessellation faces");
+ RNA_def_boolean(func, "calc_loop_triangles", 0, "Calculate Triangules", "Force recalculation of triangle tessellation");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
RNA_def_function(srna, "update_gpu_tag", "rna_Mesh_update_gpu_tag");
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index bbb6eae8945..4f366fa36c4 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -64,63 +64,63 @@
const EnumPropertyItem rna_enum_object_modifier_type_items[] = {
{0, "", 0, N_("Modify"), ""},
- {eModifierType_DataTransfer, "DATA_TRANSFER", ICON_MOD_DATA_TRANSFER, "Data Transfer", ""},
- {eModifierType_MeshCache, "MESH_CACHE", ICON_MOD_MESHDEFORM, "Mesh Cache", ""},
- {eModifierType_MeshSequenceCache, "MESH_SEQUENCE_CACHE", ICON_MOD_MESHDEFORM, "Mesh Sequence Cache", ""},
- {eModifierType_NormalEdit, "NORMAL_EDIT", ICON_MOD_NORMALEDIT, "Normal Edit", ""},
- {eModifierType_WeightedNormal, "WEIGHTED_NORMAL", ICON_MOD_NORMALEDIT, "Weighted Normal", ""},
- {eModifierType_UVProject, "UV_PROJECT", ICON_MOD_UVPROJECT, "UV Project", ""},
- {eModifierType_UVWarp, "UV_WARP", ICON_MOD_UVPROJECT, "UV Warp", ""},
- {eModifierType_WeightVGEdit, "VERTEX_WEIGHT_EDIT", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Edit", ""},
- {eModifierType_WeightVGMix, "VERTEX_WEIGHT_MIX", ICON_MOD_VERTEX_WEIGHT, "Vertex Weight Mix", ""},
- {eModifierType_WeightVGProximity, "VERTEX_WEIGHT_PROXIMITY", ICON_MOD_VERTEX_WEIGHT,
+ {eModifierType_DataTransfer, "DATA_TRANSFER", ICON_MODIFIER, "Data Transfer", ""},
+ {eModifierType_MeshCache, "MESH_CACHE", ICON_MODIFIER, "Mesh Cache", ""},
+ {eModifierType_MeshSequenceCache, "MESH_SEQUENCE_CACHE", ICON_MODIFIER, "Mesh Sequence Cache", ""},
+ {eModifierType_NormalEdit, "NORMAL_EDIT", ICON_MODIFIER, "Normal Edit", ""},
+ {eModifierType_WeightedNormal, "WEIGHTED_NORMAL", ICON_MODIFIER, "Weighted Normal", ""},
+ {eModifierType_UVProject, "UV_PROJECT", ICON_MODIFIER, "UV Project", ""},
+ {eModifierType_UVWarp, "UV_WARP", ICON_MODIFIER, "UV Warp", ""},
+ {eModifierType_WeightVGEdit, "VERTEX_WEIGHT_EDIT", ICON_MODIFIER, "Vertex Weight Edit", ""},
+ {eModifierType_WeightVGMix, "VERTEX_WEIGHT_MIX", ICON_MODIFIER, "Vertex Weight Mix", ""},
+ {eModifierType_WeightVGProximity, "VERTEX_WEIGHT_PROXIMITY", ICON_MODIFIER,
"Vertex Weight Proximity", ""},
{0, "", 0, N_("Generate"), ""},
- {eModifierType_Array, "ARRAY", ICON_MOD_ARRAY, "Array", ""},
- {eModifierType_Bevel, "BEVEL", ICON_MOD_BEVEL, "Bevel", ""},
- {eModifierType_Boolean, "BOOLEAN", ICON_MOD_BOOLEAN, "Boolean", ""},
- {eModifierType_Build, "BUILD", ICON_MOD_BUILD, "Build", ""},
- {eModifierType_Decimate, "DECIMATE", ICON_MOD_DECIM, "Decimate", ""},
- {eModifierType_EdgeSplit, "EDGE_SPLIT", ICON_MOD_EDGESPLIT, "Edge Split", ""},
- {eModifierType_Mask, "MASK", ICON_MOD_MASK, "Mask", ""},
- {eModifierType_Mirror, "MIRROR", ICON_MOD_MIRROR, "Mirror", ""},
- {eModifierType_Multires, "MULTIRES", ICON_MOD_MULTIRES, "Multiresolution", ""},
- {eModifierType_Remesh, "REMESH", ICON_MOD_REMESH, "Remesh", ""},
- {eModifierType_Screw, "SCREW", ICON_MOD_SCREW, "Screw", ""},
- {eModifierType_Skin, "SKIN", ICON_MOD_SKIN, "Skin", ""},
- {eModifierType_Solidify, "SOLIDIFY", ICON_MOD_SOLIDIFY, "Solidify", ""},
- {eModifierType_Subsurf, "SUBSURF", ICON_MOD_SUBSURF, "Subdivision Surface", ""},
- {eModifierType_Triangulate, "TRIANGULATE", ICON_MOD_TRIANGULATE, "Triangulate", ""},
- {eModifierType_Wireframe, "WIREFRAME", ICON_MOD_WIREFRAME, "Wireframe", "Generate a wireframe on the edges of a mesh"},
+ {eModifierType_Array, "ARRAY", ICON_MODIFIER, "Array", ""},
+ {eModifierType_Bevel, "BEVEL", ICON_MODIFIER, "Bevel", ""},
+ {eModifierType_Boolean, "BOOLEAN", ICON_MODIFIER, "Boolean", ""},
+ {eModifierType_Build, "BUILD", ICON_MODIFIER, "Build", ""},
+ {eModifierType_Decimate, "DECIMATE", ICON_MODIFIER, "Decimate", ""},
+ {eModifierType_EdgeSplit, "EDGE_SPLIT", ICON_MODIFIER, "Edge Split", ""},
+ {eModifierType_Mask, "MASK", ICON_MODIFIER, "Mask", ""},
+ {eModifierType_Mirror, "MIRROR", ICON_MODIFIER, "Mirror", ""},
+ {eModifierType_Multires, "MULTIRES", ICON_MODIFIER, "Multiresolution", ""},
+ {eModifierType_Remesh, "REMESH", ICON_MODIFIER, "Remesh", ""},
+ {eModifierType_Screw, "SCREW", ICON_MODIFIER, "Screw", ""},
+ {eModifierType_Skin, "SKIN", ICON_MODIFIER, "Skin", ""},
+ {eModifierType_Solidify, "SOLIDIFY", ICON_MODIFIER, "Solidify", ""},
+ {eModifierType_Subsurf, "SUBSURF", ICON_MODIFIER, "Subdivision Surface", ""},
+ {eModifierType_Triangulate, "TRIANGULATE", ICON_MODIFIER, "Triangulate", ""},
+ {eModifierType_Wireframe, "WIREFRAME", ICON_MODIFIER, "Wireframe", "Generate a wireframe on the edges of a mesh"},
{0, "", 0, N_("Deform"), ""},
- {eModifierType_Armature, "ARMATURE", ICON_MOD_ARMATURE, "Armature", ""},
- {eModifierType_Cast, "CAST", ICON_MOD_CAST, "Cast", ""},
- {eModifierType_CorrectiveSmooth, "CORRECTIVE_SMOOTH", ICON_MOD_SMOOTH, "Corrective Smooth", ""},
- {eModifierType_Curve, "CURVE", ICON_MOD_CURVE, "Curve", ""},
- {eModifierType_Displace, "DISPLACE", ICON_MOD_DISPLACE, "Displace", ""},
- {eModifierType_Hook, "HOOK", ICON_HOOK, "Hook", ""},
- {eModifierType_LaplacianSmooth, "LAPLACIANSMOOTH", ICON_MOD_SMOOTH, "Laplacian Smooth", ""},
- {eModifierType_LaplacianDeform, "LAPLACIANDEFORM", ICON_MOD_MESHDEFORM, "Laplacian Deform", ""},
- {eModifierType_Lattice, "LATTICE", ICON_MOD_LATTICE, "Lattice", ""},
- {eModifierType_MeshDeform, "MESH_DEFORM", ICON_MOD_MESHDEFORM, "Mesh Deform", ""},
- {eModifierType_Shrinkwrap, "SHRINKWRAP", ICON_MOD_SHRINKWRAP, "Shrinkwrap", ""},
- {eModifierType_SimpleDeform, "SIMPLE_DEFORM", ICON_MOD_SIMPLEDEFORM, "Simple Deform", ""},
- {eModifierType_Smooth, "SMOOTH", ICON_MOD_SMOOTH, "Smooth", ""},
- {eModifierType_SurfaceDeform, "SURFACE_DEFORM", ICON_MOD_MESHDEFORM, "Surface Deform", ""},
- {eModifierType_Warp, "WARP", ICON_MOD_WARP, "Warp", ""},
- {eModifierType_Wave, "WAVE", ICON_MOD_WAVE, "Wave", ""},
+ {eModifierType_Armature, "ARMATURE", ICON_MODIFIER, "Armature", ""},
+ {eModifierType_Cast, "CAST", ICON_MODIFIER, "Cast", ""},
+ {eModifierType_Curve, "CURVE", ICON_MODIFIER, "Curve", ""},
+ {eModifierType_Displace, "DISPLACE", ICON_MODIFIER, "Displace", ""},
+ {eModifierType_Hook, "HOOK", ICON_MODIFIER, "Hook", ""},
+ {eModifierType_LaplacianDeform, "LAPLACIANDEFORM", ICON_MODIFIER, "Laplacian Deform", ""},
+ {eModifierType_Lattice, "LATTICE", ICON_MODIFIER, "Lattice", ""},
+ {eModifierType_MeshDeform, "MESH_DEFORM", ICON_MODIFIER, "Mesh Deform", ""},
+ {eModifierType_Shrinkwrap, "SHRINKWRAP", ICON_MODIFIER, "Shrinkwrap", ""},
+ {eModifierType_SimpleDeform, "SIMPLE_DEFORM", ICON_MODIFIER, "Simple Deform", ""},
+ {eModifierType_Smooth, "SMOOTH", ICON_MODIFIER, "Smooth", ""},
+ {eModifierType_CorrectiveSmooth, "CORRECTIVE_SMOOTH", ICON_MODIFIER, "Smooth Corrective", ""},
+ {eModifierType_LaplacianSmooth, "LAPLACIANSMOOTH", ICON_MODIFIER, "Smooth Laplacian", ""},
+ {eModifierType_SurfaceDeform, "SURFACE_DEFORM", ICON_MODIFIER, "Surface Deform", ""},
+ {eModifierType_Warp, "WARP", ICON_MODIFIER, "Warp", ""},
+ {eModifierType_Wave, "WAVE", ICON_MODIFIER, "Wave", ""},
{0, "", 0, N_("Simulate"), ""},
- {eModifierType_Cloth, "CLOTH", ICON_MOD_CLOTH, "Cloth", ""},
- {eModifierType_Collision, "COLLISION", ICON_MOD_PHYSICS, "Collision", ""},
- {eModifierType_DynamicPaint, "DYNAMIC_PAINT", ICON_MOD_DYNAMICPAINT, "Dynamic Paint", ""},
- {eModifierType_Explode, "EXPLODE", ICON_MOD_EXPLODE, "Explode", ""},
- {eModifierType_Fluidsim, "FLUID_SIMULATION", ICON_MOD_FLUIDSIM, "Fluid Simulation", ""},
- {eModifierType_Ocean, "OCEAN", ICON_MOD_OCEAN, "Ocean", ""},
- {eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MOD_PARTICLES, "Particle Instance", ""},
- {eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MOD_PARTICLES, "Particle System", ""},
- {eModifierType_Smoke, "SMOKE", ICON_MOD_SMOKE, "Smoke", ""},
- {eModifierType_Softbody, "SOFT_BODY", ICON_MOD_SOFT, "Soft Body", ""},
- {eModifierType_Surface, "SURFACE", ICON_MOD_PHYSICS, "Surface", ""},
+ {eModifierType_Cloth, "CLOTH", ICON_MODIFIER, "Cloth", ""},
+ {eModifierType_Collision, "COLLISION", ICON_MODIFIER, "Collision", ""},
+ {eModifierType_DynamicPaint, "DYNAMIC_PAINT", ICON_MODIFIER, "Dynamic Paint", ""},
+ {eModifierType_Explode, "EXPLODE", ICON_MODIFIER, "Explode", ""},
+ {eModifierType_Fluidsim, "FLUID_SIMULATION", ICON_MODIFIER, "Fluid Simulation", ""},
+ {eModifierType_Ocean, "OCEAN", ICON_MODIFIER, "Ocean", ""},
+ {eModifierType_ParticleInstance, "PARTICLE_INSTANCE", ICON_MODIFIER, "Particle Instance", ""},
+ {eModifierType_ParticleSystem, "PARTICLE_SYSTEM", ICON_MODIFIER, "Particle System", ""},
+ {eModifierType_Smoke, "SMOKE", ICON_MODIFIER, "Smoke", ""},
+ {eModifierType_Softbody, "SOFT_BODY", ICON_MODIFIER, "Soft Body", ""},
+ {eModifierType_Surface, "SURFACE", ICON_MODIFIER, "Surface", ""},
{0, NULL, 0, NULL, NULL}
};
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index b5e3ce4fd28..458c26f7026 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -224,11 +224,11 @@ static void rna_Object_camera_fit_coords(
/* settings: 0 - preview, 1 - render */
static Mesh *rna_Object_to_mesh(
Object *ob, bContext *C, ReportList *reports, Depsgraph *depsgraph,
- bool apply_modifiers, bool calc_tessface, bool calc_undeformed)
+ bool apply_modifiers, bool calc_undeformed)
{
Main *bmain = CTX_data_main(C);
- return rna_Main_meshes_new_from_object(bmain, reports, depsgraph, ob, apply_modifiers, calc_tessface, calc_undeformed);
+ return rna_Main_meshes_new_from_object(bmain, reports, depsgraph, ob, apply_modifiers, calc_undeformed);
}
static PointerRNA rna_Object_shape_key_add(Object *ob, bContext *C, ReportList *reports,
@@ -594,7 +594,6 @@ void RNA_api_object(StructRNA *srna)
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
parm = RNA_def_boolean(func, "apply_modifiers", 0, "", "Apply modifiers");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
- RNA_def_boolean(func, "calc_tessface", true, "Calculate Tessellation", "Calculate tessellation faces");
RNA_def_boolean(func, "calc_undeformed", false, "Calculate Undeformed", "Calculate undeformed vertex coordinates");
parm = RNA_def_pointer(func, "mesh", "Mesh", "",
"Mesh created from object, remove it if it is only used for export");
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 08da013754b..199f74c709d 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -185,9 +185,9 @@ const EnumPropertyItem rna_enum_snap_element_items[] = {
const EnumPropertyItem rna_enum_snap_node_element_items[] = {
{SCE_SNAP_MODE_GRID, "GRID", ICON_SNAP_GRID, "Grid", "Snap to grid"},
- {SCE_SNAP_MODE_NODE_X, "NODE_X", ICON_SNAP_EDGE, "Node X", "Snap to left/right node border"},
- {SCE_SNAP_MODE_NODE_Y, "NODE_Y", ICON_SNAP_EDGE, "Node Y", "Snap to top/bottom node border"},
- {SCE_SNAP_MODE_NODE_X | SCE_SNAP_MODE_NODE_Y, "NODE_XY", ICON_SNAP_EDGE, "Node X / Y", "Snap to any node border"},
+ {SCE_SNAP_MODE_NODE_X, "NODE_X", ICON_NODE_SIDE, "Node X", "Snap to left/right node border"},
+ {SCE_SNAP_MODE_NODE_Y, "NODE_Y", ICON_NODE_TOP, "Node Y", "Snap to top/bottom node border"},
+ {SCE_SNAP_MODE_NODE_X | SCE_SNAP_MODE_NODE_Y, "NODE_XY", ICON_NODE_CORNER, "Node X / Y", "Snap to any node border"},
{0, NULL, 0, NULL, NULL}
};
@@ -457,27 +457,27 @@ static const EnumPropertyItem rna_enum_gpencil_interpolation_mode_items[] = {
#endif
const EnumPropertyItem rna_enum_transform_pivot_items_full[] = {
- {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center",
+ {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center",
"Pivot around bounding box center of selected object(s)"},
- {V3D_AROUND_CURSOR, "CURSOR", ICON_CURSOR, "3D Cursor", "Pivot around the 3D cursor"},
- {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION,
+ {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "3D Cursor", "Pivot around the 3D cursor"},
+ {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_PIVOT_INDIVIDUAL,
"Individual Origins", "Pivot around each object's own origin"},
- {V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", ICON_ROTATECENTER, "Median Point",
+ {V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", ICON_PIVOT_MEDIAN, "Median Point",
"Pivot around the median point of selected objects"},
- {V3D_AROUND_ACTIVE, "ACTIVE_ELEMENT", ICON_ROTACTIVE, "Active Element", "Pivot around active object"},
+ {V3D_AROUND_ACTIVE, "ACTIVE_ELEMENT", ICON_PIVOT_ACTIVE, "Active Element", "Pivot around active object"},
{0, NULL, 0, NULL, NULL}
};
/* Icons could be made a consistent set of images. */
const EnumPropertyItem rna_enum_transform_orientation_items[] = {
- {V3D_MANIP_GLOBAL, "GLOBAL", ICON_SCENE_DATA, "Global", "Align the transformation axes to world space"},
- {V3D_MANIP_LOCAL, "LOCAL", ICON_MANIPUL, "Local", "Align the transformation axes to the selected objects' local space"},
- {V3D_MANIP_NORMAL, "NORMAL", ICON_SNAP_NORMAL, "Normal",
+ {V3D_MANIP_GLOBAL, "GLOBAL", ICON_ORIENTATION_GLOBAL, "Global", "Align the transformation axes to world space"},
+ {V3D_MANIP_LOCAL, "LOCAL", ICON_ORIENTATION_LOCAL, "Local", "Align the transformation axes to the selected objects' local space"},
+ {V3D_MANIP_NORMAL, "NORMAL", ICON_ORIENTATION_NORMAL, "Normal",
"Align the transformation axes to average normal of selected elements "
"(bone Y axis for pose mode)"},
- {V3D_MANIP_GIMBAL, "GIMBAL", ICON_NDOF_DOM, "Gimbal", "Align each axis to the Euler rotation axis as used for input"},
- {V3D_MANIP_VIEW, "VIEW", ICON_VISIBLE_IPO_ON, "View", "Align the transformation axes to the window"},
- {V3D_MANIP_CURSOR, "CURSOR", ICON_CURSOR, "Cursor", "Align the transformation axes to the 3D cursor"},
+ {V3D_MANIP_GIMBAL, "GIMBAL", ICON_ORIENTATION_GIMBAL, "Gimbal", "Align each axis to the Euler rotation axis as used for input"},
+ {V3D_MANIP_VIEW, "VIEW", ICON_ORIENTATION_VIEW, "View", "Align the transformation axes to the window"},
+ {V3D_MANIP_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "Cursor", "Align the transformation axes to the 3D cursor"},
// {V3D_MANIP_CUSTOM, "CUSTOM", 0, "Custom", "Use a custom transform orientation"},
{0, NULL, 0, NULL, NULL}
};
@@ -532,6 +532,14 @@ const EnumPropertyItem rna_enum_transform_orientation_items[] = {
#include "FRS_freestyle.h"
#endif
+static void rna_ToolSettings_snap_mode_set(struct PointerRNA *ptr, int value)
+{
+ ToolSettings *ts = (ToolSettings *)ptr->data;
+ if (value != 0) {
+ ts->snap_mode = value;
+ }
+}
+
/* Grease Pencil update cache */
static void rna_GPencil_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *UNUSED(ptr))
{
@@ -2214,7 +2222,7 @@ static void rna_def_tool_settings(BlenderRNA *brna)
static const EnumPropertyItem gpencil_stroke_placement_items[] = {
{GP_PROJECT_VIEWSPACE, "ORIGIN", ICON_OBJECT_ORIGIN, "Origin", "Draw stroke at Object origin"},
- {GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR, "CURSOR", ICON_CURSOR, "3D Cursor", "Draw stroke at 3D cursor location" },
+ {GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "3D Cursor", "Draw stroke at 3D cursor location" },
{GP_PROJECT_VIEWSPACE | GP_PROJECT_DEPTH_VIEW, "SURFACE", ICON_FACESEL, "Surface", "Stick stroke to surfaces"},
{0, NULL, 0, NULL, NULL}
};
@@ -2226,7 +2234,7 @@ static void rna_def_tool_settings(BlenderRNA *brna)
};
static const EnumPropertyItem annotation_stroke_placement_items[] = {
- {GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR, "CURSOR", ICON_CURSOR, "3D Cursor", "Draw stroke at 3D cursor location" },
+ {GP_PROJECT_VIEWSPACE | GP_PROJECT_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "3D Cursor", "Draw stroke at 3D cursor location" },
{0, "VIEW", ICON_VISIBLE_IPO_ON, "View", "Stick stroke to the view "}, /* weird, GP_PROJECT_VIEWALIGN is inverted */
{GP_PROJECT_VIEWSPACE | GP_PROJECT_DEPTH_VIEW, "SURFACE", ICON_FACESEL, "Surface", "Stick stroke to surfaces"},
/* Stroke option is disabled because is not working as expected and maybe is not
@@ -2390,7 +2398,7 @@ static void rna_def_tool_settings(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_transform_pivot_point_align", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "transform_flag", SCE_XFORM_AXIS_ALIGN);
RNA_def_property_ui_text(prop, "Align", "Manipulate center points (object, pose and weight paint mode only)");
- RNA_def_property_ui_icon(prop, ICON_ALIGN, 0);
+ RNA_def_property_ui_icon(prop, ICON_CENTER_ONLY, 0);
RNA_def_property_update(prop, NC_SCENE, NULL);
prop = RNA_def_property(srna, "use_mesh_automerge", PROP_BOOLEAN, PROP_NONE);
@@ -2420,6 +2428,7 @@ static void rna_def_tool_settings(BlenderRNA *brna)
prop = RNA_def_property(srna, "snap_elements", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_bitflag_sdna(prop, NULL, "snap_mode");
RNA_def_property_enum_items(prop, rna_enum_snap_element_items);
+ RNA_def_property_enum_funcs(prop, NULL, "rna_ToolSettings_snap_mode_set", NULL);
RNA_def_property_flag(prop, PROP_ENUM_FLAG);
RNA_def_property_ui_text(prop, "Snap Element", "Type of element to snap to");
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
@@ -2460,7 +2469,7 @@ static void rna_def_tool_settings(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_snap_self", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "snap_flag", SCE_SNAP_NO_SELF);
RNA_def_property_ui_text(prop, "Project to Self", "Snap onto itself (editmode)");
- RNA_def_property_ui_icon(prop, ICON_ORTHO, 0);
+ RNA_def_property_ui_icon(prop, ICON_XRAY, 0);
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */
prop = RNA_def_property(srna, "use_gizmo_mode", PROP_ENUM, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c
index f9dedc73280..05e5587c9c4 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -519,7 +519,7 @@ static void rna_def_screen(BlenderRNA *brna)
srna = RNA_def_struct(brna, "Screen", "ID");
RNA_def_struct_sdna(srna, "Screen"); /* it is actually bScreen but for 2.5 the dna is patched! */
RNA_def_struct_ui_text(srna, "Screen", "Screen data-block, defining the layout of areas in a window");
- RNA_def_struct_ui_icon(srna, ICON_SPLITSCREEN);
+ RNA_def_struct_ui_icon(srna, ICON_WORKSPACE);
prop = RNA_def_property(srna, "layout_name", PROP_STRING, PROP_NONE);
RNA_def_property_string_funcs(prop, "rna_Screen_layout_name_get", "rna_Screen_layout_name_length",
diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c
index 6ab591fb332..e6e9ff6664d 100644
--- a/source/blender/makesrna/intern/rna_sculpt_paint.c
+++ b/source/blender/makesrna/intern/rna_sculpt_paint.c
@@ -83,11 +83,11 @@ static EnumPropertyItem rna_enum_gpencil_weight_brush_items[] = {
{ 0, NULL, 0, NULL, NULL }
};
-static const EnumPropertyItem rna_enum_gpencil_lockaxis_items[] = {
+static const EnumPropertyItem rna_enum_gpencil_lock_axis_items[] = {
{ GP_LOCKAXIS_NONE, "GP_LOCKAXIS_NONE", ICON_UNLOCKED, "None", "" },
- { GP_LOCKAXIS_X, "GP_LOCKAXIS_X", ICON_NDOF_DOM, "Y-Z Plane", "Project strokes to plane locked to X" },
- { GP_LOCKAXIS_Y, "GP_LOCKAXIS_Y", ICON_NDOF_DOM, "X-Z Plane", "Project strokes to plane locked to Y" },
- { GP_LOCKAXIS_Z, "GP_LOCKAXIS_Z", ICON_NDOF_DOM, "X-Y Plane", "Project strokes to plane locked to Z" },
+ { GP_LOCKAXIS_X, "GP_LOCKAXIS_X", ICON_AXIS_SIDE, "Y-Z Plane", "Project strokes to plane locked to X" },
+ { GP_LOCKAXIS_Y, "GP_LOCKAXIS_Y", ICON_AXIS_FRONT, "X-Z Plane", "Project strokes to plane locked to Y" },
+ { GP_LOCKAXIS_Z, "GP_LOCKAXIS_Z", ICON_AXIS_TOP, "X-Y Plane", "Project strokes to plane locked to Z" },
{ 0, NULL, 0, NULL, NULL }
};
#endif
@@ -1103,8 +1103,8 @@ static void rna_def_particle_edit(BlenderRNA *brna)
static void rna_def_gpencil_sculpt(BlenderRNA *brna)
{
static const EnumPropertyItem prop_direction_items[] = {
- {0, "ADD", ICON_ZOOMIN, "Add", "Add effect of brush"},
- {GP_EDITBRUSH_FLAG_INVERT, "SUBTRACT", ICON_ZOOMOUT, "Subtract", "Subtract effect of brush"},
+ {0, "ADD", ICON_ADD, "Add", "Add effect of brush"},
+ {GP_EDITBRUSH_FLAG_INVERT, "SUBTRACT", ICON_REMOVE, "Subtract", "Subtract effect of brush"},
{0, NULL, 0, NULL, NULL}};
StructRNA *srna;
@@ -1183,9 +1183,9 @@ static void rna_def_gpencil_sculpt(BlenderRNA *brna)
RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
/* lock axis */
- prop = RNA_def_property(srna, "lockaxis", PROP_ENUM, PROP_NONE);
+ prop = RNA_def_property(srna, "lock_axis", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "lock_axis");
- RNA_def_property_enum_items(prop, rna_enum_gpencil_lockaxis_items);
+ RNA_def_property_enum_items(prop, rna_enum_gpencil_lock_axis_items);
RNA_def_property_ui_text(prop, "Lock Axis", "");
RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0);
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
diff --git a/source/blender/makesrna/intern/rna_shader_fx.c b/source/blender/makesrna/intern/rna_shader_fx.c
index 22ebd3f7567..fe4e20bbd58 100644
--- a/source/blender/makesrna/intern/rna_shader_fx.c
+++ b/source/blender/makesrna/intern/rna_shader_fx.c
@@ -52,6 +52,7 @@ const EnumPropertyItem rna_enum_object_shaderfx_type_items[] = {
{eShaderFxType_Blur, "FX_BLUR", ICON_SHADERFX, "Blur", "Apply Gaussian Blur to object" },
{eShaderFxType_Colorize, "FX_COLORIZE", ICON_SHADERFX, "Colorize", "Apply different tint effects" },
{eShaderFxType_Flip, "FX_FLIP", ICON_SHADERFX, "Flip", "Flip image" },
+ {eShaderFxType_Glow, "FX_GLOW", ICON_SHADERFX, "Glow", "Create a glow effect" },
{eShaderFxType_Light, "FX_LIGHT", ICON_SHADERFX, "Light", "Simulate ilumination" },
{eShaderFxType_Pixel, "FX_PIXEL", ICON_SHADERFX, "Pixelate", "Pixelate image"},
{eShaderFxType_Rim, "FX_RIM", ICON_SHADERFX, "Rim", "Add a rim to the image" },
@@ -71,6 +72,12 @@ static const EnumPropertyItem rna_enum_shaderfx_rim_modes_items[] = {
{0, NULL, 0, NULL, NULL }
};
+static const EnumPropertyItem rna_enum_shaderfx_glow_modes_items[] = {
+ {eShaderFxGlowMode_Luminance, "LUMINANCE", 0, "Luminance", "" },
+ {eShaderFxGlowMode_Color, "COLOR", 0, "Color", "" },
+ {0, NULL, 0, NULL, NULL }
+};
+
static const EnumPropertyItem rna_enum_shaderfx_colorize_modes_items[] = {
{eShaderFxColorizeMode_GrayScale, "GRAYSCALE", 0, "Gray Scale", "" },
{eShaderFxColorizeMode_Sepia, "SEPIA", 0, "Sepia", "" },
@@ -108,6 +115,8 @@ static StructRNA *rna_ShaderFx_refine(struct PointerRNA *ptr)
return &RNA_ShaderFxSwirl;
case eShaderFxType_Flip:
return &RNA_ShaderFxFlip;
+ case eShaderFxType_Glow:
+ return &RNA_ShaderFxGlow;
case eShaderFxType_Light:
return &RNA_ShaderFxLight;
/* Default */
@@ -483,6 +492,64 @@ static void rna_def_shader_fx_shadow(BlenderRNA *brna)
RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
}
+static void rna_def_shader_fx_glow(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna = RNA_def_struct(brna, "ShaderFxGlow", "ShaderFx");
+ RNA_def_struct_ui_text(srna, "Glow Effect", "Glow effect");
+ RNA_def_struct_sdna(srna, "GlowShaderFxData");
+ RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
+
+ prop = RNA_def_property(srna, "glow_color", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_float_sdna(prop, NULL, "glow_color");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Glow Color", "Color used for generated glow");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "select_color", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_range(prop, 0.0, 1.0);
+ RNA_def_property_float_sdna(prop, NULL, "select_color");
+ RNA_def_property_array(prop, 3);
+ RNA_def_property_ui_text(prop, "Select Color", "Color selected to apply glow");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "mode");
+ RNA_def_property_enum_items(prop, rna_enum_shaderfx_glow_modes_items);
+ RNA_def_property_ui_text(prop, "Mode", "Glow mode");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "threshold");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1f, 3);
+ RNA_def_property_ui_text(prop, "Threshold", "Limit to select color for glow effect");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ /* use blur fields to make compatible with blur filter, but only makes public first array element */
+ prop = RNA_def_property(srna, "radius", PROP_INT, PROP_PIXEL);
+ RNA_def_property_int_sdna(prop, NULL, "blur[0]");
+ RNA_def_property_range(prop, 0, INT_MAX);
+ RNA_def_property_ui_text(prop, "Radius", "Number of pixels for bluring glow (set to 0 to disable)");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "samples");
+ RNA_def_property_range(prop, 1, 32);
+ RNA_def_property_ui_range(prop, 1, 32, 2, -1);
+ RNA_def_property_int_default(prop, 4);
+ RNA_def_property_ui_text(prop, "Samples", "Number of Blur Samples");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+
+ prop = RNA_def_property(srna, "use_alpha_mode", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_GLOW_USE_ALPHA);
+ RNA_def_property_ui_text(prop, "Use Alpha", "Glow only areas with alpha");
+ RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
+}
+
static void rna_def_shader_fx_swirl(BlenderRNA *brna)
{
StructRNA *srna;
@@ -631,6 +698,7 @@ void RNA_def_shader_fx(BlenderRNA *brna)
rna_def_shader_fx_pixel(brna);
rna_def_shader_fx_rim(brna);
rna_def_shader_fx_shadow(brna);
+ rna_def_shader_fx_glow(brna);
rna_def_shader_fx_swirl(brna);
rna_def_shader_fx_flip(brna);
rna_def_shader_fx_light(brna);
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index c2224fe767b..80053095044 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -72,7 +72,7 @@ const EnumPropertyItem rna_enum_space_type_items[] = {
/* General */
{0, "", ICON_NONE, "General", ""},
{SPACE_VIEW3D, "VIEW_3D", ICON_VIEW3D, "3D View", "3D viewport"},
- {SPACE_IMAGE, "IMAGE_EDITOR", ICON_IMAGE_COL, "UV/Image Editor", "View and edit images and UV Maps"},
+ {SPACE_IMAGE, "IMAGE_EDITOR", ICON_IMAGE, "UV/Image Editor", "View and edit images and UV Maps"},
{SPACE_NODE, "NODE_EDITOR", ICON_NODETREE, "Node Editor", "Editor for node-based shading and compositing tools"},
{SPACE_SEQ, "SEQUENCE_EDITOR", ICON_SEQUENCE, "Video Sequencer", "Video editing tools"},
{SPACE_CLIP, "CLIP_EDITOR", ICON_CLIP, "Movie Clip Editor", "Motion tracking tools"},
@@ -81,7 +81,7 @@ const EnumPropertyItem rna_enum_space_type_items[] = {
{0, "", ICON_NONE, "Animation", ""},
//{SPACE_ACTION, "TIMELINE", ICON_TIME, "Timeline", "Timeline and playback controls (NOTE: Switch to 'Timeline' mode)"}, /* XXX */
{SPACE_ACTION, "DOPESHEET_EDITOR", ICON_ACTION, "Dope Sheet", "Adjust timing of keyframes"},
- {SPACE_IPO, "GRAPH_EDITOR", ICON_IPO, "Graph Editor", "Edit drivers and keyframe interpolation"},
+ {SPACE_IPO, "GRAPH_EDITOR", ICON_GRAPH, "Graph Editor", "Edit drivers and keyframe interpolation"},
{SPACE_NLA, "NLA_EDITOR", ICON_NLA, "Nonlinear Animation", "Combine and layer Actions"},
/* Scripting */
@@ -99,16 +99,16 @@ const EnumPropertyItem rna_enum_space_type_items[] = {
/* Data */
{0, "", ICON_NONE, "Data", ""},
- {SPACE_OUTLINER, "OUTLINER", ICON_OOPS, "Outliner", "Overview of scene graph and all available data-blocks"},
- {SPACE_BUTS, "PROPERTIES", ICON_BUTS, "Properties", "Edit properties of active object and related data-blocks"},
- {SPACE_FILE, "FILE_BROWSER", ICON_FILESEL, "File Browser", "Browse for files and assets"},
+ {SPACE_OUTLINER, "OUTLINER", ICON_OUTLINER, "Outliner", "Overview of scene graph and all available data-blocks"},
+ {SPACE_BUTS, "PROPERTIES", ICON_PROPERTIES, "Properties", "Edit properties of active object and related data-blocks"},
+ {SPACE_FILE, "FILE_BROWSER", ICON_FILEBROWSER, "File Browser", "Browse for files and assets"},
{SPACE_USERPREF, "USER_PREFERENCES", ICON_PREFERENCES, "User Preferences",
"Edit persistent configuration settings"},
{0, NULL, 0, NULL, NULL}
};
const EnumPropertyItem rna_enum_space_graph_mode_items[] = {
- {SIPO_MODE_ANIMATION, "FCURVES", ICON_IPO, "Graph Editor",
+ {SIPO_MODE_ANIMATION, "FCURVES", ICON_GRAPH, "Graph Editor",
"Edit animation/keyframes displayed as 2D curves"},
{SIPO_MODE_DRIVERS, "DRIVERS", ICON_DRIVER, "Drivers", "Edit drivers"},
{0, NULL, 0, NULL, NULL}
@@ -238,10 +238,10 @@ static const EnumPropertyItem autosnap_items[] = {
#endif
const EnumPropertyItem rna_enum_shading_type_items[] = {
- {OB_WIRE, "WIREFRAME", ICON_WIRE, "Wireframe", "Display the object as wire edges"},
- {OB_SOLID, "SOLID", ICON_SOLID, "Solid", "Display in solid mode"},
- {OB_MATERIAL, "MATERIAL", ICON_MATERIAL_DATA, "LookDev", "Display in LookDev mode"},
- {OB_RENDER, "RENDERED", ICON_SMOOTH, "Rendered", "Display render preview"},
+ {OB_WIRE, "WIREFRAME", ICON_SHADING_WIRE, "Wireframe", "Display the object as wire edges"},
+ {OB_SOLID, "SOLID", ICON_SHADING_SOLID, "Solid", "Display in solid mode"},
+ {OB_MATERIAL, "MATERIAL", ICON_SHADING_TEXTURE, "LookDev", "Display in LookDev mode"},
+ {OB_RENDER, "RENDERED", ICON_SHADING_RENDERED, "Rendered", "Display render preview"},
{0, NULL, 0, NULL, NULL}
};
@@ -1197,10 +1197,10 @@ static const EnumPropertyItem *rna_SpaceImageEditor_pivot_itemf(
PropertyRNA *UNUSED(prop), bool *UNUSED(r_free))
{
static const EnumPropertyItem pivot_items[] = {
- {V3D_AROUND_CENTER_BOUNDS, "CENTER", ICON_ROTATE, "Bounding Box Center", ""},
- {V3D_AROUND_CENTER_MEAN, "MEDIAN", ICON_ROTATECENTER, "Median Point", ""},
- {V3D_AROUND_CURSOR, "CURSOR", ICON_CURSOR, "2D Cursor", ""},
- {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION,
+ {V3D_AROUND_CENTER_BOUNDS, "CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center", ""},
+ {V3D_AROUND_CENTER_MEAN, "MEDIAN", ICON_PIVOT_MEDIAN, "Median Point", ""},
+ {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "2D Cursor", ""},
+ {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_PIVOT_INDIVIDUAL,
"Individual Origins", "Pivot around each selected island's own median point"},
{0, NULL, 0, NULL, NULL}
};
@@ -2295,7 +2295,7 @@ static void rna_def_space_outliner(BlenderRNA *brna)
{SO_SEQUENCE, "SEQUENCE", ICON_SEQUENCE, "Sequence", "Display sequence data-blocks"},
{SO_LIBRARIES, "LIBRARIES", ICON_FILE_BLEND, "Blender File", "Display data of current file and linked libraries"},
{SO_DATA_API, "DATA_API", ICON_RNA, "Data API", "Display low level Blender data and its properties"},
- {SO_ID_ORPHANS, "ORPHAN_DATA", ICON_EXTERNAL_DATA, "Orphan Data",
+ {SO_ID_ORPHANS, "ORPHAN_DATA", ICON_ORPHAN_DATA, "Orphan Data",
"Display data-blocks which are unused and/or will be lost when the file is reloaded"},
{0, NULL, 0, NULL, NULL}
};
@@ -2783,6 +2783,11 @@ static void rna_def_space_view3d_overlay(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Wire", "Use wireframe display in painting modes");
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+ prop = RNA_def_property(srna, "show_wpaint_contours", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "overlay.wpaint_flag", V3D_OVERLAY_WPAINT_CONTOURS);
+ RNA_def_property_ui_text(prop, "Show Weight Contours", "Show contour lines formed by points with the same interpolated weight");
+ RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, NULL);
+
prop = RNA_def_property(srna, "show_weight", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "overlay.edit_flag", V3D_OVERLAY_EDIT_WEIGHT);
RNA_def_property_ui_text(prop, "Show Weights", "Display weights in editmode");
@@ -4027,9 +4032,9 @@ static void rna_def_space_graph(BlenderRNA *brna)
/* this is basically the same as the one for the 3D-View, but with some entries omitted */
static const EnumPropertyItem gpivot_items[] = {
- {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center", ""},
- {V3D_AROUND_CURSOR, "CURSOR", ICON_CURSOR, "2D Cursor", ""},
- {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION, "Individual Centers", ""},
+ {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center", ""},
+ {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "2D Cursor", ""},
+ {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_PIVOT_INDIVIDUAL, "Individual Centers", ""},
/*{V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", 0, "Median Point", ""}, */
/*{V3D_AROUND_ACTIVE, "ACTIVE_ELEMENT", 0, "Active Element", ""}, */
{0, NULL, 0, NULL, NULL}
@@ -4921,7 +4926,7 @@ static void rna_def_space_clip(BlenderRNA *brna)
static const EnumPropertyItem view_items[] = {
{SC_VIEW_CLIP, "CLIP", ICON_SEQUENCE, "Clip", "Show editing clip preview"},
- {SC_VIEW_GRAPH, "GRAPH", ICON_IPO, "Graph", "Show graph view for active element"},
+ {SC_VIEW_GRAPH, "GRAPH", ICON_GRAPH, "Graph", "Show graph view for active element"},
{SC_VIEW_DOPESHEET, "DOPESHEET", ICON_ACTION, "Dopesheet", "Dopesheet view for tracking data"},
{0, NULL, 0, NULL, NULL}
};
@@ -4933,12 +4938,12 @@ static void rna_def_space_clip(BlenderRNA *brna)
};
static const EnumPropertyItem pivot_items[] = {
- {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_ROTATE, "Bounding Box Center",
+ {V3D_AROUND_CENTER_BOUNDS, "BOUNDING_BOX_CENTER", ICON_PIVOT_BOUNDBOX, "Bounding Box Center",
"Pivot around bounding box center of selected object(s)"},
- {V3D_AROUND_CURSOR, "CURSOR", ICON_CURSOR, "2D Cursor", "Pivot around the 2D cursor"},
- {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_ROTATECOLLECTION,
+ {V3D_AROUND_CURSOR, "CURSOR", ICON_PIVOT_CURSOR, "2D Cursor", "Pivot around the 2D cursor"},
+ {V3D_AROUND_LOCAL_ORIGINS, "INDIVIDUAL_ORIGINS", ICON_CENTER_ONLY,
"Individual Origins", "Pivot around each object's own origin"},
- {V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", ICON_ROTATECENTER, "Median Point",
+ {V3D_AROUND_CENTER_MEAN, "MEDIAN_POINT", ICON_PIVOT_MEDIAN, "Median Point",
"Pivot around the median point of selected objects"},
{0, NULL, 0, NULL, NULL}
};
diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c
index 3928b75a2b2..523c4691460 100644
--- a/source/blender/makesrna/intern/rna_ui.c
+++ b/source/blender/makesrna/intern/rna_ui.c
@@ -378,7 +378,7 @@ static void uilist_draw_item(uiList *ui_list, bContext *C, uiLayout *layout, Poi
RNA_parameter_list_free(&list);
}
-static void uilist_draw_filter(uiList *ui_list, bContext *C, uiLayout *layout)
+static void uilist_draw_filter(uiList *ui_list, bContext *C, uiLayout *layout, bool reverse)
{
extern FunctionRNA rna_UIList_draw_filter_func;
@@ -392,6 +392,7 @@ static void uilist_draw_filter(uiList *ui_list, bContext *C, uiLayout *layout)
RNA_parameter_list_create(&list, &ul_ptr, func);
RNA_parameter_set_lookup(&list, "context", &C);
RNA_parameter_set_lookup(&list, "layout", &layout);
+ RNA_parameter_set_lookup(&list, "reverse", &reverse);
ui_list->type->ext.call((bContext *)C, &ul_ptr, func, &list);
RNA_parameter_list_free(&list);
@@ -1307,6 +1308,7 @@ static void rna_def_uilist(BlenderRNA *brna)
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_pointer(func, "layout", "UILayout", "", "Layout to draw the item");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+ RNA_def_boolean(func, "reverse", false, "", "Display items in reverse order");
/* filter */
func = RNA_def_function(srna, "filter_items", NULL);
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index 87b8307fafc..f5a74c868fc 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -49,16 +49,12 @@
#define DEF_ICON(name) {ICON_##name, (#name), 0, (#name), ""},
#define DEF_ICON_VECTOR(name) {ICON_##name, (#name), 0, (#name), ""},
-#define DEF_ICON_MONO(name) {ICON_##name, (#name), 0, (#name), ""},
+#define DEF_ICON_COLOR(name) {ICON_##name, (#name), 0, (#name), ""},
#define DEF_ICON_BLANK(name)
const EnumPropertyItem rna_enum_icon_items[] = {
#include "UI_icons.h"
{0, NULL, 0, NULL, NULL}
};
-#undef DEF_ICON
-#undef DEF_ICON_VECTOR
-#undef DEF_ICON_MONO
-#undef DEF_ICON_BLANK
#ifdef RNA_RUNTIME
@@ -1036,7 +1032,8 @@ void RNA_api_ui_layout(StructRNA *srna)
RNA_def_int(func, "maxrows", 5, 0, INT_MAX, "", "Default maximum number of rows to display", 0, INT_MAX);
RNA_def_enum(func, "type", rna_enum_uilist_layout_type_items, UILST_LAYOUT_DEFAULT, "Type", "Type of layout to use");
RNA_def_int(func, "columns", 9, 0, INT_MAX, "", "Number of items to display per row, for GRID layout", 0, INT_MAX);
-
+ RNA_def_boolean(func, "reverse", false, "", "Display items in reverse order");
+
func = RNA_def_function(srna, "template_running_jobs", "uiTemplateRunningJobs");
RNA_def_function_flag(func, FUNC_USE_CONTEXT);
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index d3da1eac7e7..8e6dda65e95 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -1229,6 +1229,37 @@ static void rna_def_userdef_theme_ui(BlenderRNA *brna)
RNA_def_property_array(prop, 3);
RNA_def_property_ui_text(prop, "Gizmo B", "");
RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ /* Icon colors. */
+ prop = RNA_def_property(srna, "icon_collection", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "icon_collection");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Collection", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop = RNA_def_property(srna, "icon_object", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "icon_object");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Object", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop = RNA_def_property(srna, "icon_object_data", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "icon_object_data");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Object Data", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop = RNA_def_property(srna, "icon_modifier", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "icon_modifier");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Modifier", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
+
+ prop = RNA_def_property(srna, "icon_shading", PROP_FLOAT, PROP_COLOR_GAMMA);
+ RNA_def_property_float_sdna(prop, NULL, "icon_shading");
+ RNA_def_property_array(prop, 4);
+ RNA_def_property_ui_text(prop, "Shading", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_common(StructRNA *srna)
@@ -3087,22 +3118,22 @@ static void rna_def_userdef_themes(BlenderRNA *brna)
PropertyRNA *prop;
static const EnumPropertyItem active_theme_area[] = {
- {0, "USER_INTERFACE", ICON_UI, "User Interface", ""},
+ {0, "USER_INTERFACE", ICON_WORKSPACE, "User Interface", ""},
{19, "STYLE", ICON_FONTPREVIEW, "Text Style", ""},
{18, "BONE_COLOR_SETS", ICON_COLOR, "Bone Color Sets", ""},
{1, "VIEW_3D", ICON_VIEW3D, "3D View", ""},
- {3, "GRAPH_EDITOR", ICON_IPO, "Graph Editor", ""},
+ {3, "GRAPH_EDITOR", ICON_GRAPH, "Graph Editor", ""},
{4, "DOPESHEET_EDITOR", ICON_ACTION, "Dope Sheet", ""},
{5, "NLA_EDITOR", ICON_NLA, "Nonlinear Animation", ""},
- {6, "IMAGE_EDITOR", ICON_IMAGE_COL, "UV/Image Editor", ""},
+ {6, "IMAGE_EDITOR", ICON_IMAGE, "UV/Image Editor", ""},
{7, "SEQUENCE_EDITOR", ICON_SEQUENCE, "Video Sequence Editor", ""},
{8, "TEXT_EDITOR", ICON_TEXT, "Text Editor", ""},
{9, "NODE_EDITOR", ICON_NODETREE, "Node Editor", ""},
- {11, "PROPERTIES", ICON_BUTS, "Properties", ""},
- {12, "OUTLINER", ICON_OOPS, "Outliner", ""},
+ {11, "PROPERTIES", ICON_PROPERTIES, "Properties", ""},
+ {12, "OUTLINER", ICON_OUTLINER, "Outliner", ""},
{14, "USER_PREFERENCES", ICON_PREFERENCES, "User Preferences", ""},
{15, "INFO", ICON_INFO, "Info", ""},
- {16, "FILE_BROWSER", ICON_FILESEL, "File Browser", ""},
+ {16, "FILE_BROWSER", ICON_FILEBROWSER, "File Browser", ""},
{17, "CONSOLE", ICON_CONSOLE, "Python Console", ""},
{20, "CLIP_EDITOR", ICON_CLIP, "Movie Clip Editor", ""},
{21, "TOPBAR", ICON_NONE, "Top Bar", ""},
@@ -3968,6 +3999,11 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "gp_settings", GP_PAINT_DOSIMPLIFY);
RNA_def_property_ui_text(prop, "Grease Pencil Simplify Stroke", "Simplify the final stroke");
+ prop = RNA_def_property(srna, "use_grease_pencil_reverse_layers", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "gp_settings", GP_PAINT_REVERSE_LAYERS);
+ RNA_def_property_ui_text(prop, "Layers list Top-Down",
+ "Order the grease pencil list of layers from Top to Down");
+
prop = RNA_def_property(srna, "grease_pencil_eraser_radius", PROP_INT, PROP_PIXEL);
RNA_def_property_int_sdna(prop, NULL, "gp_eraser");
RNA_def_property_range(prop, 1, 500);
diff --git a/source/blender/makesrna/intern/rna_workspace.c b/source/blender/makesrna/intern/rna_workspace.c
index e900b51c4eb..5504ca68c6d 100644
--- a/source/blender/makesrna/intern/rna_workspace.c
+++ b/source/blender/makesrna/intern/rna_workspace.c
@@ -294,7 +294,7 @@ static void rna_def_workspace(BlenderRNA *brna)
RNA_def_struct_sdna(srna, "WorkSpace");
RNA_def_struct_ui_text(srna, "Workspace", "Workspace data-block, defining the working environment for the user");
/* TODO: real icon, just to show something */
- RNA_def_struct_ui_icon(srna, ICON_SPLITSCREEN);
+ RNA_def_struct_ui_icon(srna, ICON_WORKSPACE);
prop = RNA_def_property(srna, "screens", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "layouts", NULL);
diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c
index a961208755d..c071559bffe 100644
--- a/source/blender/modifiers/intern/MOD_bevel.c
+++ b/source/blender/modifiers/intern/MOD_bevel.c
@@ -448,7 +448,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
if (set_wn_strength)
bevel_set_weighted_normal_face_strength(bm, scene);
- result = BKE_bmesh_to_mesh_nomain(bm, &(struct BMeshToMeshParams){0});
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BLI_assert(bm->vtoolflagpool == NULL &&
bm->etoolflagpool == NULL &&
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index db1078fa677..8619b4e020c 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -317,7 +317,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
MEM_freeN(looptris);
}
- result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0}));
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BM_mesh_free(bm);
diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c
index 9e35746c0a3..7af25a048f8 100644
--- a/source/blender/modifiers/intern/MOD_decimate.c
+++ b/source/blender/modifiers/intern/MOD_decimate.c
@@ -186,7 +186,7 @@ static Mesh *applyModifier(
/* update for display only */
dmd->face_count = bm->totface;
- result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0}));
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BLI_assert(bm->vtoolflagpool == NULL &&
bm->etoolflagpool == NULL &&
bm->ftoolflagpool == NULL); /* make sure we never alloc'd these */
diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c
index a8d4d55c5d3..58cbbbc7b4d 100644
--- a/source/blender/modifiers/intern/MOD_edgesplit.c
+++ b/source/blender/modifiers/intern/MOD_edgesplit.c
@@ -106,7 +106,7 @@ static Mesh *doEdgeSplit(Mesh *mesh, EdgeSplitModifierData *emd, const ModifierE
/* BM_mesh_validate(bm); */ /* for troubleshooting */
- result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0}));
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BM_mesh_free(bm);
result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index 5aa134fc7e1..a6afa39b870 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -299,7 +299,7 @@ static void meshdeformModifier_do(
*
* Only do this is the target object is in edit mode by itself, meaning
* we don't allow linked edit meshes here.
- * This is because editbmesh_get_derived_cage_and_final() might easily
+ * This is because editbmesh_get_mesh_cage_and_final() might easily
* conflict with the thread which evaluates object which is in the edit
* mode for this mesh.
*
diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c
index aeb2bfb2467..cbdee3c1560 100644
--- a/source/blender/modifiers/intern/MOD_particlesystem.c
+++ b/source/blender/modifiers/intern/MOD_particlesystem.c
@@ -162,7 +162,7 @@ static void deformVerts(
if (edit_btmesh) {
/* In edit mode get directly from the edit mesh. */
- psmd->mesh_original = BKE_bmesh_to_mesh_nomain(edit_btmesh->bm, &(struct BMeshToMeshParams){0});
+ psmd->mesh_original = BKE_mesh_from_bmesh_for_eval_nomain(edit_btmesh->bm, 0);
}
else {
/* Otherwise get regular mesh. */
diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c
index 94bd9ae2353..7864e888a48 100644
--- a/source/blender/modifiers/intern/MOD_shrinkwrap.c
+++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c
@@ -126,7 +126,7 @@ static void deformVertsEM(
Mesh *mesh_src = mesh;
if (mesh_src == NULL) {
- mesh_src = BKE_bmesh_to_mesh_nomain(editData->bm, &(struct BMeshToMeshParams){0});
+ mesh_src = BKE_mesh_from_bmesh_for_eval_nomain(editData->bm, 0);
}
BLI_assert(mesh_src->totvert == numVerts);
diff --git a/source/blender/modifiers/intern/MOD_skin.c b/source/blender/modifiers/intern/MOD_skin.c
index 31d556292f8..9e557b456d3 100644
--- a/source/blender/modifiers/intern/MOD_skin.c
+++ b/source/blender/modifiers/intern/MOD_skin.c
@@ -1880,7 +1880,7 @@ static Mesh *base_skin(Mesh *origmesh,
if (!bm)
return NULL;
- result = BKE_bmesh_to_mesh_nomain(bm, &(struct BMeshToMeshParams){0});
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BM_mesh_free(bm);
result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
diff --git a/source/blender/modifiers/intern/MOD_smooth.c b/source/blender/modifiers/intern/MOD_smooth.c
index 29508524f9c..87e40f86b95 100644
--- a/source/blender/modifiers/intern/MOD_smooth.c
+++ b/source/blender/modifiers/intern/MOD_smooth.c
@@ -232,7 +232,7 @@ static void deformVertsEM(
Mesh *mesh_src = mesh;
if (mesh_src == NULL) {
- mesh_src = BKE_bmesh_to_mesh_nomain(editData->bm, &(struct BMeshToMeshParams){0});
+ mesh_src = BKE_mesh_from_bmesh_for_eval_nomain(editData->bm, 0);
}
BLI_assert(mesh_src->totvert == numVerts);
diff --git a/source/blender/modifiers/intern/MOD_triangulate.c b/source/blender/modifiers/intern/MOD_triangulate.c
index d845246e1a1..6c38d208c02 100644
--- a/source/blender/modifiers/intern/MOD_triangulate.c
+++ b/source/blender/modifiers/intern/MOD_triangulate.c
@@ -53,7 +53,7 @@ static Mesh *triangulate_mesh(Mesh *mesh, const int quad_method, const int ngon_
BM_mesh_triangulate(bm, quad_method, ngon_method, false, NULL, NULL, NULL);
- result = BKE_bmesh_to_mesh_nomain(bm, &((struct BMeshToMeshParams){0}));
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BM_mesh_free(bm);
total_edges = result->totedge;
diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c
index 466e0b89a8a..d156f119eec 100644
--- a/source/blender/modifiers/intern/MOD_util.c
+++ b/source/blender/modifiers/intern/MOD_util.c
@@ -177,7 +177,7 @@ Mesh *MOD_get_mesh_eval(
}
else if (ob->type == OB_MESH) {
if (em) {
- mesh = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0});
+ mesh = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
}
else {
/* TODO(sybren): after modifier conversion of DM to Mesh is done, check whether
diff --git a/source/blender/modifiers/intern/MOD_warp.c b/source/blender/modifiers/intern/MOD_warp.c
index a8f305bcc13..0329300630a 100644
--- a/source/blender/modifiers/intern/MOD_warp.c
+++ b/source/blender/modifiers/intern/MOD_warp.c
@@ -332,7 +332,7 @@ static void deformVertsEM(
Mesh *mesh_src = mesh;
if (mesh_src == NULL) {
- mesh_src = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0});
+ mesh_src = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
}
BLI_assert(mesh_src->totvert == numVerts);
diff --git a/source/blender/modifiers/intern/MOD_wireframe.c b/source/blender/modifiers/intern/MOD_wireframe.c
index cc846d08040..15e26fb5c2e 100644
--- a/source/blender/modifiers/intern/MOD_wireframe.c
+++ b/source/blender/modifiers/intern/MOD_wireframe.c
@@ -93,7 +93,7 @@ static Mesh *WireframeModifier_do(WireframeModifierData *wmd, Object *ob, Mesh *
MAX2(ob->totcol - 1, 0),
false);
- result = BKE_bmesh_to_mesh_nomain(bm, &(struct BMeshToMeshParams){0});
+ result = BKE_mesh_from_bmesh_for_eval_nomain(bm, 0);
BM_mesh_free(bm);
result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
diff --git a/source/blender/python/bmesh/bmesh_py_api.c b/source/blender/python/bmesh/bmesh_py_api.c
index 7669f7eb1fd..235ede1e8fd 100644
--- a/source/blender/python/bmesh/bmesh_py_api.c
+++ b/source/blender/python/bmesh/bmesh_py_api.c
@@ -113,30 +113,30 @@ static PyObject *bpy_bm_from_edit_mesh(PyObject *UNUSED(self), PyObject *value)
}
PyDoc_STRVAR(bpy_bm_update_edit_mesh_doc,
-".. method:: update_edit_mesh(mesh, tessface=True, destructive=True)\n"
+".. method:: update_edit_mesh(mesh, loop_triangles=True, destructive=True)\n"
"\n"
" Update the mesh after changes to the BMesh in editmode, \n"
" optionally recalculating n-gon tessellation.\n"
"\n"
" :arg mesh: The editmode mesh.\n"
" :type mesh: :class:`bpy.types.Mesh`\n"
-" :arg tessface: Option to recalculate n-gon tessellation.\n"
-" :type tessface: boolean\n"
+" :arg loop_triangles: Option to recalculate n-gon tessellation.\n"
+" :type loop_triangles: boolean\n"
" :arg destructive: Use when geometry has been added or removed.\n"
" :type destructive: boolean\n"
);
static PyObject *bpy_bm_update_edit_mesh(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
- static const char *kwlist[] = {"mesh", "tessface", "destructive", NULL};
+ static const char *kwlist[] = {"mesh", "loop_triangles", "destructive", NULL};
PyObject *py_me;
Mesh *me;
- bool do_tessface = true;
+ bool do_loop_triangles = true;
bool is_destructive = true;
if (!PyArg_ParseTupleAndKeywords(
args, kw, "O|O&O&:update_edit_mesh", (char **)kwlist,
&py_me,
- PyC_ParseBool, &do_tessface,
+ PyC_ParseBool, &do_loop_triangles,
PyC_ParseBool, &is_destructive))
{
return NULL;
@@ -157,7 +157,7 @@ static PyObject *bpy_bm_update_edit_mesh(PyObject *UNUSED(self), PyObject *args,
{
extern void EDBM_update_generic(BMEditMesh *em, const bool do_tessface, const bool is_destructive);
- EDBM_update_generic(me->edit_btmesh, do_tessface, is_destructive);
+ EDBM_update_generic(me->edit_btmesh, do_loop_triangles, is_destructive);
}
Py_RETURN_NONE;
@@ -203,21 +203,17 @@ PyObject *BPyInit_bmesh(void)
/* bmesh.types */
PyModule_AddObject(mod, "types", (submodule = BPyInit_bmesh_types()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
/* bmesh.ops (not a real module, exposes module like access). */
PyModule_AddObject(mod, "ops", (submodule = BPyInit_bmesh_ops()));
/* PyDict_SetItemString(sys_modules, PyModule_GetNameObject(submodule), submodule); */
PyDict_SetItemString(sys_modules, "bmesh.ops", submodule); /* fake module */
- Py_INCREF(submodule);
PyModule_AddObject(mod, "utils", (submodule = BPyInit_bmesh_utils()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
PyModule_AddObject(mod, "geometry", (submodule = BPyInit_bmesh_geometry()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
return mod;
}
diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c
index b380fbd416e..3ce5a26de90 100644
--- a/source/blender/python/bmesh/bmesh_py_types.c
+++ b/source/blender/python/bmesh/bmesh_py_types.c
@@ -1246,15 +1246,15 @@ static PyObject *bpy_bmesh_calc_volume(BPy_BMElem *self, PyObject *args, PyObjec
}
}
-PyDoc_STRVAR(bpy_bmesh_calc_tessface_doc,
-".. method:: calc_tessface()\n"
+PyDoc_STRVAR(bpy_bmesh_calc_loop_triangles_doc,
+".. method:: calc_loop_triangles()\n"
"\n"
" Calculate triangle tessellation from quads/ngons.\n"
"\n"
" :return: The triangulated faces.\n"
" :rtype: list of :class:`BMLoop` tuples\n"
);
-static PyObject *bpy_bmesh_calc_tessface(BPy_BMElem *self)
+static PyObject *bpy_bmesh_calc_loop_triangles(BPy_BMElem *self)
{
BMesh *bm;
@@ -2733,7 +2733,7 @@ static struct PyMethodDef bpy_bmesh_methods[] = {
/* calculations */
{"calc_volume", (PyCFunction)bpy_bmesh_calc_volume, METH_VARARGS | METH_KEYWORDS, bpy_bmesh_calc_volume_doc},
- {"calc_tessface", (PyCFunction)bpy_bmesh_calc_tessface, METH_NOARGS, bpy_bmesh_calc_tessface_doc},
+ {"calc_loop_triangles", (PyCFunction)bpy_bmesh_calc_loop_triangles, METH_NOARGS, bpy_bmesh_calc_loop_triangles_doc},
{NULL, NULL, 0, NULL}
};
diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c
index a89525d942f..6e1c28e1310 100644
--- a/source/blender/python/generic/bgl.c
+++ b/source/blender/python/generic/bgl.c
@@ -480,14 +480,16 @@ int BGL_typeSize(int type)
static int gl_buffer_type_from_py_buffer(Py_buffer *pybuffer)
{
- const char format = PyC_Formatstr_get(pybuffer->format);
+ const char format = PyC_StructFmt_type_from_str(pybuffer->format);
Py_ssize_t itemsize = pybuffer->itemsize;
- if (PyC_Formatstr_is_float(format)) {
+ if (PyC_StructFmt_type_is_float_any(format)) {
if (itemsize == 4) return GL_FLOAT;
if (itemsize == 8) return GL_DOUBLE;
}
- if (PyC_Formatstr_is_byte(format) || PyC_Formatstr_is_int(format)) {
+ if (PyC_StructFmt_type_is_byte(format) ||
+ PyC_StructFmt_type_is_int_any(format))
+ {
if (itemsize == 1) return GL_BYTE;
if (itemsize == 2) return GL_SHORT;
if (itemsize == 4) return GL_INT;
diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c
index 918ec8fa018..072c11b14e5 100644
--- a/source/blender/python/generic/idprop_py_api.c
+++ b/source/blender/python/generic/idprop_py_api.c
@@ -422,11 +422,18 @@ static IDProperty *idp_from_PyBytes(const char *name, PyObject *ob)
return IDP_New(IDP_STRING, &val, name);
}
-static int idp_array_type_from_format_char(char format)
+static int idp_array_type_from_formatstr_and_size(const char *typestr, Py_ssize_t itemsize)
{
- if (format == 'i') return IDP_INT;
- if (format == 'f') return IDP_FLOAT;
- if (format == 'd') return IDP_DOUBLE;
+ char format = PyC_StructFmt_type_from_str(typestr);
+
+ if (PyC_StructFmt_type_is_float_any(format)) {
+ if (itemsize == 4) return IDP_FLOAT;
+ if (itemsize == 8) return IDP_DOUBLE;
+ }
+ if (PyC_StructFmt_type_is_int_any(format)) {
+ if (itemsize == 4) return IDP_INT;
+ }
+
return -1;
}
@@ -443,13 +450,13 @@ static IDProperty *idp_from_PySequence_Buffer(const char *name, Py_buffer *buffe
IDProperty *prop;
IDPropertyTemplate val = {0};
- int format = idp_array_type_from_format_char(*buffer->format);
- if (format == -1) {
+ int id_type = idp_array_type_from_formatstr_and_size(buffer->format, buffer->itemsize);
+ if (id_type == -1) {
/* should never happen as the type has been checked before */
return NULL;
}
else {
- val.array.type = format;
+ val.array.type = id_type;
val.array.len = buffer->len / buffer->itemsize;
}
prop = IDP_New(IDP_ARRAY, &val, name);
@@ -533,8 +540,10 @@ static IDProperty *idp_from_PySequence(const char *name, PyObject *ob)
if (PyObject_CheckBuffer(ob)) {
PyObject_GetBuffer(ob, &buffer, PyBUF_SIMPLE | PyBUF_FORMAT);
- char format = *buffer.format;
- if (ELEM(format, 'i', 'f', 'd')) {
+ char format = PyC_StructFmt_type_from_str(buffer.format);
+ if (PyC_StructFmt_type_is_float_any(format) ||
+ (PyC_StructFmt_type_is_int_any(format) && buffer.itemsize == 4))
+ {
use_buffer = true;
}
else {
@@ -1802,7 +1811,6 @@ PyObject *BPyInit_idprop(void)
/* idprop.types */
PyModule_AddObject(mod, "types", (submodule = BPyInit_idprop_types()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
return mod;
}
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index 62b24618d3f..991a035f683 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -1327,6 +1327,84 @@ uint32_t PyC_Long_AsU32(PyObject *value)
* PyC_Long_AsU64
*/
+/* -------------------------------------------------------------------- */
+
+/** \name Py_buffer Utils
+ *
+ * \{ */
+
+char PyC_StructFmt_type_from_str(const char *typestr)
+{
+ switch (typestr[0]) {
+ case '!':
+ case '<':
+ case '=':
+ case '>':
+ case '@':
+ return typestr[1];
+ default:
+ return typestr[0];
+ }
+}
+
+bool PyC_StructFmt_type_is_float_any(char format)
+{
+ switch (format) {
+ case 'f':
+ case 'd':
+ case 'e':
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool PyC_StructFmt_type_is_int_any(char format)
+{
+ switch (format) {
+ case 'i':
+ case 'I':
+ case 'l':
+ case 'L':
+ case 'h':
+ case 'H':
+ case 'b':
+ case 'B':
+ case 'q':
+ case 'Q':
+ case 'n':
+ case 'N':
+ case 'P':
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool PyC_StructFmt_type_is_byte(char format)
+{
+ switch (format) {
+ case 'c':
+ case 's':
+ case 'p':
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool PyC_StructFmt_type_is_bool(char format)
+{
+ switch (format) {
+ case '?':
+ return true;
+ default:
+ return false;
+ }
+}
+
+/** \} */
+
#ifdef __GNUC__
# pragma warning(pop)
#endif
diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h
index 609f8dc1bed..21e4ecf2e86 100644
--- a/source/blender/python/generic/py_capi_utils.h
+++ b/source/blender/python/generic/py_capi_utils.h
@@ -30,19 +30,19 @@
#include "BLI_sys_types.h"
#include "BLI_utildefines_variadic.h"
-void PyC_ObSpit(const char *name, PyObject *var);
-void PyC_ObSpitStr(char *result, size_t result_len, PyObject *var);
-void PyC_LineSpit(void);
-void PyC_StackSpit(void);
-PyObject * PyC_ExceptionBuffer(void);
-PyObject * PyC_ExceptionBuffer_Simple(void);
-PyObject * PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
-PyObject * PyC_FrozenSetFromStrings(const char **strings);
-PyObject * PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format, ...);
-void PyC_Err_PrintWithFunc(PyObject *py_func);
-
-void PyC_FileAndNum(const char **filename, int *lineno);
-void PyC_FileAndNum_Safe(const char **filename, int *lineno); /* checks python is running */
+void PyC_ObSpit(const char *name, PyObject *var);
+void PyC_ObSpitStr(char *result, size_t result_len, PyObject *var);
+void PyC_LineSpit(void);
+void PyC_StackSpit(void);
+PyObject *PyC_ExceptionBuffer(void);
+PyObject *PyC_ExceptionBuffer_Simple(void);
+PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
+PyObject *PyC_FrozenSetFromStrings(const char **strings);
+PyObject *PyC_Err_Format_Prefix(PyObject *exception_type_prefix, const char *format, ...);
+void PyC_Err_PrintWithFunc(PyObject *py_func);
+
+void PyC_FileAndNum(const char **filename, int *lineno);
+void PyC_FileAndNum_Safe(const char **filename, int *lineno); /* checks python is running */
int PyC_AsArray_FAST(
void *array, PyObject *value_fast, const Py_ssize_t length,
const PyTypeObject *type, const bool is_double, const char *error_prefix);
@@ -71,10 +71,10 @@ void PyC_Tuple_Fill(PyObject *tuple, PyObject *value);
void PyC_List_Fill(PyObject *list, PyObject *value);
/* follow http://www.python.org/dev/peps/pep-0383/ */
-PyObject * PyC_UnicodeFromByte(const char *str);
-PyObject * PyC_UnicodeFromByteAndSize(const char *str, Py_ssize_t size);
-const char * PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
-const char * PyC_UnicodeAsByteAndSize(PyObject *py_str, Py_ssize_t *size, PyObject **coerce);
+PyObject *PyC_UnicodeFromByte(const char *str);
+PyObject *PyC_UnicodeFromByteAndSize(const char *str, Py_ssize_t size);
+const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce); /* coerce must be NULL */
+const char *PyC_UnicodeAsByteAndSize(PyObject *py_str, Py_ssize_t *size, PyObject **coerce);
/* name namespace function for bpy */
PyObject *PyC_DefaultNameSpace(const char *filename);
@@ -132,74 +132,10 @@ Py_LOCAL_INLINE(int64_t) PyC_Long_AsI64(PyObject *value) { return (int64_t)PyLo
Py_LOCAL_INLINE(uint64_t) PyC_Long_AsU64(PyObject *value) { return (uint64_t)PyLong_AsUnsignedLongLong(value); }
/* utils for format string in `struct` module style syntax */
-Py_LOCAL_INLINE(char) PyC_Formatstr_get(const char *typestr)
-{
- switch (typestr[0]) {
- case '!':
- case '<':
- case '=':
- case '>':
- case '@':
- return typestr[1];
- default:
- return typestr[0];
- }
-}
-
-Py_LOCAL_INLINE(bool) PyC_Formatstr_is_float(char format)
-{
- switch (format) {
- case 'f':
- case 'd':
- case 'e':
- return true;
- default:
- return false;
- }
-}
-
-Py_LOCAL_INLINE(bool) PyC_Formatstr_is_int(char format)
-{
- switch (format) {
- case 'i':
- case 'I':
- case 'l':
- case 'L':
- case 'h':
- case 'H':
- case 'b':
- case 'B':
- case 'q':
- case 'Q':
- case 'n':
- case 'N':
- case 'P':
- return true;
- default:
- return false;
- }
-}
-
-Py_LOCAL_INLINE(bool) PyC_Formatstr_is_byte(char format)
-{
- switch (format) {
- case 'c':
- case 's':
- case 'p':
- return true;
- default:
- return false;
- }
-}
-
-Py_LOCAL_INLINE(bool) PyC_Formatstr_is_bool(char format)
-{
- switch (format) {
- case '?':
- return true;
- default:
- return false;
- }
-}
+char PyC_StructFmt_type_from_str(const char *typestr);
+bool PyC_StructFmt_type_is_float_any(char format);
+bool PyC_StructFmt_type_is_int_any(char format);
+bool PyC_StructFmt_type_is_byte(char format);
+bool PyC_StructFmt_type_is_bool(char format);
#endif /* __PY_CAPI_UTILS_H__ */
diff --git a/source/blender/python/gpu/gpu_py_api.c b/source/blender/python/gpu/gpu_py_api.c
index 8f22a287463..b75e63dbecc 100644
--- a/source/blender/python/gpu/gpu_py_api.c
+++ b/source/blender/python/gpu/gpu_py_api.c
@@ -63,7 +63,6 @@ static struct PyModuleDef GPU_module_def = {
PyObject *BPyInit_gpu(void)
{
PyObject *sys_modules = PyImport_GetModuleDict();
- PyObject *subsubmodule;
PyObject *submodule;
PyObject *mod;
@@ -71,23 +70,15 @@ PyObject *BPyInit_gpu(void)
PyModule_AddObject(mod, "types", (submodule = BPyInit_gpu_types()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
PyModule_AddObject(mod, "matrix", (submodule = BPyInit_gpu_matrix()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
PyModule_AddObject(mod, "select", (submodule = BPyInit_gpu_select()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
PyModule_AddObject(mod, "shader", (submodule = BPyInit_gpu_shader()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
-
- PyModule_AddObject(submodule, "builtin", (subsubmodule = BPyInit_gpu_shader_builtin()));
- PyDict_SetItem(sys_modules, PyModule_GetNameObject(subsubmodule), subsubmodule);
- Py_INCREF(subsubmodule);
return mod;
}
diff --git a/source/blender/python/gpu/gpu_py_element.c b/source/blender/python/gpu/gpu_py_element.c
index 379cd0836ca..10d6970e9e8 100644
--- a/source/blender/python/gpu/gpu_py_element.c
+++ b/source/blender/python/gpu/gpu_py_element.c
@@ -47,6 +47,7 @@
static PyObject *bpygpu_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
{
+ const char *error_prefix = "IndexBuf.__new__";
bool ok = true;
struct {
@@ -92,7 +93,7 @@ static PyObject *bpygpu_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args,
}
if (pybuffer.itemsize != 4 ||
- PyC_Formatstr_is_float(PyC_Formatstr_get(pybuffer.format)))
+ PyC_StructFmt_type_is_float_any(PyC_StructFmt_type_from_str(pybuffer.format)))
{
PyErr_Format(PyExc_ValueError,
"Each index must be an 4-bytes integer value");
@@ -122,8 +123,7 @@ static PyObject *bpygpu_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args,
PyBuffer_Release(&pybuffer);
}
else {
- PyObject *seq_fast = PySequence_Fast(
- params.seq, "Index Buffer Initialization");
+ PyObject *seq_fast = PySequence_Fast(params.seq, error_prefix);
if (seq_fast == NULL) {
return false;
@@ -148,28 +148,27 @@ static PyObject *bpygpu_IndexBuf_new(PyTypeObject *UNUSED(type), PyObject *args,
}
}
else {
+ int values[4];
for (uint i = 0; i < seq_len; i++) {
- PyObject *item = seq_items[i];
- if (!PyTuple_CheckExact(item)) {
- PyErr_Format(PyExc_ValueError,
- "expected a tuple, got %s",
- Py_TYPE(item)->tp_name);
- ok = false;
- goto finally;
- }
- if (PyTuple_GET_SIZE(item) != verts_per_prim) {
- PyErr_Format(PyExc_ValueError,
- "Expected a Tuple of size %d, got %d",
- PyTuple_GET_SIZE(item));
+ PyObject *seq_fast_item = PySequence_Fast(seq_items[i], error_prefix);
+ if (seq_fast_item == NULL) {
+ PyErr_Format(PyExc_TypeError,
+ "%s: expected a sequence, got %s",
+ error_prefix, Py_TYPE(seq_items[i])->tp_name);
ok = false;
goto finally;
}
- for (uint j = 0; j < verts_per_prim; j++) {
- GPU_indexbuf_add_generic_vert(
- &builder,
- PyC_Long_AsU32(PyTuple_GET_ITEM(item, j)));
+ ok = PyC_AsArray_FAST(
+ values, seq_fast_item, verts_per_prim,
+ &PyLong_Type, false, error_prefix) == 0;
+
+ if (ok) {
+ for (uint j = 0; j < verts_per_prim; j++) {
+ GPU_indexbuf_add_generic_vert(&builder, values[j]);
+ }
}
+ Py_DECREF(seq_fast_item);
}
}
diff --git a/source/blender/python/gpu/gpu_py_shader.c b/source/blender/python/gpu/gpu_py_shader.c
index 64b208ed49f..de19e8ab0cf 100644
--- a/source/blender/python/gpu/gpu_py_shader.c
+++ b/source/blender/python/gpu/gpu_py_shader.c
@@ -36,6 +36,7 @@
#include "../generic/python_utildefines.h"
#include "gpu_py_shader.h" /* own include */
+#include "gpu_py_vertex_format.h"
/* -------------------------------------------------------------------- */
@@ -43,45 +44,53 @@
/** \name Enum Conversion.
* \{ */
-static void bpygpu_shader_add_enum_objects(PyObject *submodule)
+static int bpygpu_ParseBultinShaderEnum(PyObject *o, void *p)
{
-#define ADDCONST(x) PyModule_AddIntConstant(submodule, #x, x)
-
- /* Shaders */
- ADDCONST(GPU_SHADER_2D_UNIFORM_COLOR);
- ADDCONST(GPU_SHADER_2D_FLAT_COLOR);
- ADDCONST(GPU_SHADER_2D_SMOOTH_COLOR);
- ADDCONST(GPU_SHADER_2D_IMAGE);
- ADDCONST(GPU_SHADER_3D_UNIFORM_COLOR);
- ADDCONST(GPU_SHADER_3D_FLAT_COLOR);
- ADDCONST(GPU_SHADER_3D_SMOOTH_COLOR);
-
-#undef ADDCONST
+ Py_ssize_t mode_id_len;
+ const char *mode_id = _PyUnicode_AsStringAndSize(o, &mode_id_len);
+ if (mode_id == NULL) {
+ PyErr_Format(PyExc_ValueError,
+ "expected a string, got %s",
+ Py_TYPE(o)->tp_name);
+ return 0;
+ }
+#define MATCH_ID(id) \
+ if (mode_id_len == (Py_ssize_t)strlen(STRINGIFY(id))) { \
+ if (STREQ(mode_id, STRINGIFY(id))) { \
+ mode = GPU_SHADER_##id; \
+ goto success; \
+ } \
+ } ((void)0)
+
+ GPUBuiltinShader mode;
+ MATCH_ID(2D_UNIFORM_COLOR);
+ MATCH_ID(2D_FLAT_COLOR);
+ MATCH_ID(2D_SMOOTH_COLOR);
+ MATCH_ID(2D_IMAGE);
+ MATCH_ID(3D_UNIFORM_COLOR);
+ MATCH_ID(3D_FLAT_COLOR);
+ MATCH_ID(3D_SMOOTH_COLOR);
+
+#undef MATCH_ID
+ PyErr_Format(PyExc_ValueError,
+ "unknown type literal: '%s'",
+ mode_id);
+ return 0;
+
+success:
+ (*(GPUBuiltinShader *)p) = mode;
+ return 1;
}
-static int bpygpu_pyLong_as_shader_enum(PyObject *o)
+static int bpygpu_uniform_location_get(GPUShader *shader, const char *name, const char *error_prefix)
{
- uint id = (uint)PyLong_AsUnsignedLong(o);
+ int uniform = GPU_shader_get_uniform(shader, name);
- if (id >= GPU_NUM_BUILTIN_SHADERS) {
- PyErr_SetString(PyExc_ValueError,
- "not a builtin shader identifier");
- return -1;
- }
-
- return (int)id;
-}
-
-static int bpygpu_uniform_location_get(const GPUShaderInterface *shaderface, const char *name)
-{
- const GPUShaderInput *uniform = GPU_shaderinterface_uniform(shaderface, name);
-
- if (uniform == NULL) {
- PyErr_SetString(PyExc_ValueError, "uniform not found");
- return -1;
+ if (uniform == -1) {
+ PyErr_Format(PyExc_ValueError, "%s: uniform %.32s %.32s not found", error_prefix, name);
}
- return uniform->location;
+ return uniform;
}
/** \} */
@@ -190,11 +199,10 @@ static PyObject *bpygpu_shader_uniform_from_name(
return NULL;
}
- int uniform = GPU_shader_get_uniform(self->shader, name);
+ int uniform = bpygpu_uniform_location_get(
+ self->shader, name, "GPUShader.get_uniform");
if (uniform == -1) {
- PyErr_SetString(PyExc_SyntaxError,
- "GPUShader.get_uniform: uniform not found.");
return NULL;
}
@@ -222,8 +230,8 @@ static PyObject *bpygpu_shader_uniform_block_from_name(
int uniform = GPU_shader_get_uniform_block(self->shader, name);
if (uniform == -1) {
- PyErr_SetString(PyExc_SyntaxError,
- "GPUShader.get_uniform_block: uniform not found");
+ PyErr_Format(PyExc_ValueError,
+ "GPUShader.get_uniform_block: uniform %.32s not found", name);
return NULL;
}
@@ -391,7 +399,9 @@ static PyObject *bpygpu_shader_uniform_bool(
return NULL;
}
- const int location = bpygpu_uniform_location_get(GPU_shader_get_interface(self->shader), params.id);
+ const int location = bpygpu_uniform_location_get(
+ self->shader, params.id, error_prefix);
+
if (location == -1) {
return NULL;
}
@@ -462,7 +472,9 @@ static PyObject *bpygpu_shader_uniform_float(
return NULL;
}
- const int location = bpygpu_uniform_location_get(GPU_shader_get_interface(self->shader), params.id);
+ const int location = bpygpu_uniform_location_get(
+ self->shader, params.id, error_prefix);
+
if (location == -1) {
return NULL;
}
@@ -530,7 +542,9 @@ static PyObject *bpygpu_shader_uniform_int(
return NULL;
}
- const int location = bpygpu_uniform_location_get(GPU_shader_get_interface(self->shader), params.id);
+ const int location = bpygpu_uniform_location_get(
+ self->shader, params.id, error_prefix);
+
if (location == -1) {
return NULL;
}
@@ -561,14 +575,29 @@ static PyObject *bpygpu_shader_attr_from_name(
int attrib = GPU_shader_get_attribute(self->shader, name);
if (attrib == -1) {
- PyErr_SetString(PyExc_SyntaxError,
- "GPUShader.attr_from_name: attribute not found.");
+ PyErr_Format(PyExc_ValueError,
+ "GPUShader.attr_from_name: attribute %.32s not found", name);
return NULL;
}
return PyLong_FromLong(attrib);
}
+PyDoc_STRVAR(bpygpu_shader_calc_format_doc,
+".. method:: calc_format()\n"
+"\n"
+" Build a new format based on the attributes of the shader.\n"
+"\n"
+" :return: vertex attribute format for the shader\n"
+" :rtype: GPUVertFormat\n"
+);
+static PyObject *bpygpu_shader_calc_format(BPyGPUShader *self, PyObject *UNUSED(arg))
+{
+ BPyGPUVertFormat *ret = (BPyGPUVertFormat *)BPyGPUVertFormat_CreatePyObject(NULL);
+ GPU_vertformat_from_interface(&ret->fmt, GPU_shader_get_interface(self->shader));
+ return (PyObject *)ret;
+}
+
static struct PyMethodDef bpygpu_shader_methods[] = {
{"bind", (PyCFunction)bpygpu_shader_bind,
METH_NOARGS, bpygpu_shader_bind_doc},
@@ -602,6 +631,9 @@ static struct PyMethodDef bpygpu_shader_methods[] = {
{"attr_from_name",
(PyCFunction)bpygpu_shader_attr_from_name,
METH_O, bpygpu_shader_attr_from_name_doc},
+ {"format_calc",
+ (PyCFunction)bpygpu_shader_calc_format,
+ METH_NOARGS, bpygpu_shader_calc_format_doc},
{NULL, NULL, 0, NULL}
};
@@ -697,15 +729,23 @@ static PyObject *bpygpu_shader_unbind(BPyGPUShader *UNUSED(self))
}
PyDoc_STRVAR(bpygpu_shader_from_builtin_doc,
-".. function:: shader_from_builtin(shader_id)\n"
-"\n"
-" :param shader_id: shader identifier.\n"
-" :type shader_id: int\n"
+".. function:: shader_from_builtin(shader_name)\n"
+"\n"
+" :param shader_name: One of these builtin shader names: {\n"
+" '2D_UNIFORM_COLOR',\n"
+" '2D_FLAT_COLOR',\n"
+" '2D_SMOOTH_COLOR',\n"
+" '2D_IMAGE',\n"
+" '3D_UNIFORM_COLOR',\n"
+" '3D_FLAT_COLOR',\n"
+" '3D_SMOOTH_COLOR'}\n"
+" :type shader_name: str\n"
);
static PyObject *bpygpu_shader_from_builtin(PyObject *UNUSED(self), PyObject *arg)
{
- int shader_id = bpygpu_pyLong_as_shader_enum(arg);
- if (shader_id == -1) {
+ GPUBuiltinShader shader_id;
+
+ if (!bpygpu_ParseBultinShaderEnum(arg, &shader_id)) {
return NULL;
}
@@ -715,15 +755,24 @@ static PyObject *bpygpu_shader_from_builtin(PyObject *UNUSED(self), PyObject *ar
}
PyDoc_STRVAR(bpygpu_shader_code_from_builtin_doc,
-".. function:: shader_code_from_builtin(shader_id)\n"
-"\n"
-" :param shader_id: shader identifier.\n"
-" :type shader_id: int\n"
+".. function:: shader_code_from_builtin(shader_name)\n"
+"\n"
+" :param shader_name: One of these builtin shader names: {\n"
+" '2D_UNIFORM_COLOR',\n"
+" '2D_FLAT_COLOR',\n"
+" '2D_SMOOTH_COLOR',\n"
+" '2D_IMAGE',\n"
+" '3D_UNIFORM_COLOR',\n"
+" '3D_FLAT_COLOR',\n"
+" '3D_SMOOTH_COLOR'}\n"
+" :type shader_name: str\n"
" :return: vertex, fragment and geometry shader codes.\n"
" :rtype: dict\n"
);
static PyObject *bpygpu_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyObject *arg)
{
+ GPUBuiltinShader shader_id;
+
const char *vert;
const char *frag;
const char *geom;
@@ -731,8 +780,7 @@ static PyObject *bpygpu_shader_code_from_builtin(BPyGPUShader *UNUSED(self), PyO
PyObject *item, *r_dict;
- int shader_id = bpygpu_pyLong_as_shader_enum(arg);
- if (shader_id == -1) {
+ if (!bpygpu_ParseBultinShaderEnum(arg, &shader_id)) {
return NULL;
}
@@ -786,23 +834,6 @@ static PyModuleDef BPyGPU_shader_module_def = {
/* -------------------------------------------------------------------- */
-/** \name gpu.shader.buitin Module API
- * \{ */
-
-PyDoc_STRVAR(bpygpu_shader_builtin_module_doc,
-"This module contains integers that identify the built-in shader ids."
-);
-static PyModuleDef BPyGPU_shader_builtin_module_def = {
- PyModuleDef_HEAD_INIT,
- .m_name = "gpu.shader.builtin",
- .m_doc = bpygpu_shader_builtin_module_doc,
-};
-
-/** \} */
-
-
-/* -------------------------------------------------------------------- */
-
/** \name Public API
* \{ */
@@ -826,14 +857,4 @@ PyObject *BPyInit_gpu_shader(void)
return submodule;
}
-PyObject *BPyInit_gpu_shader_builtin(void)
-{
- PyObject *submodule;
-
- submodule = PyModule_Create(&BPyGPU_shader_builtin_module_def);
- bpygpu_shader_add_enum_objects(submodule);
-
- return submodule;
-}
-
/** \} */
diff --git a/source/blender/python/gpu/gpu_py_shader.h b/source/blender/python/gpu/gpu_py_shader.h
index 4460fb1ccc7..c038cf63e40 100644
--- a/source/blender/python/gpu/gpu_py_shader.h
+++ b/source/blender/python/gpu/gpu_py_shader.h
@@ -37,6 +37,5 @@ typedef struct BPyGPUShader {
PyObject *BPyGPUShader_CreatePyObject(struct GPUShader *shader, bool is_builtin);
PyObject *BPyInit_gpu_shader(void);
-PyObject *BPyInit_gpu_shader_builtin(void);
#endif /* __GPU_PY_SHADER_H__ */
diff --git a/source/blender/python/gpu/gpu_py_vertex_buffer.c b/source/blender/python/gpu/gpu_py_vertex_buffer.c
index 0282154d681..0814e0586c9 100644
--- a/source/blender/python/gpu/gpu_py_vertex_buffer.c
+++ b/source/blender/python/gpu/gpu_py_vertex_buffer.c
@@ -72,9 +72,10 @@ static void fill_format_elem(void *data_dst_void, PyObject *py_src, const GPUVer
}
/* No error checking, callers must run PyErr_Occurred */
-static void fill_format_tuple(void *data_dst_void, PyObject *py_src, const GPUVertAttr *attr)
+static void fill_format_sequence(void *data_dst_void, PyObject *py_seq_fast, const GPUVertAttr *attr)
{
const uint len = attr->comp_len;
+ PyObject **value_fast_items = PySequence_Fast_ITEMS(py_seq_fast);
/**
* Args are constants, so range checks will be optimized out if they're nop's.
@@ -82,7 +83,7 @@ static void fill_format_tuple(void *data_dst_void, PyObject *py_src, const GPUVe
#define PY_AS_NATIVE(ty_dst, py_as_native) \
ty_dst *data_dst = data_dst_void; \
for (uint i = 0; i < len; i++) { \
- data_dst[i] = py_as_native(PyTuple_GET_ITEM(py_src, i)); \
+ data_dst[i] = py_as_native(value_fast_items[i]); \
} ((void)0)
PY_AS_NATIVE_SWITCH(attr);
@@ -96,7 +97,7 @@ static void fill_format_tuple(void *data_dst_void, PyObject *py_src, const GPUVe
static bool bpygpu_vertbuf_fill_impl(
GPUVertBuf *vbo,
- uint data_id, PyObject *seq)
+ uint data_id, PyObject *seq, const char *error_prefix)
{
const char *exc_str_size_mismatch = "Expected a %s of size %d, got %u";
@@ -157,23 +158,23 @@ static bool bpygpu_vertbuf_fill_impl(
else {
for (uint i = 0; i < seq_len; i++) {
uchar *data = (uchar *)GPU_vertbuf_raw_step(&data_step);
- PyObject *item = seq_items[i];
- if (!PyTuple_CheckExact(item)) {
- PyErr_Format(PyExc_ValueError,
- "expected a tuple, got %s",
- Py_TYPE(item)->tp_name);
+ PyObject *seq_fast_item = PySequence_Fast(seq_items[i], error_prefix);
+
+ if (seq_fast_item == NULL) {
ok = false;
goto finally;
}
- if (PyTuple_GET_SIZE(item) != attr->comp_len) {
+ if (PySequence_Fast_GET_SIZE(seq_fast_item) != attr->comp_len) {
PyErr_Format(PyExc_ValueError, exc_str_size_mismatch,
- "tuple", attr->comp_len, PyTuple_GET_SIZE(item));
+ "sequence", attr->comp_len, PySequence_Fast_GET_SIZE(seq_fast_item));
ok = false;
+ Py_DECREF(seq_fast_item);
goto finally;
}
/* May trigger error, check below */
- fill_format_tuple(data, item, attr);
+ fill_format_sequence(data, seq_fast_item, attr);
+ Py_DECREF(seq_fast_item);
}
}
@@ -188,7 +189,7 @@ finally:
return ok;
}
-static int bpygpu_fill_attribute(GPUVertBuf *buf, int id, PyObject *py_seq_data)
+static int bpygpu_fill_attribute(GPUVertBuf *buf, int id, PyObject *py_seq_data, const char *error_prefix)
{
if (id < 0 || id >= buf->format.attr_len) {
PyErr_Format(PyExc_ValueError,
@@ -203,7 +204,7 @@ static int bpygpu_fill_attribute(GPUVertBuf *buf, int id, PyObject *py_seq_data)
return 0;
}
- if (!bpygpu_vertbuf_fill_impl(buf, (uint)id, py_seq_data)) {
+ if (!bpygpu_vertbuf_fill_impl(buf, (uint)id, py_seq_data, error_prefix)) {
return 0;
}
@@ -309,7 +310,7 @@ static PyObject *bpygpu_VertBuf_fill_attribute(BPyGPUVertBuf *self, PyObject *ar
}
- if (!bpygpu_fill_attribute(self->buf, id, data)) {
+ if (!bpygpu_fill_attribute(self->buf, id, data, "GPUVertBuf.fill_attribute")) {
return NULL;
}
diff --git a/source/blender/python/gpu/gpu_py_vertex_format.c b/source/blender/python/gpu/gpu_py_vertex_format.c
index 65d41a7baf1..d42bb557cd9 100644
--- a/source/blender/python/gpu/gpu_py_vertex_format.c
+++ b/source/blender/python/gpu/gpu_py_vertex_format.c
@@ -160,36 +160,38 @@ static int get_default_fetch_mode(GPUVertCompType type)
/** \name VertFormat Type
* \{ */
-static int add_attribute_simple(GPUVertFormat *format, char *name, GPUVertCompType comp_type, int length)
+static bool bpygpu_vertformat_attr_add_simple(
+ GPUVertFormat *format, const char *name, GPUVertCompType comp_type, int length)
{
if (length <= 0) {
PyErr_SetString(PyExc_ValueError,
"length of an attribute must greater than 0");
- return 0;
+ return false;
}
int fetch_mode = get_default_fetch_mode(comp_type);
if (fetch_mode == -1) {
PyErr_SetString(PyExc_ValueError,
"no default fetch mode found");
- return 0;
+ return false;
}
GPU_vertformat_attr_add(format, name, comp_type, length, fetch_mode);
- return 1;
+ return true;
}
-static int add_attribute_from_tuple(GPUVertFormat *format, PyObject *data)
+static bool bpygpu_vertformat_attr_add_from_tuple(
+ GPUVertFormat *format, PyObject *data)
{
- char *name;
+ const char *name;
GPUVertCompType comp_type;
int length;
if (!PyArg_ParseTuple(data, "sO&i", &name, bpygpu_ParseVertCompType, &comp_type, &length)) {
- return 0;
+ return false;
}
- return add_attribute_simple(format, name, comp_type, length);
+ return bpygpu_vertformat_attr_add_simple(format, name, comp_type, length);
}
static PyObject *bpygpu_VertFormat_new(PyTypeObject *UNUSED(type), PyObject *args, PyObject *kwds)
@@ -308,7 +310,7 @@ bool bpygpu_vertformat_from_PyList(
return false;
}
- if (!add_attribute_from_tuple(r_fmt, element)) {
+ if (!bpygpu_vertformat_attr_add_from_tuple(r_fmt, element)) {
return false;
}
}
diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c
index 0db2fc189c1..fef3a0703d2 100644
--- a/source/blender/python/intern/bpy_props.c
+++ b/source/blender/python/intern/bpy_props.c
@@ -3203,11 +3203,6 @@ PyObject *BPY_rna_props(void)
submodule = PyModule_Create(&props_module);
PyDict_SetItemString(PyImport_GetModuleDict(), props_module.m_name, submodule);
- /* INCREF since its its assumed that all these functions return the
- * module with a new ref like PyDict_New, since they are passed to
- * PyModule_AddObject which steals a ref */
- Py_INCREF(submodule);
-
/* api needs the PyObjects internally */
submodule_dict = PyModule_GetDict(submodule);
diff --git a/source/blender/python/intern/bpy_utils_units.c b/source/blender/python/intern/bpy_utils_units.c
index cbd8b67d1ce..1d1108e1af0 100644
--- a/source/blender/python/intern/bpy_utils_units.c
+++ b/source/blender/python/intern/bpy_utils_units.c
@@ -323,7 +323,6 @@ PyObject *BPY_utils_units(void)
submodule = PyModule_Create(&bpyunits_module);
PyDict_SetItemString(PyImport_GetModuleDict(), bpyunits_module.m_name, submodule);
- Py_INCREF(submodule);
/* Finalize our unit systems and types structseq definitions! */
diff --git a/source/blender/python/mathutils/mathutils.c b/source/blender/python/mathutils/mathutils.c
index 566bac9cb09..07905d2be89 100644
--- a/source/blender/python/mathutils/mathutils.c
+++ b/source/blender/python/mathutils/mathutils.c
@@ -645,30 +645,25 @@ PyMODINIT_FUNC PyInit_mathutils(void)
* 'from mathutils.geometry import PolyFill'
* ...fails without this. */
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
PyModule_AddObject(mod, "interpolate", (submodule = PyInit_mathutils_interpolate()));
/* XXX, python doesnt do imports with this usefully yet
* 'from mathutils.geometry import PolyFill'
* ...fails without this. */
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
#ifndef MATH_STANDALONE
/* Noise submodule */
PyModule_AddObject(mod, "noise", (submodule = PyInit_mathutils_noise()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
/* BVHTree submodule */
PyModule_AddObject(mod, "bvhtree", (submodule = PyInit_mathutils_bvhtree()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
/* KDTree submodule */
PyModule_AddObject(mod, "kdtree", (submodule = PyInit_mathutils_kdtree()));
PyDict_SetItem(sys_modules, PyModule_GetNameObject(submodule), submodule);
- Py_INCREF(submodule);
#endif
mathutils_matrix_row_cb_index = Mathutils_RegisterCallback(&mathutils_matrix_row_cb);
diff --git a/source/blender/render/intern/source/bake_api.c b/source/blender/render/intern/source/bake_api.c
index f60105e029d..12c13bcac81 100644
--- a/source/blender/render/intern/source/bake_api.c
+++ b/source/blender/render/intern/source/bake_api.c
@@ -86,9 +86,6 @@
#include "render_types.h"
#include "zbuf.h"
-/* Remove when Cycles moves from MFace to MLoopTri */
-#define USE_MFACE_WORKAROUND
-
typedef struct BakeDataZSpan {
BakePixel *pixel_array;
int primitive_id;
@@ -393,27 +390,6 @@ static bool cast_ray_highpoly(
return hit_mesh != -1;
}
-#ifdef USE_MFACE_WORKAROUND
-/**
- * Until cycles moves to #MLoopTri, we need to keep face-rotation in sync with #test_index_face
- *
- * We only need to consider quads since #BKE_mesh_recalc_tessellation doesn't execute this on triangles.
- */
-static void test_index_face_looptri(const MPoly *mp, MLoop *mloop, MLoopTri *lt)
-{
- if (mp->totloop == 4) {
- if (UNLIKELY((mloop[mp->loopstart + 2].v == 0) ||
- (mloop[mp->loopstart + 3].v == 0)))
- {
- /* remap: (2, 3, 0, 1) */
- unsigned int l = mp->loopstart;
- ARRAY_SET_ITEMS(lt[0].tri, l + 2, l + 3, l + 0);
- ARRAY_SET_ITEMS(lt[1].tri, l + 2, l + 0, l + 1);
- }
- }
-}
-#endif
-
/**
* This function populates an array of verts for the triangles of a mesh
* Tangent and Normals are also stored
@@ -433,10 +409,6 @@ static TriTessFace *mesh_calc_tri_tessface(
unsigned int mpoly_prev = UINT_MAX;
float no[3];
-#ifdef USE_MFACE_WORKAROUND
- unsigned int mpoly_prev_testindex = UINT_MAX;
-#endif
-
mvert = CustomData_get_layer(&me->vdata, CD_MVERT);
looptri = MEM_mallocN(sizeof(*looptri) * tottri, __func__);
triangles = MEM_mallocN(sizeof(TriTessFace) * tottri, __func__);
@@ -463,13 +435,6 @@ static TriTessFace *mesh_calc_tri_tessface(
const MLoopTri *lt = &looptri[i];
const MPoly *mp = &me->mpoly[lt->poly];
-#ifdef USE_MFACE_WORKAROUND
- if (lt->poly != mpoly_prev_testindex) {
- test_index_face_looptri(mp, me->mloop, &looptri[i]);
- mpoly_prev_testindex = lt->poly;
- }
-#endif
-
triangles[i].mverts[0] = &mvert[me->mloop[lt->tri[0]].v];
triangles[i].mverts[1] = &mvert[me->mloop[lt->tri[1]].v];
triangles[i].mverts[2] = &mvert[me->mloop[lt->tri[2]].v];
@@ -662,9 +627,6 @@ void RE_bake_pixels_populate(
const MLoopUV *mloopuv;
const int tottri = poly_to_tri_count(me->totpoly, me->totloop);
MLoopTri *looptri;
-#ifdef USE_MFACE_WORKAROUND
- unsigned int mpoly_prev_testindex = UINT_MAX;
-#endif
if ((uv_layer == NULL) || (uv_layer[0] == '\0')) {
mloopuv = CustomData_get_layer(&me->ldata, CD_MLOOPUV);
@@ -714,13 +676,6 @@ void RE_bake_pixels_populate(
bd.bk_image = &bake_images->data[image_id];
bd.primitive_id = ++p_id;
-#ifdef USE_MFACE_WORKAROUND
- if (lt->poly != mpoly_prev_testindex) {
- test_index_face_looptri(mp, me->mloop, &looptri[i]);
- mpoly_prev_testindex = lt->poly;
- }
-#endif
-
for (a = 0; a < 3; a++) {
const float *uv = mloopuv[lt->tri[a]].uv;
diff --git a/source/blender/shader_fx/CMakeLists.txt b/source/blender/shader_fx/CMakeLists.txt
index 89defbd4ac7..1807635aa8d 100644
--- a/source/blender/shader_fx/CMakeLists.txt
+++ b/source/blender/shader_fx/CMakeLists.txt
@@ -46,6 +46,7 @@ set(SRC
intern/FX_shader_blur.c
intern/FX_shader_colorize.c
intern/FX_shader_flip.c
+ intern/FX_shader_glow.c
intern/FX_shader_light.c
intern/FX_shader_pixel.c
intern/FX_shader_rim.c
diff --git a/source/blender/shader_fx/FX_shader_types.h b/source/blender/shader_fx/FX_shader_types.h
index 57b9ae71146..311f5ec52e8 100644
--- a/source/blender/shader_fx/FX_shader_types.h
+++ b/source/blender/shader_fx/FX_shader_types.h
@@ -35,6 +35,7 @@ extern ShaderFxTypeInfo shaderfx_Type_None;
extern ShaderFxTypeInfo shaderfx_Type_Blur;
extern ShaderFxTypeInfo shaderfx_Type_Colorize;
extern ShaderFxTypeInfo shaderfx_Type_Flip;
+extern ShaderFxTypeInfo shaderfx_Type_Glow;
extern ShaderFxTypeInfo shaderfx_Type_Light;
extern ShaderFxTypeInfo shaderfx_Type_Pixel;
extern ShaderFxTypeInfo shaderfx_Type_Rim;
diff --git a/source/blender/shader_fx/intern/FX_shader_glow.c b/source/blender/shader_fx/intern/FX_shader_glow.c
new file mode 100644
index 00000000000..cd513ed1f0a
--- /dev/null
+++ b/source/blender/shader_fx/intern/FX_shader_glow.c
@@ -0,0 +1,78 @@
+/*
+ * ***** 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) 2018, Blender Foundation
+ * This is a new part of Blender
+ *
+ * Contributor(s): Antonio Vazquez
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file blender/shader_fx/intern/FX_shader_glow.c
+ * \ingroup shader_fx
+ */
+
+#include <stdio.h>
+
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+#include "DNA_gpencil_types.h"
+
+#include "BLI_math_base.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_library_query.h"
+#include "BKE_modifier.h"
+#include "BKE_shader_fx.h"
+
+#include "FX_shader_types.h"
+
+static void initData(ShaderFxData *md)
+{
+ GlowShaderFxData *gpfx = (GlowShaderFxData *)md;
+ ARRAY_SET_ITEMS(gpfx->glow_color, 0.75f, 1.0f, 1.0f);
+ ARRAY_SET_ITEMS(gpfx->select_color, 0.0f, 0.0f, 0.0f);
+ gpfx->threshold = 0.1f;
+
+ ARRAY_SET_ITEMS(gpfx->blur, 50, 0);
+ gpfx->samples = 16;
+}
+
+static void copyData(const ShaderFxData *md, ShaderFxData *target)
+{
+ BKE_shaderfx_copyData_generic(md, target);
+}
+
+ShaderFxTypeInfo shaderfx_Type_Glow = {
+ /* name */ "Glow",
+ /* structName */ "GlowShaderFxData",
+ /* structSize */ sizeof(GlowShaderFxData),
+ /* type */ eShaderFxType_GpencilType,
+ /* flags */ 0,
+
+ /* copyData */ copyData,
+
+ /* initData */ initData,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepsgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
+};
diff --git a/source/blender/shader_fx/intern/FX_shader_util.c b/source/blender/shader_fx/intern/FX_shader_util.c
index d5cbdc69ba3..b74ff45b991 100644
--- a/source/blender/shader_fx/intern/FX_shader_util.c
+++ b/source/blender/shader_fx/intern/FX_shader_util.c
@@ -46,6 +46,7 @@ void shaderfx_type_init(ShaderFxTypeInfo *types[])
INIT_FX_TYPE(Blur);
INIT_FX_TYPE(Colorize);
INIT_FX_TYPE(Flip);
+ INIT_FX_TYPE(Glow);
INIT_FX_TYPE(Light);
INIT_FX_TYPE(Pixel);
INIT_FX_TYPE(Rim);
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index 965b1870838..1195348ed0d 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -1725,7 +1725,7 @@ static int wm_homefile_read_exec(bContext *C, wmOperator *op)
static int wm_homefile_read_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *UNUSED(event))
{
/* Draw menu which includes default startup and application templates. */
- uiPopupMenu *pup = UI_popup_menu_begin(C, IFACE_("New File"), ICON_FILE);
+ uiPopupMenu *pup = UI_popup_menu_begin(C, IFACE_("New File"), ICON_FILE_NEW);
uiLayout *layout = UI_popup_menu_layout(pup);
MenuType *mt = WM_menutype_find("TOPBAR_MT_file_new", false);
@@ -2166,7 +2166,7 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
{
Main *bmain = CTX_data_main(C);
char path[FILE_MAX];
- int fileflags;
+ int fileflags, orig_fileflags;
save_set_compress(op);
@@ -2178,6 +2178,7 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
wm_filepath_default(path);
}
+ orig_fileflags = G.fileflags;
fileflags = G.fileflags & ~G_FILE_USERPREFS;
/* set compression flag */
@@ -2193,8 +2194,18 @@ static int wm_save_as_mainfile_exec(bContext *C, wmOperator *op)
RNA_boolean_get(op->ptr, "copy")),
G_FILE_SAVE_COPY);
- if (wm_file_write(C, path, fileflags, op->reports) != 0)
+ int write_result = wm_file_write(C, path, fileflags, op->reports);
+
+ if ((op->flag & OP_IS_INVOKE) == 0) {
+ /* OP_IS_INVOKE is set when the operator is called from the GUI.
+ * If it is not set, the operator is called from a script and
+ * shouldn't influence G.fileflags. */
+ G.fileflags = orig_fileflags;
+ }
+
+ if (write_result != 0) {
return OPERATOR_CANCELLED;
+ }
WM_event_add_notifier(C, NC_WM | ND_FILESAVE, NULL);
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 0b5fd186e7a..e3c96ff926c 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -2053,16 +2053,16 @@ static void radial_control_paint_tex(RadialControl *rc, float radius, float alph
/* draw textured quad */
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texCoord, 0, 0);
+ immAttr2f(texCoord, 0, 0);
immVertex2f(pos, -radius, -radius);
- immAttrib2f(texCoord, 1, 0);
+ immAttr2f(texCoord, 1, 0);
immVertex2f(pos, radius, -radius);
- immAttrib2f(texCoord, 1, 1);
+ immAttr2f(texCoord, 1, 1);
immVertex2f(pos, radius, radius);
- immAttrib2f(texCoord, 0, 1);
+ immAttr2f(texCoord, 0, 1);
immVertex2f(pos, -radius, radius);
immEnd();
diff --git a/source/blender/windowmanager/intern/wm_stereo.c b/source/blender/windowmanager/intern/wm_stereo.c
index aa85dbc04b4..6b6b3bc3cbb 100644
--- a/source/blender/windowmanager/intern/wm_stereo.c
+++ b/source/blender/windowmanager/intern/wm_stereo.c
@@ -106,16 +106,16 @@ void wm_stereo3d_draw_interlace(wmWindow *win, ARegion *ar)
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texcoord, halfx, halfy);
+ immAttr2f(texcoord, halfx, halfy);
immVertex2f(pos, ar->winrct.xmin, ar->winrct.ymin);
- immAttrib2f(texcoord, 1.0f + halfx, halfy);
+ immAttr2f(texcoord, 1.0f + halfx, halfy);
immVertex2f(pos, ar->winrct.xmax + 1, ar->winrct.ymin);
- immAttrib2f(texcoord, 1.0f + halfx, 1.0f + halfy);
+ immAttr2f(texcoord, 1.0f + halfx, 1.0f + halfy);
immVertex2f(pos, ar->winrct.xmax + 1, ar->winrct.ymax + 1);
- immAttrib2f(texcoord, halfx, 1.0f + halfy);
+ immAttr2f(texcoord, halfx, 1.0f + halfy);
immVertex2f(pos, ar->winrct.xmin, ar->winrct.ymax + 1);
immEnd();
@@ -190,16 +190,16 @@ void wm_stereo3d_draw_sidebyside(wmWindow *win, int view)
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texcoord, halfx, halfy);
+ immAttr2f(texcoord, halfx, halfy);
immVertex2f(pos, soffx, 0.0f);
- immAttrib2f(texcoord, 1.0f + halfx, halfy);
+ immAttr2f(texcoord, 1.0f + halfx, halfy);
immVertex2f(pos, soffx + (sizex * 0.5f), 0.0f);
- immAttrib2f(texcoord, 1.0f + halfx, 1.0f + halfy);
+ immAttr2f(texcoord, 1.0f + halfx, 1.0f + halfy);
immVertex2f(pos, soffx + (sizex * 0.5f), sizey);
- immAttrib2f(texcoord, halfx, 1.0f + halfy);
+ immAttr2f(texcoord, halfx, 1.0f + halfy);
immVertex2f(pos, soffx, sizey);
immEnd();
@@ -234,16 +234,16 @@ void wm_stereo3d_draw_topbottom(wmWindow *win, int view)
immBegin(GPU_PRIM_TRI_FAN, 4);
- immAttrib2f(texcoord, halfx, halfy);
+ immAttr2f(texcoord, halfx, halfy);
immVertex2f(pos, 0.0f, soffy);
- immAttrib2f(texcoord, 1.0f + halfx, halfy);
+ immAttr2f(texcoord, 1.0f + halfx, halfy);
immVertex2f(pos, sizex, soffy);
- immAttrib2f(texcoord, 1.0f + halfx, 1.0f + halfy);
+ immAttr2f(texcoord, 1.0f + halfx, 1.0f + halfy);
immVertex2f(pos, sizex, soffy + (sizey * 0.5f));
- immAttrib2f(texcoord, halfx, 1.0f + halfy);
+ immAttr2f(texcoord, halfx, 1.0f + halfy);
immVertex2f(pos, 0.0f, soffy + (sizey * 0.5f));
immEnd();