#include "vr/hand_workshop.h" #include #include #include using namespace mkw::vr::hand_workshop; void Check(bool v) { if(!v)std::abort(); } int main(int argc,char** argv) { { using namespace mkw::vr; std::array triggers{}; Mtx34 grip=kIdentityMtx34,wrist=kIdentityMtx34,offset{};wrist[11]=-.055f; // The trigger used to enter the workshop must be released before capturing. Check(!triggers[0].Capture(.9f,true,false,grip,wrist,offset)); Check(!triggers[0].Capture(0,true,false,grip,wrist,offset)); // A normal press captures irrespective of a global menu pointer position. Check(triggers[0].Capture(.65f,true,false,grip,wrist,offset)); Check(std::abs(offset[11]+.055f)<.0001f); Check(ConsumePointer(triggers,0));Check(!ConsumePointer(triggers,1)); Check(!triggers[0].Capture(.9f,true,false,grip,wrist,offset)); Check(ConsumePointer(triggers,0)); triggers[1].Release(0); Check(triggers[1].Capture(.9f,true,false,grip,wrist,offset)); Check(ConsumePointer(triggers,0) && ConsumePointer(triggers,1)); triggers[0].Release(0);Check(!ConsumePointer(triggers,0) && ConsumePointer(triggers,1)); triggers[1].Release(0); // A distant press belongs to menu navigation, never to calibration. grip[3]=.4f; Check(!triggers[0].Capture(.9f,true,false,grip,wrist,offset));Check(!ConsumePointer(triggers,0)); grip[3]=0; Check(!triggers[0].Capture(.9f,true,false,grip,wrist,offset)); // no late capture while held triggers[0].Release(0); Check(!triggers[0].Capture(.9f,false,false,grip,wrist,offset)); Check(!triggers[0].Capture(.9f,true,true,grip,wrist,offset)); } Check(Key("mario_body__mario_all_tx")=="mario_body"); Check(Key("kinopico_body__kinopico_all_tx")!="mario_body"); Check(Key("body__bb_peach_all_tx")!=Key("body__bb_daisy_all_tx")); Check(Key("k_hair_model__kino_g_hair")==Key("kino_girl_body__kino_g_hair")); for(auto bytes: {std::vector{},std::vector(16,0)}) { bool failed=false;try {Unpack(bytes);}catch(const std::exception&) {failed=true;}Check(failed); } if(argc>1) { std::set keys; for(unsigned i=0;i