feat(web): add world lightgroup membership
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

This commit is contained in:
mes123456
2026-08-30 07:34:08 +08:00
parent cc8f805e76
commit 63ba5b1e0c
46 changed files with 1901 additions and 36 deletions

View File

@@ -1612,7 +1612,7 @@ EMSCRIPTEN_KEEPALIVE int web_engine_apply_command(const int handle,
type == "insertGreasePencilFrame" || type == "removeGreasePencilFrame" ||
type == "setGreasePencilStrokes" || type == "setVertexColors" ||
type == "setVertexWeights" || type == "setCameraProperties" || type == "setLightProperties" ||
type == "setWorldProperties" || type == "setSceneProperties" || type == "setSceneRenderSettings" || type == "setSceneAudioSettings" || type == "setSceneUnitSettings" || type == "setSceneTimelineSettings" || type == "setScenePipelineSettings" || type == "setSceneBindings" || type == "setSceneViewLayerSettings" || type == "setSceneCollectionSettings" || type == "setSceneBorderSettings" || type == "setSceneSimplifySettings" || type == "setSceneColorManagement" || type == "setSceneImageFormat" || type == "setSceneMotionBlur" || type == "setSceneHairSettings" || type == "setSceneCompositorSettings" || type == "setScenePerformanceSettings" || type == "setSceneSamplingSettings" || type == "setSceneMultiviewSettings" || type == "setSceneStampSettings" || type == "setSceneLineSettings" || type == "setSceneViewLayerPassSettings" || type == "setSceneViewLayerAOVs" || type == "setSceneViewLayerLightgroups" || type == "setObjectLightgroup" ||
type == "setWorldProperties" || type == "setSceneProperties" || type == "setSceneRenderSettings" || type == "setSceneAudioSettings" || type == "setSceneUnitSettings" || type == "setSceneTimelineSettings" || type == "setScenePipelineSettings" || type == "setSceneBindings" || type == "setSceneViewLayerSettings" || type == "setSceneCollectionSettings" || type == "setSceneBorderSettings" || type == "setSceneSimplifySettings" || type == "setSceneColorManagement" || type == "setSceneImageFormat" || type == "setSceneMotionBlur" || type == "setSceneHairSettings" || type == "setSceneCompositorSettings" || type == "setScenePerformanceSettings" || type == "setSceneSamplingSettings" || type == "setSceneMultiviewSettings" || type == "setSceneStampSettings" || type == "setSceneLineSettings" || type == "setSceneViewLayerPassSettings" || type == "setSceneViewLayerAOVs" || type == "setSceneViewLayerLightgroups" || type == "setObjectLightgroup" || type == "setWorldLightgroup" ||
type == "setSculptMeshAttributes" ||
type == "sculptStroke") {
if (!engine->authoritative_commands || engine->authoritative_main == nullptr) {
@@ -2352,6 +2352,12 @@ EMSCRIPTEN_KEEPALIVE int web_engine_apply_command(const int handle,
applied = name != "\x01" && web_engine_blend_main_set_object_lightgroup(
engine->authoritative_main, command.value("objectId", "").c_str(), name.c_str(), main_error);
}
else if (type == "setWorldLightgroup") {
const json lightgroup = command.value("lightgroup", json(nullptr));
const std::string name = lightgroup.is_null() ? std::string() : lightgroup.is_string() ? lightgroup.get<std::string>() : std::string("\x01");
applied = name != "\x01" && web_engine_blend_main_set_world_lightgroup(
engine->authoritative_main, command.value("dataId", "").c_str(), name.c_str(), main_error);
}
else if (type == "setSculptMeshAttributes") {
const json attributes = command.value("attributes", json::object());
applied = web_engine_blend_main_set_sculpt_attributes(

View File

@@ -5178,6 +5178,12 @@ json scene_ir_from_blend(const ParsedBlend &blend,
{"color", json::array({horizon_r, horizon_g, horizon_b})},
{"exposure", exposure},
{"backgroundVisible", true} };
if (const std::optional<uint64_t> lightgroup_pointer = read_pointer(*blend.sdna, element, "lightgroup")) {
if (const std::optional<ElementRef> membership = element_for_pointer(blend, *lightgroup_pointer)) {
const std::string lightgroup_name = read_string(*blend.sdna, *membership, "name");
if (!lightgroup_name.empty()) world["lightgroup"] = lightgroup_name;
}
}
const int64_t world_mode = read_integer(*blend.sdna, element, "mode").value_or(0);
const int64_t mist_type = read_integer(*blend.sdna, element, "mistype").value_or(0);
world["mist"] = {{"enabled", (world_mode & 1) != 0},

View File

@@ -6805,6 +6805,20 @@ bool web_engine_blend_main_set_object_lightgroup(WebBlendMainState *state,
return true;
}
bool web_engine_blend_main_set_world_lightgroup(WebBlendMainState *state,
const char *world_id,
const char *lightgroup_name,
std::string &error)
{
if (state == nullptr || state->main == nullptr || world_id == nullptr || lightgroup_name == nullptr) { error = "RENDER_PROPERTY_INVALID: world lightgroup target is missing"; return false; }
World *world = find_world(state->main, world_id);
if (world == nullptr || world->id.lib != nullptr) { error = "LINKED_DATA_MUTATION_BLOCKED: World lightgroup is not editable"; return false; }
if (strlen(lightgroup_name) >= 64) { error = "RENDER_PROPERTY_INVALID: world lightgroup name exceeds the bounded size"; return false; }
BKE_lightgroup_membership_set(&world->lightgroup, lightgroup_name);
world->id.recalc |= ID_RECALC_PARAMETERS;
return true;
}
bool web_engine_blend_main_write(WebBlendMainState *state,
std::vector<uint8_t> &bytes,
std::string &error)

View File

@@ -622,6 +622,10 @@ bool web_engine_blend_main_set_object_lightgroup(WebBlendMainState *state,
const char *object_id,
const char *lightgroup_name,
std::string &error);
bool web_engine_blend_main_set_world_lightgroup(WebBlendMainState *state,
const char *world_id,
const char *lightgroup_name,
std::string &error);
bool web_engine_blend_main_write(WebBlendMainState *state,
std::vector<uint8_t> &bytes,
std::string &error);