From: Ian Jackson Date: Tue, 5 Jan 2021 01:33:47 +0000 (+0000) Subject: reworked angle X-Git-Tag: otter-0.2.0~24 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=2015c12817bc70adfcb97a63f5f9fb6a14a14b69;p=otter.git reworked angle Signed-off-by: Ian Jackson --- diff --git a/daemon/api.rs b/daemon/api.rs index 06e8dbc3..b00fe990 100644 --- a/daemon/api.rs +++ b/daemon/api.rs @@ -322,6 +322,34 @@ impl ApiPieceOp for ApiPieceMove { } } +/* +#[derive(Debug,Serialize,Deserialize)] +struct ApiPieceRotate (bool); +#[post("/_/api/r", format="json", data="
")] +#[throws(OE)] +fn api_rotate(form : Json>) -> impl response::Responder<'static> { + api_piece_op(form) +} +impl ApiPieceOp for ApiPieceRotate { + #[throws(ApiPieceOpError)] + fn op(&self, a: ApiPieceOpArgs) -> PieceUpdateFromOp { + let ApiPieceOpArgs { gs,piece, .. } = a; + let pc = gs.pieces.byid_mut(piece).unwrap(); + let (pos, clamped) = self.0.clamped(gs.table_size); + let logents = vec![]; + pc.pos = pos; + if clamped { + throw!(ApiPieceOpError::PartiallyProcessed( + PieceOpError::PosOffTable, + logents, + )); + } + let update = PieceUpdateOp::Move(self.0); + (WhatResponseToClientOp::Predictable, + update, logents) + } +}*/ + #[derive(Debug,Serialize,Deserialize)] struct ApiPiecePin (bool); #[post("/_/api/pin", format="json", data="")] diff --git a/daemon/session.rs b/daemon/session.rs index 37ef11ff..56cf652f 100644 --- a/daemon/session.rs +++ b/daemon/session.rs @@ -31,7 +31,6 @@ struct SessionFormattedLogEntry { struct SessionPieceContext { id: VisiblePieceId, pos: Pos, - transform: VisibleAngleTransform, info: String, // SessionPieceLoadJson as JSON } @@ -41,6 +40,7 @@ struct SessionPieceLoadJson<'r> { z: ZCoord, zg: Generation, pinned: bool, + angle: VisiblePieceAngle, uos: &'r [UoDescription], } @@ -104,25 +104,25 @@ fn session_inner(form : Json, for (gpid, pr) in pieces { let pri = PieceRenderInstructions { - id : make_pieceid_visible(gpid), - face : pr.face, + id: make_pieceid_visible(gpid), + angle: make_angle_visible(pr.angle), + face: pr.face, }; let p = if let Some(p) = ig.ipieces.get(gpid) { p } else { continue /* was deleted */ }; let defs = p.make_defs(&pri)?; alldefs.push((pri.id, defs)); - let transform = make_angle_visible(pr.angle, pr.pos); let for_info = SessionPieceLoadJson { - held : &pr.held, - z : pr.zlevel.z.clone(), - zg : pr.zlevel.zg, - pinned : pr.pinned, - uos : &p.ui_operations()?, + held: &pr.held, + z: pr.zlevel.z.clone(), + zg: pr.zlevel.zg, + pinned: pr.pinned, + angle: pri.angle, + uos: &p.ui_operations()?, }; let for_piece = SessionPieceContext { - transform, id: pri.id, pos: pr.pos, info: serde_json::to_string(&for_info) diff --git a/src/gamestate.rs b/src/gamestate.rs index d68be53e..19f1851d 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -23,6 +23,11 @@ pub struct Generation(pub u64); visible_slotmap_key!{ VisiblePieceId('.') } +#[derive(Clone,Copy,Debug)] +#[derive(Serialize,Deserialize)] +#[serde(transparent)] +pub struct VisiblePieceAngle(PieceAngle); + #[derive(Clone,Debug)] #[derive(Serialize,Deserialize)] #[serde(transparent)] @@ -141,9 +146,10 @@ pub trait Piece: Outline + Send + Debug { fn itemname(&self) -> &str; } -#[derive(Debug,Copy,Clone)] +#[derive(Debug,Clone)] pub struct PieceRenderInstructions { pub id: VisiblePieceId, + pub angle: VisiblePieceAngle, pub face: FaceId, } @@ -226,6 +232,18 @@ impl Debug for Html { } } +impl VisiblePieceAngle { + pub fn to_transform(self) -> VisibleAngleTransform { + match self.0 { + PieceAngle::Compass(angle) => VisibleAngleTransform( + zcoord::misc::raw_angle_transform( + angle.into() + ) + ), + } + } +} + // ---------- game state - rendering etc. ---------- impl PieceState { @@ -259,9 +277,10 @@ impl PieceExt for T where T: Piece + ?Sized { Some(n) => n, None => -1, }; + let transform = pri.angle.to_transform(); write!(&mut defs.0, - r##""##, - pri.id, dragraise)?; + r##""##, + pri.id, &transform.0, dragraise)?; self.svg_piece(&mut defs, &pri)?; write!(&mut defs.0, r##""##)?; write!(&mut defs.0, @@ -328,8 +347,7 @@ pub fn make_pieceid_visible(p: PieceId) -> VisiblePieceId { VisiblePieceId(kd) } -pub fn make_angle_visible(angle: PieceAngle, pos: Pos) - -> VisibleAngleTransform { +pub fn make_angle_visible(angle: PieceAngle) -> VisiblePieceAngle { // todo-lens need to do censorship mapping here - VisibleAngleTransform(angle.to_transform(pos)) + VisiblePieceAngle(angle) } diff --git a/src/lens.rs b/src/lens.rs index f5bd2f38..3b22a69c 100644 --- a/src/lens.rs +++ b/src/lens.rs @@ -27,7 +27,8 @@ impl Lens for TransparentLens { fn log_pri(&self, piece: PieceId, pc: &PieceState) -> PieceRenderInstructions { let id = self.pieceid2visible(piece); - PieceRenderInstructions { id, face : pc.face } + let angle = make_angle_visible(pc.angle); + PieceRenderInstructions { id, angle, face: pc.face } } fn svg_pri(&self, piece: PieceId, pc: &PieceState, _player: PlayerId) -> PieceRenderInstructions { diff --git a/src/spec.rs b/src/spec.rs index 23712b37..2c01f014 100644 --- a/src/spec.rs +++ b/src/spec.rs @@ -315,19 +315,6 @@ pub mod implementation { } } - impl PieceAngle { - pub fn to_transform(self, pos: Pos) -> String { - match self { - PieceAngle::Compass(CompassAngle(angle)) => { - if angle == 0 { default() } - else { format!("rotate({}, {}, {})", - -45 * (angle as i16), - pos.0[0], pos.0[1]) } - } - } - } - } - impl Default for Acl

{ fn default() -> Self { Acl { ents: default() } } } diff --git a/templates/macros.tera b/templates/macros.tera index 32f8eac5..48dfa885 100644 --- a/templates/macros.tera +++ b/templates/macros.tera @@ -61,7 +61,6 @@ Hi {{nick | escape}} {%- for piece in uses %} {%- endfor %} diff --git a/zcoord/misc.rs b/zcoord/misc.rs index 842273ea..3f0057c7 100644 --- a/zcoord/misc.rs +++ b/zcoord/misc.rs @@ -24,3 +24,9 @@ pub fn timestring_abbreviate<'x>(base: &str, this: &'x str) else { (this, false) } } } + +pub fn raw_angle_transform(compass: u8) -> String { + assert!(compass < 8); + if compass == 0 { Default::default() } + else { format!("rotate({})", -45 * (compass as i16)) } +}