chiark / gitweb /
hidden: Use new PieceRenderInstructions and svg massage APIs
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 31 Jan 2021 21:51:03 +0000 (21:51 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 31 Jan 2021 22:22:38 +0000 (22:22 +0000)
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 <ijackson@chiark.greenend.org.uk>
daemon/api.rs
daemon/session.rs
src/gamestate.rs
src/lens.rs
src/updates.rs

index 437801a7a99c89a4018dd64269920ff57455c726..f9a3407c80bbc33627032a0f8e0175e3f5f97e75 100644 (file)
@@ -86,16 +86,17 @@ impl<'r> Responder<'r> for OnlineErrorResponse {
 }
 
 fn log_did_to_piece<L: Lens + ?Sized>(
-  _occults: &GameOccults,
-  gpl: &mut GPlayerState, lens: &L,
+  occults: &GameOccults,
+  gpl: &mut GPlayerState, _lens: &L,
   piece: PieceId, pc: &PieceState, p: &dyn Piece,
   did: &str,
 ) -> Vec<LogEntry> {
+  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<O: ApiPieceOp>(form : Json<ApiPiece<O>>)
   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);
 
index d78b139f6308b9b6650cdfe0d49912b32ea8d5ec..05c8dc318cf1c0b04109d39cba091fab005dc731 100644 (file)
@@ -108,11 +108,7 @@ fn session_inner(form : Json<SessionForm>,
     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)?;
index b4da878cca6b1e3bc8322ca016b941a9e8403cea..c743b69b68a0c8fac591ba8053194d69cff9ed84 100644 (file)
@@ -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)
index aabf608720d3d77131775d0c17585f9df6ca636d..50536ad07b1496c493e9da33b2920a563102dd21 100644 (file)
@@ -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) { }
 }
 
index 1803813e234cf71d7d01705f76c9853d9721f32b..11f2b04e2d6ffb4f15363c53a9491ac877712942 100644 (file)
@@ -459,14 +459,14 @@ impl<'r> PrepareUpdatesBuffer<'r> {
                          p: &Box<dyn Piece>,
                          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);
         <Result<_,InternalError>>::Ok(ns)
       },
       |()|{
@@ -499,7 +499,7 @@ impl<'r> PrepareUpdatesBuffer<'r> {
       gen_update(pc, gen, &self.by_client);
     }
     let mut out: SecondarySlotMap<PlayerId, PreparedPieceUpdate> = 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(),
         }
       };