chore: checkpoint web Blender migration source, tools and docs
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled

Accumulated uncommitted work: GHOST Web backend, WebGL/GPU web layer,
web workflow engine and protocol, tooling, docs and task records.
Large generated evidence, user-testing archives, build snapshots and
imported test assets remain untracked.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
mes123456
2026-11-10 11:18:01 +08:00
parent 122142c26c
commit f3e21c6b98
6887 changed files with 257154 additions and 12294 deletions

View File

@@ -211,15 +211,45 @@ if(WITH_WEB)
intern/MOD_cast_web.cc
intern/MOD_boolean.cc
intern/MOD_build.cc
intern/MOD_cloth.cc
intern/MOD_curve.cc
intern/MOD_decimate.cc
intern/MOD_displace_web.cc
intern/MOD_edgesplit.cc
intern/MOD_fluid.cc
intern/MOD_grease_pencil_armature.cc
intern/MOD_grease_pencil_array.cc
intern/MOD_grease_pencil_build.cc
intern/MOD_grease_pencil_color.cc
intern/MOD_grease_pencil_dash.cc
intern/MOD_grease_pencil_envelope.cc
intern/MOD_grease_pencil_hook.cc
intern/MOD_grease_pencil_lattice.cc
intern/MOD_grease_pencil_length.cc
intern/MOD_grease_pencil_mirror.cc
intern/MOD_grease_pencil_multiply.cc
intern/MOD_grease_pencil_noise.cc
intern/MOD_grease_pencil_offset.cc
intern/MOD_grease_pencil_opacity.cc
intern/MOD_grease_pencil_outline.cc
intern/MOD_grease_pencil_shrinkwrap.cc
intern/MOD_grease_pencil_simplify.cc
intern/MOD_grease_pencil_smooth.cc
intern/MOD_grease_pencil_subdiv.cc
intern/MOD_grease_pencil_texture.cc
intern/MOD_grease_pencil_thickness.cc
intern/MOD_grease_pencil_time.cc
intern/MOD_grease_pencil_tint.cc
intern/MOD_grease_pencil_util.cc
intern/MOD_grease_pencil_weight_angle.cc
intern/MOD_grease_pencil_weight_proximity.cc
intern/MOD_hook.cc
intern/MOD_lattice.cc
intern/MOD_lineart.cc
intern/MOD_mirror.cc
intern/MOD_meshdeform.cc
intern/MOD_nodes_web.cc
intern/MOD_nodes.cc
intern/MOD_ui_common.cc
intern/MOD_particlesystem.cc
intern/MOD_none.cc
intern/MOD_screw.cc
@@ -238,6 +268,11 @@ if(WITH_WEB)
intern/MOD_weld.cc
intern/MOD_wireframe.cc
intern/lineart/lineart_chain.cc
intern/lineart/lineart_cpu.cc
intern/lineart/lineart_shadow.cc
intern/lineart/lineart_util.cc
MOD_modifiertypes.hh
intern/MOD_solidify_util.hh
intern/MOD_util.hh
@@ -246,6 +281,8 @@ endif()
# So we can have special tricks in modifier system.
list(APPEND SRC intern/MOD_nodes_storage.cc MOD_nodes_storage.hh)
blender_add_lib(bf_modifiers "${SRC}" "${INC}" "${INC_SYS}" "${LIB}")
# RNA_prototypes.hh

View File

@@ -0,0 +1,14 @@
/* SPDX-FileCopyrightText: 2026 Blender Authors
* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
namespace blender {
struct BlendDataReader;
struct BlendWriter;
struct NodesModifierData;
void nodes_modifier_storage_write(BlendWriter *writer, const NodesModifierData &nmd);
void nodes_modifier_storage_read(BlendDataReader *reader, NodesModifierData &nmd);
void nodes_modifier_storage_copy(const NodesModifierData &source, NodesModifierData &target);
void nodes_modifier_storage_free(NodesModifierData &nmd);
} // namespace blender

View File

@@ -271,7 +271,11 @@ ModifierTypeInfo modifierType_Cloth = {
/*name*/ N_("Cloth"),
/*struct_name*/ "ClothModifierData",
/*struct_size*/ sizeof(ClothModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_ClothModifier,
#endif
/*type*/ ModifierTypeType::OnlyDeform,
/*flags*/ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_UsesPointCache |
eModifierTypeFlag_Single,
@@ -296,7 +300,11 @@ ModifierTypeInfo modifierType_Cloth = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ nullptr,
/*blend_read*/ nullptr,
/*foreach_cache*/ nullptr,

View File

@@ -244,7 +244,11 @@ ModifierTypeInfo modifierType_Fluid = {
/*name*/ N_("Fluid"),
/*struct_name*/ "FluidModifierData",
/*struct_size*/ sizeof(FluidModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_FluidModifier,
#endif
/*type*/ ModifierTypeType::Constructive,
/*flags*/ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_Single,
/*icon*/ ICON_MOD_FLUIDSIM,
@@ -266,9 +270,17 @@ ModifierTypeInfo modifierType_Fluid = {
/*depends_on_time*/ depends_on_time,
/*depends_on_normals*/ nullptr,
/*foreach_ID_link*/ foreach_ID_link,
#ifdef WITH_WEB
/*foreach_tex_link*/ nullptr,
#else
/*foreach_tex_link*/ foreach_tex_link,
#endif
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ nullptr,
/*blend_read*/ nullptr,
/*foreach_cache*/ nullptr,

View File

@@ -311,7 +311,11 @@ ModifierTypeInfo modifierType_GreasePencilArmature = {
/*name*/ N_("Armature"),
/*struct_name*/ "GreasePencilArmatureModifierData",
/*struct_size*/ sizeof(GreasePencilArmatureModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilArmatureModifier,
#endif
/*type*/ ModifierTypeType::OnlyDeform,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -336,7 +340,11 @@ ModifierTypeInfo modifierType_GreasePencilArmature = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -354,7 +354,11 @@ ModifierTypeInfo modifierType_GreasePencilArray = {
/*name*/ N_("Array"),
/*struct_name*/ "GreasePencilArrayModifierData",
/*struct_size*/ sizeof(GreasePencilArrayModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilArrayModifier,
#endif
/*type*/ ModifierTypeType::Constructive,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -379,7 +383,11 @@ ModifierTypeInfo modifierType_GreasePencilArray = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -870,7 +870,11 @@ ModifierTypeInfo modifierType_GreasePencilBuild = {
/*name*/ N_("Build"),
/*struct_name*/ "GreasePencilBuildModifierData",
/*struct_size*/ sizeof(GreasePencilBuildModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilBuildModifier,
#endif
/*type*/ ModifierTypeType::Nonconstructive,
/*flags*/
eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_EnableInEditmode |
@@ -896,7 +900,11 @@ ModifierTypeInfo modifierType_GreasePencilBuild = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -255,7 +255,11 @@ ModifierTypeInfo modifierType_GreasePencilColor = {
/*name*/ N_("Color"),
/*struct_name*/ "GreasePencilColorModifierData",
/*struct_size*/ sizeof(GreasePencilColorModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilColorModifier,
#endif
/*type*/ ModifierTypeType::NonGeometrical,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -280,7 +284,11 @@ ModifierTypeInfo modifierType_GreasePencilColor = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -522,7 +522,11 @@ ModifierTypeInfo modifierType_GreasePencilDash = {
/*name*/ N_("Dot Dash"),
/*struct_name*/ "GreasePencilDashModifierData",
/*struct_size*/ sizeof(GreasePencilDashModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilDashModifierData,
#endif
/*type*/ ModifierTypeType::Nonconstructive,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -547,7 +551,11 @@ ModifierTypeInfo modifierType_GreasePencilDash = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -732,7 +732,11 @@ ModifierTypeInfo modifierType_GreasePencilEnvelope = {
/*name*/ N_("Envelope"),
/*struct_name*/ "GreasePencilEnvelopeModifierData",
/*struct_size*/ sizeof(GreasePencilEnvelopeModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilEnvelopeModifier,
#endif
/*type*/ ModifierTypeType::Nonconstructive,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -757,7 +761,11 @@ ModifierTypeInfo modifierType_GreasePencilEnvelope = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -320,7 +320,11 @@ ModifierTypeInfo modifierType_GreasePencilHook = {
/*name*/ N_("Hook"),
/*struct_name*/ "GreasePencilHookModifierData",
/*struct_size*/ sizeof(GreasePencilHookModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilHookModifier,
#endif
/*type*/ ModifierTypeType::OnlyDeform,
/*flags*/
eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
@@ -346,7 +350,11 @@ ModifierTypeInfo modifierType_GreasePencilHook = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -197,7 +197,11 @@ ModifierTypeInfo modifierType_GreasePencilLattice = {
/*name*/ N_("Lattice"),
/*struct_name*/ "GreasePencilLatticeModifierData",
/*struct_size*/ sizeof(GreasePencilLatticeModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilLatticeModifier,
#endif
/*type*/ ModifierTypeType::OnlyDeform,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -222,7 +226,11 @@ ModifierTypeInfo modifierType_GreasePencilLattice = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
/*foreach_cache*/ nullptr,

View File

@@ -334,7 +334,11 @@ ModifierTypeInfo modifierType_GreasePencilLength = {
/*name*/ N_("Length"),
/*struct_name*/ "GreasePencilLengthModifierData",
/*struct_size*/ sizeof(GreasePencilLengthModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilLengthModifier,
#endif
/*type*/ ModifierTypeType::Nonconstructive,
/*flags*/
eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_EnableInEditmode |
@@ -360,7 +364,11 @@ ModifierTypeInfo modifierType_GreasePencilLength = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -257,7 +257,11 @@ ModifierTypeInfo modifierType_GreasePencilMirror = {
/*name*/ N_("Mirror"),
/*struct_name*/ "GreasePencilMirrorModifierData",
/*struct_size*/ sizeof(GreasePencilMirrorModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilMirrorModifier,
#endif
/*type*/ ModifierTypeType::Constructive,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -282,7 +286,11 @@ ModifierTypeInfo modifierType_GreasePencilMirror = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -297,7 +297,11 @@ ModifierTypeInfo modifierType_GreasePencilMultiply = {
/*name*/ N_("Multiple Strokes"),
/*struct_name*/ "GreasePencilMultiModifierData",
/*struct_size*/ sizeof(GreasePencilMultiModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilMultiplyModifier,
#endif
/*type*/ ModifierTypeType::Constructive,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -322,7 +326,11 @@ ModifierTypeInfo modifierType_GreasePencilMultiply = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -331,7 +331,11 @@ ModifierTypeInfo modifierType_GreasePencilNoise = {
/*name*/ N_("Noise"),
/*struct_name*/ "GreasePencilNoiseModifierData",
/*struct_size*/ sizeof(GreasePencilNoiseModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilNoiseModifier,
#endif
/*type*/ ModifierTypeType::OnlyDeform,
/*flags*/
(eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
@@ -357,7 +361,11 @@ ModifierTypeInfo modifierType_GreasePencilNoise = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -480,7 +480,11 @@ ModifierTypeInfo modifierType_GreasePencilOffset = {
/*name*/ N_("Offset"),
/*struct_name*/ "GreasePencilOffsetModifierData",
/*struct_size*/ sizeof(GreasePencilOffsetModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilOffsetModifier,
#endif
/*type*/ ModifierTypeType::OnlyDeform,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -505,7 +509,11 @@ ModifierTypeInfo modifierType_GreasePencilOffset = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -295,7 +295,11 @@ ModifierTypeInfo modifierType_GreasePencilOpacity = {
/*name*/ N_("Opacity"),
/*struct_name*/ "GreasePencilOpacityModifierData",
/*struct_size*/ sizeof(GreasePencilOpacityModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilOpacityModifier,
#endif
/*type*/ ModifierTypeType::NonGeometrical,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -320,7 +324,11 @@ ModifierTypeInfo modifierType_GreasePencilOpacity = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
/*foreach_cache*/ nullptr,

View File

@@ -319,7 +319,11 @@ ModifierTypeInfo modifierType_GreasePencilOutline = {
/*name*/ N_("Outline"),
/*struct_name*/ "GreasePencilOutlineModifierData",
/*struct_size*/ sizeof(GreasePencilOutlineModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilOutlineModifier,
#endif
/*type*/ ModifierTypeType::Nonconstructive,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -344,7 +348,11 @@ ModifierTypeInfo modifierType_GreasePencilOutline = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -325,7 +325,11 @@ ModifierTypeInfo modifierType_GreasePencilShrinkwrap = {
/*name*/ N_("Shrinkwrap"),
/*struct_name*/ "GreasePencilShrinkwrapModifierData",
/*struct_size*/ sizeof(GreasePencilShrinkwrapModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilShrinkwrapModifier,
#endif
/*type*/ ModifierTypeType::OnlyDeform,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -350,7 +354,11 @@ ModifierTypeInfo modifierType_GreasePencilShrinkwrap = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -235,7 +235,11 @@ ModifierTypeInfo modifierType_GreasePencilSimplify = {
/*name*/ N_("Simplify"),
/*struct_name*/ "GreasePencilSimplifyModifierData",
/*struct_size*/ sizeof(GreasePencilSimplifyModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilSimplifyModifier,
#endif
/*type*/ ModifierTypeType::Nonconstructive,
/*flags*/
eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
@@ -261,7 +265,11 @@ ModifierTypeInfo modifierType_GreasePencilSimplify = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
/*foreach_cache*/ nullptr,

View File

@@ -270,7 +270,11 @@ ModifierTypeInfo modifierType_GreasePencilSmooth = {
/*name*/ N_("Smooth"),
/*struct_name*/ "GreasePencilSmoothModifierData",
/*struct_size*/ sizeof(GreasePencilSmoothModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilSmoothModifier,
#endif
/*type*/ ModifierTypeType::OnlyDeform,
/*flags*/
eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
@@ -296,7 +300,11 @@ ModifierTypeInfo modifierType_GreasePencilSmooth = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -189,7 +189,11 @@ ModifierTypeInfo modifierType_GreasePencilSubdiv = {
/*name*/ N_("Subdivide"),
/*struct_name*/ "GreasePencilSubdivModifierData",
/*struct_size*/ sizeof(GreasePencilSubdivModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilSubdivModifier,
#endif
/*type*/ ModifierTypeType::Constructive,
/*flags*/
eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
@@ -215,7 +219,11 @@ ModifierTypeInfo modifierType_GreasePencilSubdiv = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
/*foreach_cache*/ nullptr,

View File

@@ -364,7 +364,11 @@ ModifierTypeInfo modifierType_GreasePencilTexture = {
/*name*/ N_("TextureMapping"),
/*struct_name*/ "GreasePencilTextureModifierData",
/*struct_size*/ sizeof(GreasePencilTextureModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilTextureModifier,
#endif
/*type*/ ModifierTypeType::NonGeometrical,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -389,7 +393,11 @@ ModifierTypeInfo modifierType_GreasePencilTexture = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -214,7 +214,11 @@ ModifierTypeInfo modifierType_GreasePencilThickness = {
/*name*/ N_("Thickness"),
/*struct_name*/ "GreasePencilThickModifierData",
/*struct_size*/ sizeof(GreasePencilThickModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilThickModifierData,
#endif
/*type*/ ModifierTypeType::OnlyDeform,
/*flags*/
eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
@@ -240,7 +244,11 @@ ModifierTypeInfo modifierType_GreasePencilThickness = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -660,7 +660,11 @@ ModifierTypeInfo modifierType_GreasePencilTime = {
/*name*/ N_("TimeOffset"),
/*struct_name*/ "GreasePencilTimeModifierData",
/*struct_size*/ sizeof(GreasePencilTimeModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilTimeModifier,
#endif
/*type*/ ModifierTypeType::Nonconstructive,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -685,7 +689,11 @@ ModifierTypeInfo modifierType_GreasePencilTime = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -506,7 +506,11 @@ ModifierTypeInfo modifierType_GreasePencilTint = {
/*name*/ N_("Tint"),
/*struct_name*/ "GreasePencilTintModifierData",
/*struct_size*/ sizeof(GreasePencilTintModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilTintModifier,
#endif
/*type*/ ModifierTypeType::NonGeometrical,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
eModifierTypeFlag_EnableInEditmode | eModifierTypeFlag_SupportsMapping,
@@ -531,7 +535,11 @@ ModifierTypeInfo modifierType_GreasePencilTint = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
/*foreach_cache*/ nullptr,

View File

@@ -265,7 +265,11 @@ ModifierTypeInfo modifierType_GreasePencilWeightAngle = {
/*name*/ N_("Weight Angle"),
/*struct_name*/ "GreasePencilWeightAngleModifierData",
/*struct_size*/ sizeof(GreasePencilWeightAngleModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilWeightAngleModifier,
#endif
/*type*/ ModifierTypeType::NonGeometrical,
/*flags*/
eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
@@ -291,7 +295,11 @@ ModifierTypeInfo modifierType_GreasePencilWeightAngle = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -285,7 +285,11 @@ ModifierTypeInfo modifierType_GreasePencilWeightProximity = {
/*name*/ N_("Weight Proximity"),
/*struct_name*/ "GreasePencilWeightProximityModifierData",
/*struct_size*/ sizeof(GreasePencilWeightProximityModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilWeightProximityModifier,
#endif
/*type*/ ModifierTypeType::NonGeometrical,
/*flags*/
eModifierTypeFlag_AcceptsGreasePencil | eModifierTypeFlag_SupportsEditmode |
@@ -311,7 +315,11 @@ ModifierTypeInfo modifierType_GreasePencilWeightProximity = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -883,7 +883,11 @@ ModifierTypeInfo modifierType_GreasePencilLineart = {
/*name*/ N_("Lineart"),
/*struct_name*/ "GreasePencilLineartModifierData",
/*struct_size*/ sizeof(GreasePencilLineartModifierData),
#ifdef WITH_WEB
/*srna*/ nullptr,
#else
/*srna*/ &RNA_GreasePencilLineartModifier,
#endif
/*type*/ ModifierTypeType::Constructive,
/*flags*/ eModifierTypeFlag_AcceptsGreasePencil,
/*icon*/ ICON_MOD_LINEART,
@@ -907,7 +911,11 @@ ModifierTypeInfo modifierType_GreasePencilLineart = {
/*foreach_ID_link*/ foreach_ID_link,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
};

View File

@@ -78,6 +78,7 @@
#include "MOD_modifiertypes.hh"
#include "MOD_nodes.hh"
#include "MOD_nodes_storage.hh"
#include "MOD_ui_common.hh"
#include "ED_node.hh"
@@ -452,20 +453,6 @@ void MOD_nodes_update_interface(Object *object, NodesModifierData *nmd)
DEG_id_tag_update(&object->id, ID_RECALC_GEOMETRY);
}
NodesModifierBake *NodesModifierData::find_bake(const int id)
{
return const_cast<NodesModifierBake *>(std::as_const(*this).find_bake(id));
}
const NodesModifierBake *NodesModifierData::find_bake(const int id) const
{
for (const NodesModifierBake &bake : Span{this->bakes, this->bakes_num}) {
if (bake.id == id) {
return &bake;
}
}
return nullptr;
}
/**
* Setup side effects nodes so that the given node in the given compute context will be executed.
@@ -1625,14 +1612,6 @@ static void add_missing_data_block_mappings(
bake.data_blocks_num = new_num;
}
void nodes_modifier_data_block_destruct(NodesModifierDataBlock *data_block, const bool do_id_user)
{
MEM_SAFE_DELETE(data_block->id_name);
MEM_SAFE_DELETE(data_block->lib_name);
if (do_id_user) {
id_us_min(data_block->id);
}
}
/**
* During evaluation we might have baked geometry that contains references to other data-blocks
@@ -1977,111 +1956,24 @@ static void panel_register(ARegionType *region_type)
static void blend_write(BlendWriter *writer, const ID * /*id_owner*/, const ModifierData *md)
{
const NodesModifierData *nmd = reinterpret_cast<const NodesModifierData *>(md);
writer->write_struct(nmd);
writer->write_string(nmd->bake_directory);
if (nmd->settings_legacy.properties != nullptr) {
/* Write legacy settings for forward compatibility. Created by
* #create_legacy_geometry_nodes_properties. */
IDP_BlendWrite(writer, nmd->settings_legacy.properties);
}
writer->write_struct_array(nmd->bakes_num, nmd->bakes);
for (const NodesModifierBake &bake : Span(nmd->bakes, nmd->bakes_num)) {
writer->write_string(bake.directory);
writer->write_struct_array(bake.data_blocks_num, bake.data_blocks);
for (const NodesModifierDataBlock &item : Span(bake.data_blocks, bake.data_blocks_num)) {
writer->write_string(item.id_name);
writer->write_string(item.lib_name);
}
if (bake.packed) {
writer->write_struct(bake.packed);
writer->write_struct_array(bake.packed->meta_files_num, bake.packed->meta_files);
writer->write_struct_array(bake.packed->blob_files_num, bake.packed->blob_files);
const auto write_bake_file = [&](const NodesModifierBakeFile &bake_file) {
writer->write_string(bake_file.name);
if (bake_file.packed_file) {
BKE_packedfile_blend_write(writer, bake_file.packed_file);
}
};
for (const NodesModifierBakeFile &meta_file :
Span{bake.packed->meta_files, bake.packed->meta_files_num})
{
write_bake_file(meta_file);
}
for (const NodesModifierBakeFile &blob_file :
Span{bake.packed->blob_files, bake.packed->blob_files_num})
{
write_bake_file(blob_file);
}
}
}
writer->write_struct_array(nmd->panels_num, nmd->panels);
nodes_modifier_storage_write(writer, *nmd);
}
static void blend_read(BlendDataReader *reader, ModifierData *md)
{
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
BLO_read_string(reader, &nmd->bake_directory);
if (nmd->node_group == nullptr || nmd->modifier.system_properties) {
/* Don't bother reading old settings when modifier system properties are available. */
nmd->settings_legacy.properties = nullptr;
}
else {
BLO_read_struct(reader, IDProperty, &nmd->settings_legacy.properties);
IDP_BlendDataRead(reader, &nmd->settings_legacy.properties);
}
BLO_read_array_and_validate_size(reader, &nmd->bakes, &nmd->bakes_num);
if (nmd->bakes_num > 0 && nmd->bakes == nullptr) {
/* This case generally shouldn't be allowed to happen. However, there is a bug report with a
* corrupted .blend file (#123974) that triggers this case. Unfortunately, it's not clear how
* that could have happened. For now, handle this case more gracefully in release builds, while
* still crashing in debug builds. */
nmd->bakes_num = 0;
BLI_assert_unreachable();
}
for (NodesModifierBake &bake : MutableSpan(nmd->bakes, nmd->bakes_num)) {
BLO_read_string(reader, &bake.directory);
BLO_read_array_and_validate_size(reader, &bake.data_blocks, &bake.data_blocks_num);
for (NodesModifierDataBlock &data_block : MutableSpan(bake.data_blocks, bake.data_blocks_num))
{
BLO_read_string(reader, &data_block.id_name);
BLO_read_string(reader, &data_block.lib_name);
}
BLO_read_struct(reader, NodesModifierPackedBake, &bake.packed);
if (bake.packed) {
BLO_read_array_and_validate_size(
reader, &bake.packed->meta_files, &bake.packed->meta_files_num);
BLO_read_array_and_validate_size(
reader, &bake.packed->blob_files, &bake.packed->blob_files_num);
const auto read_bake_file = [&](NodesModifierBakeFile &bake_file) {
BLO_read_string(reader, &bake_file.name);
if (bake_file.packed_file) {
BKE_packedfile_blend_read(reader, &bake_file.packed_file, "");
}
};
for (NodesModifierBakeFile &meta_file :
MutableSpan{bake.packed->meta_files, bake.packed->meta_files_num})
{
read_bake_file(meta_file);
}
for (NodesModifierBakeFile &blob_file :
MutableSpan{bake.packed->blob_files, bake.packed->blob_files_num})
{
read_bake_file(blob_file);
}
}
}
BLO_read_array_and_validate_size(reader, &nmd->panels, &nmd->panels_num);
nodes_modifier_storage_read(reader, *nmd);
nmd->runtime = MEM_new<NodesModifierRuntime>(__func__);
nmd->runtime->cache = std::make_shared<bake::ModifierCache>();
}
@@ -2090,119 +1982,25 @@ static void copy_data(const ModifierData *md, ModifierData *target, const int fl
{
const NodesModifierData *nmd = reinterpret_cast<const NodesModifierData *>(md);
NodesModifierData *tnmd = reinterpret_cast<NodesModifierData *>(target);
BKE_modifier_copydata_generic(md, target, flag);
if (nmd->bakes) {
tnmd->bakes = MEM_dupalloc(nmd->bakes);
for (const int i : IndexRange(nmd->bakes_num)) {
NodesModifierBake &bake = tnmd->bakes[i];
if (bake.directory) {
bake.directory = BLI_strdup(bake.directory);
}
if (bake.data_blocks) {
bake.data_blocks = MEM_dupalloc(bake.data_blocks);
for (const int i : IndexRange(bake.data_blocks_num)) {
NodesModifierDataBlock &data_block = bake.data_blocks[i];
if (data_block.id_name) {
data_block.id_name = BLI_strdup(data_block.id_name);
}
if (data_block.lib_name) {
data_block.lib_name = BLI_strdup(data_block.lib_name);
}
}
}
nodes_modifier_packed_bake_copy(bake, nmd->bakes[i]);
}
}
if (nmd->panels) {
tnmd->panels = MEM_dupalloc(nmd->panels);
}
nodes_modifier_storage_copy(*nmd, *tnmd);
tnmd->runtime = MEM_new<NodesModifierRuntime>(__func__);
if (flag & LIB_ID_COPY_SET_COPIED_ON_WRITE) {
/* Share the simulation cache between the original and evaluated modifier. */
/* Keep the original simulation cache and bake path for evaluated copies. */
tnmd->runtime->cache = nmd->runtime->cache;
/* Keep bake path in the evaluated modifier. */
tnmd->bake_directory = nmd->bake_directory ? BLI_strdup(nmd->bake_directory) : nullptr;
}
else {
tnmd->runtime->cache = std::make_shared<bake::ModifierCache>();
/* Clear the bake path when duplicating. */
tnmd->bake_directory = nullptr;
}
}
void nodes_modifier_packed_bake_copy(NodesModifierBake &bake_dst,
const NodesModifierBake &bake_src)
{
BLI_assert(ELEM(bake_dst.packed, bake_src.packed, nullptr));
if (!bake_src.packed) {
return;
}
bake_dst.packed = MEM_dupalloc(bake_src.packed);
const auto copy_bake_files_inplace = [](NodesModifierBakeFile **bake_files,
const int bake_files_num) {
if (!*bake_files) {
return;
}
*bake_files = MEM_dupalloc(*bake_files);
for (NodesModifierBakeFile &bake_file : MutableSpan{*bake_files, bake_files_num}) {
bake_file.name = BLI_strdup_null(bake_file.name);
if (bake_file.packed_file) {
bake_file.packed_file = BKE_packedfile_duplicate(bake_file.packed_file);
}
}
};
copy_bake_files_inplace(&bake_dst.packed->meta_files, bake_dst.packed->meta_files_num);
copy_bake_files_inplace(&bake_dst.packed->blob_files, bake_dst.packed->blob_files_num);
}
void nodes_modifier_packed_bake_free(NodesModifierPackedBake *packed_bake)
{
const auto free_packed_files = [](NodesModifierBakeFile *files, const int files_num) {
for (NodesModifierBakeFile &file : MutableSpan{files, files_num}) {
MEM_SAFE_DELETE(file.name);
if (file.packed_file) {
BKE_packedfile_free(file.packed_file);
}
}
MEM_SAFE_DELETE(files);
};
free_packed_files(packed_bake->meta_files, packed_bake->meta_files_num);
free_packed_files(packed_bake->blob_files, packed_bake->blob_files_num);
MEM_SAFE_DELETE(packed_bake);
}
void nodes_modifier_bake_destruct(NodesModifierBake *bake, const bool do_id_user)
{
MEM_SAFE_DELETE(bake->directory);
for (NodesModifierDataBlock &data_block : MutableSpan(bake->data_blocks, bake->data_blocks_num))
{
nodes_modifier_data_block_destruct(&data_block, do_id_user);
}
MEM_SAFE_DELETE(bake->data_blocks);
if (bake->packed) {
nodes_modifier_packed_bake_free(bake->packed);
}
}
static void free_data(ModifierData *md)
{
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
for (NodesModifierBake &bake : MutableSpan(nmd->bakes, nmd->bakes_num)) {
nodes_modifier_bake_destruct(&bake, false);
}
MEM_SAFE_DELETE(nmd->bakes);
MEM_SAFE_DELETE(nmd->panels);
MEM_SAFE_DELETE(nmd->bake_directory);
nodes_modifier_storage_free(*nmd);
MEM_delete(nmd->runtime);
}

View File

@@ -0,0 +1,208 @@
/* SPDX-FileCopyrightText: 2026 Blender Authors
* SPDX-License-Identifier: GPL-2.0-or-later */
#include <utility>
#include "MEM_guardedalloc.h"
#include "BLI_span.hh"
#include "BLI_string.h"
#include "BLI_utildefines.h"
#include "DNA_modifier_types.h"
#include "BKE_lib_id.hh"
#include "BKE_packedFile.hh"
#include "BLO_read_write.hh"
#include "MOD_nodes.hh"
#include "MOD_nodes_storage.hh"
namespace blender {
/* Shared with the original modifier: storage must not depend on which evaluator is linked. */
NodesModifierBake *NodesModifierData::find_bake(const int id)
{
return const_cast<NodesModifierBake *>(std::as_const(*this).find_bake(id));
}
const NodesModifierBake *NodesModifierData::find_bake(const int id) const
{
for (const NodesModifierBake &bake : Span{this->bakes, this->bakes_num}) {
if (bake.id == id) {
return &bake;
}
}
return nullptr;
}
void nodes_modifier_data_block_destruct(NodesModifierDataBlock *data_block, const bool do_id_user)
{
MEM_SAFE_DELETE(data_block->id_name);
MEM_SAFE_DELETE(data_block->lib_name);
if (do_id_user) {
id_us_min(data_block->id);
}
}
void nodes_modifier_packed_bake_copy(NodesModifierBake &bake_dst,
const NodesModifierBake &bake_src)
{
BLI_assert(ELEM(bake_dst.packed, bake_src.packed, nullptr));
if (!bake_src.packed) {
return;
}
bake_dst.packed = MEM_dupalloc(bake_src.packed);
const auto copy_bake_files_inplace = [](NodesModifierBakeFile **bake_files,
const int bake_files_num) {
if (!*bake_files) {
return;
}
*bake_files = MEM_dupalloc(*bake_files);
for (NodesModifierBakeFile &bake_file : MutableSpan{*bake_files, bake_files_num}) {
bake_file.name = BLI_strdup_null(bake_file.name);
if (bake_file.packed_file) {
bake_file.packed_file = BKE_packedfile_duplicate(bake_file.packed_file);
}
}
};
copy_bake_files_inplace(&bake_dst.packed->meta_files, bake_dst.packed->meta_files_num);
copy_bake_files_inplace(&bake_dst.packed->blob_files, bake_dst.packed->blob_files_num);
}
void nodes_modifier_packed_bake_free(NodesModifierPackedBake *packed_bake)
{
const auto free_packed_files = [](NodesModifierBakeFile *files, const int files_num) {
for (NodesModifierBakeFile &file : MutableSpan{files, files_num}) {
MEM_SAFE_DELETE(file.name);
if (file.packed_file) {
BKE_packedfile_free(file.packed_file);
}
}
MEM_SAFE_DELETE(files);
};
free_packed_files(packed_bake->meta_files, packed_bake->meta_files_num);
free_packed_files(packed_bake->blob_files, packed_bake->blob_files_num);
MEM_SAFE_DELETE(packed_bake);
}
void nodes_modifier_bake_destruct(NodesModifierBake *bake, const bool do_id_user)
{
MEM_SAFE_DELETE(bake->directory);
for (NodesModifierDataBlock &data_block : MutableSpan(bake->data_blocks, bake->data_blocks_num)) {
nodes_modifier_data_block_destruct(&data_block, do_id_user);
}
MEM_SAFE_DELETE(bake->data_blocks);
if (bake->packed) {
nodes_modifier_packed_bake_free(bake->packed);
}
}
void nodes_modifier_storage_write(BlendWriter *writer, const NodesModifierData &nmd)
{
writer->write_string(nmd.bake_directory);
writer->write_struct_array(nmd.bakes_num, nmd.bakes);
for (const NodesModifierBake &bake : Span(nmd.bakes, nmd.bakes_num)) {
writer->write_string(bake.directory);
writer->write_struct_array(bake.data_blocks_num, bake.data_blocks);
for (const NodesModifierDataBlock &item : Span(bake.data_blocks, bake.data_blocks_num)) {
writer->write_string(item.id_name);
writer->write_string(item.lib_name);
}
if (bake.packed) {
writer->write_struct(bake.packed);
writer->write_struct_array(bake.packed->meta_files_num, bake.packed->meta_files);
writer->write_struct_array(bake.packed->blob_files_num, bake.packed->blob_files);
const auto write_bake_file = [&](const NodesModifierBakeFile &bake_file) {
writer->write_string(bake_file.name);
if (bake_file.packed_file) {
BKE_packedfile_blend_write(writer, bake_file.packed_file);
}
};
for (const NodesModifierBakeFile &meta_file :
Span{bake.packed->meta_files, bake.packed->meta_files_num}) {
write_bake_file(meta_file);
}
for (const NodesModifierBakeFile &blob_file :
Span{bake.packed->blob_files, bake.packed->blob_files_num}) {
write_bake_file(blob_file);
}
}
}
writer->write_struct_array(nmd.panels_num, nmd.panels);
}
void nodes_modifier_storage_read(BlendDataReader *reader, NodesModifierData &nmd)
{
BLO_read_string(reader, &nmd.bake_directory);
BLO_read_array_and_validate_size(reader, &nmd.bakes, &nmd.bakes_num);
if (nmd.bakes_num > 0 && nmd.bakes == nullptr) {
nmd.bakes_num = 0;
BLI_assert_unreachable();
}
for (NodesModifierBake &bake : MutableSpan(nmd.bakes, nmd.bakes_num)) {
BLO_read_string(reader, &bake.directory);
BLO_read_array_and_validate_size(reader, &bake.data_blocks, &bake.data_blocks_num);
for (NodesModifierDataBlock &data_block : MutableSpan(bake.data_blocks, bake.data_blocks_num)) {
BLO_read_string(reader, &data_block.id_name);
BLO_read_string(reader, &data_block.lib_name);
}
BLO_read_struct(reader, NodesModifierPackedBake, &bake.packed);
if (bake.packed) {
BLO_read_array_and_validate_size(reader, &bake.packed->meta_files, &bake.packed->meta_files_num);
BLO_read_array_and_validate_size(reader, &bake.packed->blob_files, &bake.packed->blob_files_num);
const auto read_bake_file = [&](NodesModifierBakeFile &bake_file) {
BLO_read_string(reader, &bake_file.name);
if (bake_file.packed_file) {
BKE_packedfile_blend_read(reader, &bake_file.packed_file, "");
}
};
for (NodesModifierBakeFile &meta_file :
MutableSpan{bake.packed->meta_files, bake.packed->meta_files_num}) {
read_bake_file(meta_file);
}
for (NodesModifierBakeFile &blob_file :
MutableSpan{bake.packed->blob_files, bake.packed->blob_files_num}) {
read_bake_file(blob_file);
}
}
}
BLO_read_array_and_validate_size(reader, &nmd.panels, &nmd.panels_num);
}
void nodes_modifier_storage_copy(const NodesModifierData &source, NodesModifierData &target)
{
if (source.bakes) {
target.bakes = MEM_dupalloc(source.bakes);
for (const int i : IndexRange(source.bakes_num)) {
NodesModifierBake &bake = target.bakes[i];
if (bake.directory) {
bake.directory = BLI_strdup(bake.directory);
}
if (bake.data_blocks) {
bake.data_blocks = MEM_dupalloc(bake.data_blocks);
for (const int j : IndexRange(bake.data_blocks_num)) {
NodesModifierDataBlock &data_block = bake.data_blocks[j];
if (data_block.id_name) {
data_block.id_name = BLI_strdup(data_block.id_name);
}
if (data_block.lib_name) {
data_block.lib_name = BLI_strdup(data_block.lib_name);
}
}
}
nodes_modifier_packed_bake_copy(bake, source.bakes[i]);
}
}
if (source.panels) {
target.panels = MEM_dupalloc(source.panels);
}
}
void nodes_modifier_storage_free(NodesModifierData &nmd)
{
for (NodesModifierBake &bake : MutableSpan(nmd.bakes, nmd.bakes_num)) {
nodes_modifier_bake_destruct(&bake, false);
}
MEM_SAFE_DELETE(nmd.bakes);
MEM_SAFE_DELETE(nmd.panels);
MEM_SAFE_DELETE(nmd.bake_directory);
}
} // namespace blender

View File

@@ -54,6 +54,7 @@
#include "UI_resources.hh"
#include "MOD_modifiertypes.hh"
#include "MOD_nodes_storage.hh"
namespace blender {
@@ -71,30 +72,31 @@ static void copy_data(const ModifierData *md, ModifierData *target, const int fl
destination->bake_directory = source->bake_directory ? BLI_strdup(source->bake_directory) :
nullptr;
destination->bakes = nullptr;
destination->bakes_num = 0;
destination->panels = source->panels ? MEM_dupalloc(source->panels) : nullptr;
nodes_modifier_storage_copy(*source, *destination);
destination->runtime = nullptr;
}
static void free_data(ModifierData *md)
{
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
MEM_SAFE_DELETE(nmd->bakes);
MEM_SAFE_DELETE(nmd->panels);
MEM_SAFE_DELETE(nmd->bake_directory);
nodes_modifier_storage_free(*nmd);
}
static void blend_write(BlendWriter *writer, const ID *, const ModifierData *md)
{
const NodesModifierData *nmd = reinterpret_cast<const NodesModifierData *>(md);
writer->write_struct(nmd);
nodes_modifier_storage_write(writer, *nmd);
}
static void blend_read(BlendDataReader *reader, ModifierData *md)
{
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
BLO_read_string(reader, &nmd->bake_directory);
nmd->settings_legacy.properties = nullptr;
/* The bounded Web evaluator does not consume simulations, but all serialized
* pointers must still be remapped before the modifier is copied by Depsgraph. */
BLO_read_array_and_validate_size(reader, &nmd->bakes, &nmd->bakes_num);
BLO_read_array_and_validate_size(reader, &nmd->panels, &nmd->panels_num);
nodes_modifier_storage_read(reader, *nmd);
nmd->runtime = nullptr;
}
@@ -102,6 +104,11 @@ static void foreach_ID_link(ModifierData *md, Object *object, IDWalkFunc walk, v
{
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
walk(user_data, object, reinterpret_cast<ID **>(&nmd->node_group), IDWALK_CB_USER);
for (NodesModifierBake &bake : MutableSpan(nmd->bakes, nmd->bakes_num)) {
for (NodesModifierDataBlock &data_block : MutableSpan(bake.data_blocks, bake.data_blocks_num)) {
walk(user_data, object, &data_block.id, IDWALK_CB_USER);
}
}
}
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
@@ -929,7 +936,7 @@ ModifierTypeInfo modifierType_Nodes = {
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
/*panel_register*/ nullptr,
/*blend_write*/ nullptr,
/*blend_write*/ blend_write,
/*blend_read*/ blend_read,
/*foreach_cache*/ nullptr,
/*foreach_working_space_color*/ nullptr,

View File

@@ -252,13 +252,6 @@ static void blend_read(BlendDataReader *reader, ModifierData *md)
psmd->mesh_original = nullptr;
/* This is written as part of ob->particlesystem. */
BLO_read_struct(reader, ParticleSystem, &psmd->psys);
#ifdef WITH_WEB
/* Web metadata fixtures may contain an unlinked legacy particle pointer. Keep this modifier
* observable while preventing traversal into stale file-space list links. */
psmd->psys = nullptr;
psmd->modifier.next = nullptr;
psmd->modifier.prev = nullptr;
#endif
psmd->flag &= ~eParticleSystemFlag_psys_updated;
psmd->flag |= eParticleSystemFlag_file_loaded;
}
@@ -293,7 +286,11 @@ ModifierTypeInfo modifierType_ParticleSystem = {
/*foreach_ID_link*/ nullptr,
/*foreach_tex_link*/ nullptr,
/*free_runtime_data*/ nullptr,
#ifdef WITH_WEB
/*panel_register*/ nullptr,
#else
/*panel_register*/ panel_register,
#endif
/*blend_write*/ nullptr,
/*blend_read*/ blend_read,
/*foreach_cache*/ nullptr,

View File

@@ -39,8 +39,7 @@
namespace blender {
#ifdef WITH_WEB
/* Web keeps simulation modifiers metadata-only, but the concrete DNA type is
* required so BLO_write_file serializes the same block layout it read. */
/* Unported simulation modifiers retain their concrete DNA layouts for serialization. */
static bool web_simulation_modifier_disabled(const Scene * /*scene*/,
ModifierData * /*md*/,
const bool /*use_render_params*/)
@@ -68,8 +67,6 @@ static ModifierTypeInfo web_simulation_modifier_type(const char *idname,
ModifierTypeInfo modifierType_Softbody = web_simulation_modifier_type(
"Softbody", "SoftbodyModifierData", sizeof(SoftbodyModifierData), ICON_MOD_SOFT);
ModifierTypeInfo modifierType_Cloth = web_simulation_modifier_type(
"Cloth", "ClothModifierData", sizeof(ClothModifierData), ICON_MOD_CLOTH);
ModifierTypeInfo modifierType_Collision = web_simulation_modifier_type(
"Collision", "CollisionModifierData", sizeof(CollisionModifierData), ICON_MOD_PHYSICS);
#endif
@@ -266,11 +263,12 @@ void modifier_type_init(ModifierTypeInfo *types[])
INIT_TYPE(EdgeSplit);
INIT_TYPE(Armature);
INIT_TYPE(Hook);
/* These simulation modifiers remain metadata-only in the Web evaluator,
* but must retain their concrete DNA layouts when Main is serialized. */
/* Unported simulation types retain their concrete DNA layouts. */
INIT_TYPE(Softbody);
INIT_TYPE(Cloth);
INIT_TYPE(Collision);
INIT_TYPE(Cloth);
INIT_TYPE(Fluid);
INIT_TYPE(ParticleSystem);
INIT_TYPE(Boolean);
INIT_TYPE(MeshDeform);
INIT_TYPE(Nodes);
@@ -343,6 +341,8 @@ void modifier_type_init(ModifierTypeInfo *types[])
INIT_TYPE(VolumeDisplace);
INIT_TYPE(VolumeToMesh);
INIT_TYPE(Nodes);
#endif
/* Keep Grease Pencil data ownership and blend callbacks available in Web builds. */
INIT_TYPE(GreasePencilOpacity);
INIT_TYPE(GreasePencilSubdiv);
INIT_TYPE(GreasePencilColor);
@@ -369,7 +369,6 @@ void modifier_type_init(ModifierTypeInfo *types[])
INIT_TYPE(GreasePencilShrinkwrap);
INIT_TYPE(GreasePencilBuild);
INIT_TYPE(GreasePencilTexture);
#endif
#undef INIT_TYPE
}