Fix extended-region scene rendering and delivery
Some checks failed
CI / rust-skia (Rust only) (push) Has been cancelled
CI / required (push) Has been cancelled

This commit is contained in:
2026-08-22 13:45:31 +02:00
parent c101007362
commit f6f5abe464
14 changed files with 1349 additions and 533 deletions

View File

@@ -94,6 +94,7 @@ impl OfflineGridBackend {
#[cfg(feature = "live-grid")]
pub struct LibremetaverseClientOwner {
client: libremetaverse::GridClient,
network: libremetaverse::NetworkManager,
agent: Arc<libremetaverse::AgentManager>,
delivery_generation: Arc<std::sync::RwLock<Option<u64>>>,
}
@@ -132,6 +133,7 @@ impl fmt::Debug for LibremetaverseClientOwner {
pub struct LibremetaverseSessionBackend {
network: libremetaverse::NetworkManager,
agent: Arc<libremetaverse::AgentManager>,
throttle: libremetaverse::AgentThrottle,
login_url: String,
first_name: String,
last_name: String,
@@ -168,7 +170,11 @@ impl LibremetaverseClientOwner {
.map_err(|_| BackendError::Configuration {
component: "libremetaverse client defaults",
})?;
// The compatibility client caches its network manager weakly. Retain the
// composition root before managers register packet subscriptions on it.
let network = client.network();
let _grid = client.grid();
let _terrain = client.terrain();
let agent = Arc::new(
libremetaverse::AgentManager::new(Some(Arc::new(client.clone()))).map_err(|_| {
BackendError::Configuration {
@@ -178,6 +184,7 @@ impl LibremetaverseClientOwner {
);
Ok(Self {
client,
network,
agent,
delivery_generation: Arc::new(std::sync::RwLock::new(None)),
})
@@ -273,8 +280,12 @@ impl LibremetaverseClientOwner {
});
}
Ok(LibremetaverseSessionBackend {
network: self.client.network(),
network: self.network.clone(),
agent: Arc::clone(&self.agent),
throttle: libremetaverse::AgentThrottle::new_with_grid_client(self.client.clone())
.map_err(|_| BackendError::Configuration {
component: "libremetaverse agent throttle",
})?,
login_url: connection.login_url.expose_url().to_owned(),
first_name: first_name.to_owned(),
last_name: last_name.to_owned(),
@@ -794,30 +805,7 @@ impl crate::behavior::EmbodimentSink for LibremetaverseEmbodimentSink {
return Err(crate::behavior::BehaviorError::Cancelled);
}
self.ensure_generation(generation)?;
let avatar = self.agent.sim_position();
let forward = libremetaverse_types::Vector3::mul_with_vector3_quaternion(
libremetaverse_types::Vector3::unit_x(),
self.agent.sim_rotation(),
);
let position = libremetaverse_types::Vector3 {
x: avatar.x,
y: avatar.y,
z: avatar.z + 1.6,
};
let target = libremetaverse_types::Vector3 {
x: position.x + forward.x * 4.0,
y: position.y + forward.y * 4.0,
z: position.z + forward.z * 4.0,
};
self.agent
.movement
.camera
.look_at_with_vector3_vector3(position, target)
.and_then(|()| {
self.agent
.movement
.set_fov_vertical_angle(60.0_f32.to_radians())
})
native_reset_camera(&self.agent)
.and_then(|()| self.agent.movement.send_update_with_boolean(Some(true)))
.map_err(|_| crate::behavior::BehaviorError::NativeOperation)
})
@@ -847,6 +835,30 @@ fn native_position(value: libremetaverse_types::Vector3) -> crate::perception::W
}
}
#[cfg(feature = "live-grid")]
fn native_reset_camera(agent: &libremetaverse::AgentManager) -> Result<(), libremetaverse::Error> {
let avatar = agent.sim_position();
let forward = libremetaverse_types::Vector3::mul_with_vector3_quaternion(
libremetaverse_types::Vector3::unit_x(),
agent.sim_rotation(),
);
let position = libremetaverse_types::Vector3 {
x: avatar.x,
y: avatar.y,
z: avatar.z + 1.6,
};
let target = libremetaverse_types::Vector3 {
x: position.x + forward.x * 4.0,
y: position.y + forward.y * 4.0,
z: position.z + forward.z * 4.0,
};
agent
.movement
.camera
.look_at_with_vector3_vector3(position, target)?;
agent.movement.set_fov_vertical_angle(60.0_f32.to_radians())
}
#[cfg(feature = "live-grid")]
fn native_inventory_metadata(
client: &libremetaverse::GridClient,
@@ -1089,6 +1101,23 @@ impl crate::session::GridSessionBackend for LibremetaverseSessionBackend {
)
})?;
if logged_in {
let simulator = self.network.current_sim().ok_or_else(|| {
crate::session::SessionFailure::new(
crate::session::SessionFailureKind::TransientTransport,
)
})?;
self.throttle
.set_with_simulator(Some(simulator))
.map_err(|_| {
crate::session::SessionFailure::new(
crate::session::SessionFailureKind::TransientTransport,
)
})?;
native_reset_camera(&self.agent).map_err(|_| {
crate::session::SessionFailure::new(
crate::session::SessionFailureKind::TransientTransport,
)
})?;
break;
}
let error_key = self.network.native_login_error_key();