feat(web): add world lightgroup membership
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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},
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user