[{"data":1,"prerenderedAt":250},["ShallowReactive",2],{"$fAq03PWPam4BnIpD67pkBVGE69akmm9udwNylVoJ6Xrw":3},{"newThing":4,"project":5,"cycle":8,"sections":21,"threads":238,"otherDocs":239,"documents":242,"images":247,"archiveItems":248,"links":249},null,{"id":6,"label":7,"liveBase":4},"qmap","Qmap",{"id":9,"num":10,"dir":11,"name":12,"title":12,"focus":13,"status":14,"statusNote":4,"created":15,"completed":4,"mode":4,"report":4,"recordless":16,"thumbnail":4,"imageCount":17,"artifactCount":18,"lastActivity":19,"hasPickup":16,"hasInitialPrompt":20},"c26",26,"c26.flatland-view","flatland-view","Add a `flatland` view (topdown camera + pitched 3D models) for VOX\u002FOBJ-backed actors","active","2026-04-28",false,0,2,"2026-08-15",true,[22,53,123,187,205],{"key":23,"title":24,"empty":16,"ast":25},"why","Why",{"type":26,"children":27},"root",[28],{"type":29,"tag":30,"props":31,"children":32},"element","p",{},[33,36,43,45,51],{"type":34,"value":35},"text","Top-down views are great for layouts, but VOX\u002FOBJ character-like models are authored “upright” and read poorly from directly above.\n",{"type":29,"tag":37,"props":38,"children":40},"code",{"className":39},[],[41],{"type":34,"value":42},"flatland",{"type":34,"value":44}," keeps the same camera as ",{"type":29,"tag":37,"props":46,"children":48},{"className":47},[],[49],{"type":34,"value":50},"topdown",{"type":34,"value":52},", while pitching custom models to face the camera, improving silhouette legibility without changing layout.",{"key":54,"title":55,"empty":16,"ast":56},"objective","Objective",{"type":26,"children":57},[58,63],{"type":29,"tag":30,"props":59,"children":60},{},[61],{"type":34,"value":62},"Deliver a new camera preset and minimal pose plumbing so:",{"type":29,"tag":64,"props":65,"children":66},"ul",{},[67,86,99,118],{"type":29,"tag":68,"props":69,"children":70},"li",{},[71,77,79,84],{"type":29,"tag":37,"props":72,"children":74},{"className":73},[],[75],{"type":34,"value":76},"cameraPreset: 'flatland'",{"type":34,"value":78}," behaves like ",{"type":29,"tag":37,"props":80,"children":82},{"className":81},[],[83],{"type":34,"value":50},{"type":34,"value":85}," for the camera",{"type":29,"tag":68,"props":87,"children":88},{},[89,91,97],{"type":34,"value":90},"VOX\u002FOBJ-backed actors (created via ",{"type":29,"tag":37,"props":92,"children":94},{"className":93},[],[95],{"type":34,"value":96},"createVoxModelEntity",{"type":34,"value":98}," \u002F inventory wrappers) pitch to face up at the camera",{"type":29,"tag":68,"props":100,"children":101},{},[102,104,109,111,116],{"type":34,"value":103},"switching between ",{"type":29,"tag":37,"props":105,"children":107},{"className":106},[],[108],{"type":34,"value":50},{"type":34,"value":110}," and ",{"type":29,"tag":37,"props":112,"children":114},{"className":113},[],[115],{"type":34,"value":42},{"type":34,"value":117}," updates existing actor models in-place",{"type":29,"tag":68,"props":119,"children":120},{},[121],{"type":34,"value":122},"transitions spawn newly-entering custom model actors with the correct pose",{"key":124,"title":125,"empty":16,"ast":126},"scope","Scope",{"type":26,"children":127},[128],{"type":29,"tag":64,"props":129,"children":130},{},[131,149,168],{"type":29,"tag":68,"props":132,"children":133},{},[134,140,142,147],{"type":29,"tag":37,"props":135,"children":137},{"className":136},[],[138],{"type":34,"value":139},"src\u002Fcore\u002FcameraAnimation.js",{"type":34,"value":141}," — add ",{"type":29,"tag":37,"props":143,"children":145},{"className":144},[],[146],{"type":34,"value":42},{"type":34,"value":148}," preset",{"type":29,"tag":68,"props":150,"children":151},{},[152,158,160,166],{"type":29,"tag":37,"props":153,"children":155},{"className":154},[],[156],{"type":34,"value":157},"src\u002Fcomponents\u002FQMap.vue",{"type":34,"value":159}," + scene plumbing — thread a ",{"type":29,"tag":37,"props":161,"children":163},{"className":162},[],[164],{"type":34,"value":165},"modelPose",{"type":34,"value":167}," into actor creation and runtime updates",{"type":29,"tag":68,"props":169,"children":170},{},[171,177,179,185],{"type":29,"tag":37,"props":172,"children":174},{"className":173},[],[175],{"type":34,"value":176},"dev\u002Fexperiments\u002Fc23.custom-obj-models\u002Fshared\u002FcreateVoxModelEntity.js",{"type":34,"value":178}," — implement ",{"type":29,"tag":37,"props":180,"children":182},{"className":181},[],[183],{"type":34,"value":184},"setModelPose()",{"type":34,"value":186}," on custom model entities",{"key":188,"title":189,"empty":16,"ast":190},"extra","Non-Goals",{"type":26,"children":191},[192],{"type":29,"tag":64,"props":193,"children":194},{},[195,200],{"type":29,"tag":68,"props":196,"children":197},{},[198],{"type":34,"value":199},"re-anchoring rotated models to the ground plane",{"type":29,"tag":68,"props":201,"children":202},{},[203],{"type":34,"value":204},"pitching built-in primitive meshes (app\u002Fservice\u002Fuser\u002Fetc.)",{"key":188,"title":206,"empty":16,"ast":207},"Success Criteria",{"type":26,"children":208},[209],{"type":29,"tag":64,"props":210,"children":211},{},[212],{"type":29,"tag":68,"props":213,"children":214},{},[215,217,223,225,230,231,236],{"type":34,"value":216},"In c25 inventory experiments, flipping ",{"type":29,"tag":37,"props":218,"children":220},{"className":219},[],[221],{"type":34,"value":222},"cameraPreset",{"type":34,"value":224}," between ",{"type":29,"tag":37,"props":226,"children":228},{"className":227},[],[229],{"type":34,"value":50},{"type":34,"value":110},{"type":29,"tag":37,"props":232,"children":234},{"className":233},[],[235],{"type":34,"value":42},{"type":34,"value":237}," changes only the model pitch (camera stays topdown).",[],[240,241],"PLAN.md","initial-prompt.md",[243,245],{"file":240,"title":244},"Plan — Cycle 26: Flatland View",{"file":241,"title":246},"Initial prompt",[],[],[],1794599356243]