//TODO: use generic ReadableStructures here ? void RecvInputState::recv_client_opts(BitStream &bs) { ClientOptions opts; ClientOption *entry; glm::vec3 vec; int cmd_idx; while((cmd_idx = bs.GetPackedBits(1))!=0) { entry=opts.get(cmd_idx-1); if (!entry) { qWarning() << "recv_client_opts missing opt for cmd index" << cmd_idx-1; continue; } for(ClientOption::Arg &arg : entry->m_args) { switch ( arg.type ) { case ClientOption::t_int: { *((int32_t *)arg.tgt) = bs.GetPackedBits(1); break; } case ClientOption::t_float: { *((float *)arg.tgt)=bs.GetFloat(); break; } case ClientOption::t_quant_angle: { float * tgt_angle = (float *)arg.tgt; *tgt_angle = AngleDequantize(bs.GetBits(14),14); qCDebug(logInput, "Quant angle res:%f", *tgt_angle); //dequantized angle break; } case ClientOption::t_string: case ClientOption::t_sentence: { QString v; bs.GetString(v); break; } case ClientOption::t_vec3: { for (int j = 0; j < 3; ++j ) { vec[j] = bs.GetFloat(); } break; } default: continue; } } } }
//TODO: use generic ReadableStructures here ? void InputState::recv_client_opts(BitStream &bs) { ClientOptions opts; ClientOption *entry; int opt_idx=0; int some_idx = bs.GetPackedBits(1); entry=opts.get(opt_idx)-1; Vector3 vec; while(some_idx!=0) { for(size_t i=0; i<entry->m_args.size(); i++) { ClientOption::Arg &arg=entry->m_args[i]; switch ( arg.type ) { case ClientOption::t_int: { *((int32_t *)arg.tgt) = bs.GetPackedBits(1); break; } case ClientOption::t_float: { *((float *)arg.tgt)=bs.GetFloat(); break; } case ClientOption::t_quant_angle: { printf("Quant:%d\n",bs.GetBits(14)); //quantized angle break; } case ClientOption::t_string: case 4: { std::string v; bs.GetString(v); break; } case ClientOption::t_vec3: { for (int j = 0; j < 3; ++j ) { vec.v[j] = bs.GetFloat(); } break; } default: continue; } } some_idx = bs.GetPackedBits(1)-1; opt_idx++; entry=opts.get(opt_idx); } }