Fix extended-region scene rendering and delivery
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user