void ParticleEditor::refresh_state_ui()
  {
    per_state_info_.clear();
    TwRemoveAllVars(state_window_);
    TwAddVarCB(state_window_,
               "State Index",
               TW_TYPE_INT32,
               TweakBarParticleSetState,
               TweakBarParticleGetState,
               nullptr,
               "");
    TwAddButton(state_window_, 
                "Remove State", 
                TweakBarRemoveState, 
                &state_index_, 
                "");

    Reflection::Metadata* stateMeta = FindType(ParticleDescription);
    ParticleCallbackInfo stateInfo;
    stateInfo.baseData = FindType(ParticleDescription);
    stateInfo.type = ParticleUiType::State;
    //once for particle

    for(auto& it : stateMeta->GetMembers())
    {
      add_members(stateInfo, &it.second, state_window_, "state");
    }
    //once for variance
    stateInfo.type = ParticleUiType::Variance;
    for(auto& it : stateMeta->GetMembers())
    {
      add_members(stateInfo, &it.second, state_window_, "variance");
    }
  }
  void ParticleEditor::refresh_emitter_ui()
  {
    per_emitter_info_.clear();
    indices_for_tweakbar_.clear();
    TwRemoveAllVars(emitter_window_);
    TwAddVarCB(emitter_window_,
               "Emitter Index",
               TW_TYPE_INT32,
               TweakBarParticleSetEmitter,
               TweakBarParticleGetEmitter,
               nullptr,
               "");
    TwAddButton(emitter_window_,
                "Remove Emitter",
                TweakBarRemoveEmitter,
                &emitter_index_,
                "");
    TwAddButton(emitter_window_,
                "Add State",
                TweakBarAddState,
                nullptr,
                "");
    Reflection::Metadata* emitterMeta = FindType(ParticleEmitter);
    ParticleCallbackInfo emitterInfo;
    emitterInfo.baseData = emitterMeta;
    emitterInfo.type = ParticleUiType::Emitter;
    //first typical bullshit
    for(auto& it : emitterMeta->GetMembers())
    {
      add_members(emitterInfo, &it.second, emitter_window_);
    }
    //so here we have to add controls to toggle interpolation
    //either something interpolates or it doesn't no selective interpolation for certain states
    Reflection::Metadata* stateMeta = FindType(ParticleDescription);
    ParticleCallbackInfo stateInfo;
    stateInfo.baseData = FindType(ParticleDescription);
    stateInfo.type = ParticleUiType::State;
    
    
    per_emitter_info_.push_back(stateInfo);
    void* dataToSend = &per_emitter_info_.back();
    int index = 0;
    for(auto& it : stateMeta->GetMembers())
    {
      indices_for_tweakbar_.push_back(index);
      ++index;
      TwAddVarCB(emitter_window_,
                 it.second.GetName().c_str(),
                 TW_TYPE_STDSTRING,
                 TweakBarParticleSetRegistered,
                 TweakBarParticleGetRegistered,
                 &indices_for_tweakbar_.back(),
                 "group = 'registered vars'");
    }

    refresh_state_ui();
  }
Exemplo n.º 3
0
void CommandAddRefs::read_input_files() {
    m_vout << "Reading input files...\n";
    for (const std::string& file_name : m_input_filenames) {
        osmium::io::Reader reader(file_name, osmium::osm_entity_bits::object);
        while (osmium::memory::Buffer buffer = reader.read()) {
            for (auto it = buffer.begin<osmium::OSMObject>(); it != buffer.end<osmium::OSMObject>(); ++it) {
                if (it->type() == osmium::item_type::node) {
                    m_node_ids.insert(it->id());
                } else if (it->type() == osmium::item_type::way) {
                    m_way_ids.insert(it->id());
                    add_nodes(static_cast<const osmium::Way&>(*it));
                } else if (it->type() == osmium::item_type::relation) {
                    m_relation_ids.insert(it->id());
                    add_members(static_cast<const osmium::Relation&>(*it));
                }
            }
        }
        reader.close();
    }
}
  void ParticleEditor::refresh_system_ui()
  {
    per_system_info_.clear();
    TwRemoveAllVars(system_window_);
    TwAddVarCB(system_window_,
               "System Index",
               TW_TYPE_INT32,
               TweakBarParticleSetSystem,
               TweakBarParticleGetSystem,
               nullptr,
               "");
    TwAddButton(system_window_,
                "Remove System",
                TweakBarRemoveSystem,
                &system_index_,
                "");
    TwAddButton(system_window_,
                "Add Emitter",
                TweakBarAddEmitter,
                nullptr,
                "");
    Reflection::Metadata* systemMeta = FindType(ParticleSystem);
    ParticleCallbackInfo systemInfo;
    systemInfo.baseData = FindType(ParticleSystem);
    systemInfo.type = ParticleUiType::System;
    for(auto& it : systemMeta->GetMembers())
    {
      add_members(systemInfo, &it.second, system_window_);
    }


    

    refresh_emitter_ui();
    
  }
  void ParticleEditor::add_members(ParticleCallbackInfo& info, 
                                   Reflection::Member* base, 
                                   TwBar* bar,
                                   const std::string& group)
  {
    
    info.members.push_back(base);
    if(base->GetType() != FindType(Vector4))
    {
      for(auto& it : base->GetType()->GetMembers())
      {
        add_members(info, &it.second, bar, group);
      }
    }
    
    void* dataToSend = nullptr;
    switch(info.type)
    {
      case ParticleUiType::Emitter:
        per_emitter_info_.push_back(info);
        dataToSend = &per_emitter_info_.back();
        break;
      case ParticleUiType::System:
        per_system_info_.push_back(info);
        dataToSend = &per_system_info_.back();
        break;
      case ParticleUiType::State:
      case ParticleUiType::Variance:
        per_state_info_.push_back(info);
        dataToSend = &per_state_info_.back();
        break;
      default:
        __debugbreak();
    }

    std::string fullName = group + " ";
    Reflection::Metadata* type = base->GetType();
    for(auto& it : info.members)
    {
      fullName.append(it->GetName() + " ");
    }
    TwType varType = FindTwType(type);
    std::string tweakVars = " group='" + group + "'";
    if(varType == TW_TYPE_FLOAT || varType == TW_TYPE_COLOR4F)
    {
      tweakVars += " step=0.05 ";
    }
    if(varType == TW_TYPE_STDSTRING)
    {
      TwAddVarCB(bar,
                 fullName.c_str(),
                 FindTwType(type),
                 TweakBarParticleSetString,
                 TweakBarParticleGetString,
                 dataToSend,
                 tweakVars.c_str());
    }
    else
    {

      TwAddVarCB(bar,
                 fullName.c_str(),
                 FindTwType(type),
                 TweakBarParticleSet,
                 TweakBarParticleGet,
                 dataToSend,
                 tweakVars.c_str());
    }
    info.members.pop_back();
  }