From: Ian Jackson Date: Sun, 31 Jan 2021 21:51:03 +0000 (+0000) Subject: hidden: Use new PieceRenderInstructions and svg massage APIs X-Git-Tag: otter-0.4.0~583 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=17628683657e2f48b9b1f70d28a02612038b44cf;p=otter.git hidden: Use new PieceRenderInstructions and svg massage APIs In general terms: * When we need a PieceRenderInstructions get it from piece_pri (including from gs.occults) rather than from a Lens. * Delete the methods from Lens (and the dummy make_pieceid_visible function) so we are sure they aren't used. * Use the new massage_prep_piecestate function rather than the method on Lens. * Consequential changes, including providing mutable gpl in one placea, and adding/removing _ prefixes for expectedly used/unsued variables. Signed-off-by: Ian Jackson --- diff --git a/daemon/api.rs b/daemon/api.rs index 437801a7..f9a3407c 100644 --- a/daemon/api.rs +++ b/daemon/api.rs @@ -86,16 +86,17 @@ impl<'r> Responder<'r> for OnlineErrorResponse { } fn log_did_to_piece( - _occults: &GameOccults, - gpl: &mut GPlayerState, lens: &L, + occults: &GameOccults, + gpl: &mut GPlayerState, _lens: &L, piece: PieceId, pc: &PieceState, p: &dyn Piece, did: &str, ) -> Vec { + let pri = piece_pri(occults, gpl, piece, pc); vec![ LogEntry { html: Html(format!( "{} {} {}", &htmlescape::encode_minimal(&gpl.nick), did, - p.describe_pri(&lens.log_pri(piece, pc)).0 + p.describe_pri(&pri).0 ))}] } @@ -116,9 +117,9 @@ fn api_piece_op(form : Json>) let ipieces = &g.ipieces; let iplayers = &g.iplayers; let _ = iplayers.byid(player)?; - let _ = gs.players.byid(player)?; + let gpl = gs.players.byid(player)?; let lens = TransparentLens { }; - let piece = lens.decode_visible_pieceid(form.piece, player); + let piece = vpiece_decode(gs, gpl, form.piece).ok_or(OE::PieceGone)?; use ApiPieceOpError::*; match (||{ @@ -248,7 +249,7 @@ api_route!{ #[throws(ApiPieceOpError)] fn op(&self, a: ApiPieceOpArgs) -> PieceUpdate { - let ApiPieceOpArgs { gs,player,piece,p,lens, .. } = a; + let ApiPieceOpArgs { gs,player,piece,p, .. } = a; let pc = gs.pieces.byid_mut(piece)?; let players = &mut gs.players; let was = pc.held; @@ -256,7 +257,8 @@ api_route!{ let was = was.map(|was| htmlescape::encode_minimal(&was.nick)); let gpl = players.byid_mut(player)?; - let pcs = p.describe_pri(&lens.log_pri(piece, pc)).0; + let pri = piece_pri(&gs.occults, gpl, piece, pc); + let pcs = p.describe_pri(&pri).0; pc.held = Some(player); diff --git a/daemon/session.rs b/daemon/session.rs index d78b139f..05c8dc31 100644 --- a/daemon/session.rs +++ b/daemon/session.rs @@ -108,11 +108,7 @@ fn session_inner(form : Json, pieces.sort_by_key(|(_,pr)| &pr.zlevel); for (gpid, pr) in pieces { - let pri = PieceRenderInstructions { - id: make_pieceid_visible(gpid), - angle: make_angle_visible(pr.angle), - face: pr.face, - }; + let pri = piece_pri(&ig.gs.occults, gpl, gpid, pr); let p = if let Some(p) = ig.ipieces.get(gpid) { p } else { continue /* was deleted */ }; let defs = p.make_defs(&pri)?; diff --git a/src/gamestate.rs b/src/gamestate.rs index b4da878c..c743b69b 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -343,12 +343,6 @@ impl GameState { // ========== ad-hoc and temporary ========== -pub fn make_pieceid_visible(p: PieceId) -> VisiblePieceId { - // todo-lens need to do censorship mapping here - let kd: slotmap::KeyData = p.data(); - VisiblePieceId(kd) -} - pub fn make_angle_visible(angle: PieceAngle) -> VisiblePieceAngle { // todo-lens need to do censorship mapping here VisiblePieceAngle(angle) diff --git a/src/lens.rs b/src/lens.rs index aabf6087..50536ad0 100644 --- a/src/lens.rs +++ b/src/lens.rs @@ -13,51 +13,10 @@ use crate::imports::*; // can be abolished. pub trait Lens : Debug { - fn new_hidden_todo(&self, why: &'static str); - /// Will be replaced by some call to an Occlusion - fn new_hidden_pri(&self, id: VisiblePieceId, - angle: VisiblePieceAngle, face: FaceId) - -> PieceRenderInstructions; - - fn pieceid2visible(&self, piece: PieceId) -> VisiblePieceId; - fn log_pri(&self, piece: PieceId, pc: &PieceState) - -> PieceRenderInstructions; - fn svg_pri(&self, piece: PieceId, pc: &PieceState, player: PlayerId) - -> PieceRenderInstructions; - fn massage_prep_piecestate(&self, ns : &mut PreparedPieceState); - fn decode_visible_pieceid(&self, vpiece: VisiblePieceId, player: PlayerId) - -> PieceId; } #[derive(Debug)] pub struct TransparentLens { } impl Lens for TransparentLens { - fn new_hidden_todo(&self, _why: &'static str) { } - fn new_hidden_pri(&self, id: VisiblePieceId, - angle: VisiblePieceAngle, face: FaceId) - -> PieceRenderInstructions { - PieceRenderInstructions { id, angle, face } - } - - fn pieceid2visible(&self, piece: PieceId) -> VisiblePieceId { - let kd : slotmap::KeyData = piece.data(); - VisiblePieceId(kd) - } - fn log_pri(&self, piece: PieceId, pc: &PieceState) - -> PieceRenderInstructions { - let id = self.pieceid2visible(piece); - let angle = make_angle_visible(pc.angle); - PieceRenderInstructions { id, angle, face: pc.face } - } - fn svg_pri(&self, piece: PieceId, pc: &PieceState, _player: PlayerId) - -> PieceRenderInstructions { - self.log_pri(piece, pc) - } - fn decode_visible_pieceid(&self, vpiece: VisiblePieceId, _player: PlayerId) - -> PieceId { - let kd : slotmap::KeyData = vpiece.into(); - PieceId::from(kd) - } - fn massage_prep_piecestate(&self, _ns : &mut PreparedPieceState) { } } diff --git a/src/updates.rs b/src/updates.rs index 1803813e..11f2b04e 100644 --- a/src/updates.rs +++ b/src/updates.rs @@ -459,14 +459,14 @@ impl<'r> PrepareUpdatesBuffer<'r> { p: &Box, op: PieceUpdateOp<(),()>, pri: &PieceRenderInstructions, - lens: &dyn Lens) -> PreparedPieceUpdate + _lens: &dyn Lens) -> PreparedPieceUpdate { max_z.update_max(&pc.zlevel.z); let op = op.try_map( |()|{ let mut ns = pc.prep_piecestate(p.as_ref(), pri)?; - lens.massage_prep_piecestate(&mut ns); + massage_prep_piecestate(pri, &mut ns); >::Ok(ns) }, |()|{ @@ -499,7 +499,7 @@ impl<'r> PrepareUpdatesBuffer<'r> { gen_update(pc, gen, &self.by_client); } let mut out: SecondarySlotMap = default(); - for player in gs.players.keys() { + for (player, gpl) in &mut gs.players { let ops = match ops { PUO::Simple(update) => update, PUO::PerPlayer(ref ops) => match ops.get(player) { @@ -509,13 +509,14 @@ impl<'r> PrepareUpdatesBuffer<'r> { }; let op = match (&mut pc, p) { (Some(pc), Some(p)) => { - let pri = lens.svg_pri(piece,pc,Default::default()); + let pri = piece_pri(&gs.occults, gpl, piece, *pc); Self::piece_update_player( &mut gs.max_z, pc, p, ops, &pri, lens )? } _ => PreparedPieceUpdate { - piece: lens.pieceid2visible(piece), + // The piece is deleted, so we can't leak anything. + piece: gpl.idmap.fwd_or_insert(piece), op: PieceUpdateOp::Delete(), } };