static int l_pack_end(lua_State *l) { UI::Box *b = LuaObject<UI::Box>::CheckFromLua(1); if (lua_istable(l, 2)) { for (size_t i = 0; i < lua_rawlen(l, 2); i++) { lua_rawgeti(l, 2, i+1); b->PackEnd(LuaObject<UI::Widget>::CheckFromLua(-1)); lua_pop(l, 1); } } else b->PackEnd(LuaObject<UI::Widget>::CheckFromLua(2)); lua_pushvalue(l, 1); return 1; }
static int l_pack_start(lua_State *l) { UI::Box *b = LuaObject<UI::Box>::CheckFromLua(1); if (lua_istable(l, 2)) { UI::Widget *w = UI::Lua::GetWidget(l, 2); if (w) b->PackEnd(w); else for (size_t i = lua_rawlen(l, 2); i > 0; i--) { lua_rawgeti(l, 2, i); b->PackStart(UI::Lua::CheckWidget(l, -1)); lua_pop(l, 1); } } else b->PackEnd(UI::Lua::CheckWidget(l, 2)); lua_pushvalue(l, 1); return 1; }
static int l_pack_end(lua_State *l) { UI::Box *b = LuaObject<UI::Box>::CheckFromLua(1); UI::Context *c = b->GetContext(); if (lua_istable(l, 2)) { UI::Widget *w = UI::Lua::GetWidget(c, l, 2); if (w) b->PackEnd(w); else for (size_t i = 0; i < lua_rawlen(l, 2); i++) { lua_rawgeti(l, 2, i+1); b->PackEnd(UI::Lua::CheckWidget(c, l, -1)); lua_pop(l, 1); } } else b->PackEnd(UI::Lua::CheckWidget(c, l, 2)); lua_pushvalue(l, 1); return 1; }
static int l_pack_start(lua_State *l) { UI::Box *b = LuaObject<UI::Box>::CheckFromLua(1); Uint32 flags = _unpack_flags(l); if (lua_istable(l, 2)) { for (size_t i = lua_rawlen(l, 2); i > 0; i--) { lua_rawgeti(l, 2, i); b->PackStart(LuaObject<UI::Widget>::CheckFromLua(-1), flags); lua_pop(l, 1); } } else b->PackEnd(LuaObject<UI::Widget>::CheckFromLua(2), flags); lua_pushvalue(l, 1); return 1; }
void Pi::Init(const std::map<std::string,std::string> &options, bool no_gui) { #ifdef PIONEER_PROFILER Profiler::reset(); #endif Profiler::Timer timer; timer.Start(); OS::EnableBreakpad(); OS::NotifyLoadBegin(); FileSystem::Init(); FileSystem::userFiles.MakeDirectory(""); // ensure the config directory exists #ifdef PIONEER_PROFILER FileSystem::userFiles.MakeDirectory("profiler"); profilerPath = FileSystem::JoinPathBelow(FileSystem::userFiles.GetRoot(), "profiler"); #endif Pi::config = new GameConfig(options); if (config->Int("RedirectStdio")) OS::RedirectStdio(); std::string version(PIONEER_VERSION); if (strlen(PIONEER_EXTRAVERSION)) version += " (" PIONEER_EXTRAVERSION ")"; const char* platformName = SDL_GetPlatform(); if(platformName) Output("ver %s on: %s\n\n", version.c_str(), platformName); else Output("ver %s but could not detect platform name.\n\n", version.c_str()); Output("%s\n", OS::GetOSInfoString().c_str()); ModManager::Init(); Lang::Resource res(Lang::GetResource("core", config->String("Lang"))); Lang::MakeCore(res); Pi::detail.planets = config->Int("DetailPlanets"); Pi::detail.textures = config->Int("Textures"); Pi::detail.fracmult = config->Int("FractalMultiple"); Pi::detail.cities = config->Int("DetailCities"); // Initialize SDL Uint32 sdlInitFlags = SDL_INIT_VIDEO | SDL_INIT_JOYSTICK; #if defined(DEBUG) || defined(_DEBUG) sdlInitFlags |= SDL_INIT_NOPARACHUTE; #endif if (SDL_Init(sdlInitFlags) < 0) { Error("SDL initialization failed: %s\n", SDL_GetError()); } SDL_version ver; SDL_GetVersion(&ver); Output("SDL Version %d.%d.%d\n", ver.major, ver.minor, ver.patch); Graphics::RendererOGL::RegisterRenderer(); // Do rest of SDL video initialization and create Renderer Graphics::Settings videoSettings = {}; videoSettings.rendererType = Graphics::RENDERER_OPENGL; videoSettings.width = config->Int("ScrWidth"); videoSettings.height = config->Int("ScrHeight"); videoSettings.fullscreen = (config->Int("StartFullscreen") != 0); videoSettings.hidden = no_gui; videoSettings.requestedSamples = config->Int("AntiAliasingMode"); videoSettings.vsync = (config->Int("VSync") != 0); videoSettings.useTextureCompression = (config->Int("UseTextureCompression") != 0); videoSettings.enableDebugMessages = (config->Int("EnableGLDebug") != 0); videoSettings.iconFile = OS::GetIconFilename(); videoSettings.title = "Pioneer"; Pi::renderer = Graphics::Init(videoSettings); Pi::CreateRenderTarget(videoSettings.width, videoSettings.height); Pi::rng.IncRefCount(); // so nothing tries to free it Pi::rng.seed(time(0)); InitJoysticks(); // we can only do bindings once joysticks are initialised. if (!no_gui) // This re-saves the config file. With no GUI we want to allow multiple instances in parallel. KeyBindings::InitBindings(); joystickEnabled = (config->Int("EnableJoystick")) ? true : false; mouseYInvert = (config->Int("InvertMouseY")) ? true : false; compactScanner = (config->Int("CompactScanner")) ? true : false; navTunnelDisplayed = (config->Int("DisplayNavTunnel")) ? true : false; speedLinesDisplayed = (config->Int("SpeedLines")) ? true : false; hudTrailsDisplayed = (config->Int("HudTrails")) ? true : false; EnumStrings::Init(); // get threads up Uint32 numThreads = config->Int("WorkerThreads"); const int numCores = OS::GetNumCores(); assert(numCores > 0); if (numThreads == 0) numThreads = std::max(Uint32(numCores) - 1, 1U); asyncJobQueue.reset(new AsyncJobQueue(numThreads)); Output("started %d worker threads\n", numThreads); syncJobQueue.reset(new SyncJobQueue); Output("ShipType::Init()\n"); // XXX early, Lua init needs it ShipType::Init(); // XXX UI requires Lua but Pi::ui must exist before we start loading // templates. so now we have crap everywhere :/ Output("Lua::Init()\n"); Lua::Init(); Pi::ui.Reset(new UI::Context(Lua::manager, Pi::renderer, Graphics::GetScreenWidth(), Graphics::GetScreenHeight())); LuaInit(); // Gui::Init shouldn't initialise any VBOs, since we haven't tested // that the capability exists. (Gui does not use VBOs so far) Gui::Init(renderer, Graphics::GetScreenWidth(), Graphics::GetScreenHeight(), 800, 600); UI::Box *box = Pi::ui->VBox(5); UI::Label *label = Pi::ui->Label(""); label->SetFont(UI::Widget::FONT_HEADING_NORMAL); UI::Gauge *gauge = Pi::ui->Gauge(); Pi::ui->GetTopLayer()->SetInnerWidget( Pi::ui->Margin(10, UI::Margin::HORIZONTAL)->SetInnerWidget( Pi::ui->Expand()->SetInnerWidget( Pi::ui->Align(UI::Align::MIDDLE)->SetInnerWidget( box->PackEnd(UI::WidgetSet( label, gauge )) ) ) ) ); draw_progress(gauge, label, 0.0f); Output("GalaxyGenerator::Init()\n"); if (config->HasEntry("GalaxyGenerator")) GalaxyGenerator::Init(config->String("GalaxyGenerator"), config->Int("GalaxyGeneratorVersion", GalaxyGenerator::LAST_VERSION)); else GalaxyGenerator::Init(); draw_progress(gauge, label, 0.1f); Output("FaceParts::Init()\n"); FaceParts::Init(); draw_progress(gauge, label, 0.2f); Output("new ModelCache\n"); modelCache = new ModelCache(Pi::renderer); draw_progress(gauge, label, 0.3f); Output("Shields::Init\n"); Shields::Init(Pi::renderer); draw_progress(gauge, label, 0.4f); //unsigned int control_word; //_clearfp(); //_controlfp_s(&control_word, _EM_INEXACT | _EM_UNDERFLOW | _EM_ZERODIVIDE, _MCW_EM); //double fpexcept = Pi::timeAccelRates[1] / Pi::timeAccelRates[0]; Output("BaseSphere::Init\n"); BaseSphere::Init(); draw_progress(gauge, label, 0.5f); Output("CityOnPlanet::Init\n"); CityOnPlanet::Init(); draw_progress(gauge, label, 0.6f); Output("SpaceStation::Init\n"); SpaceStation::Init(); draw_progress(gauge, label, 0.7f); Output("NavLights::Init\n"); NavLights::Init(Pi::renderer); draw_progress(gauge, label, 0.75f); Output("Sfx::Init\n"); Sfx::Init(Pi::renderer); draw_progress(gauge, label, 0.8f); if (!no_gui && !config->Int("DisableSound")) { Output("Sound::Init\n"); Sound::Init(); Sound::SetMasterVolume(config->Float("MasterVolume")); Sound::SetSfxVolume(config->Float("SfxVolume")); GetMusicPlayer().SetVolume(config->Float("MusicVolume")); Sound::Pause(0); if (config->Int("MasterMuted")) Sound::Pause(1); if (config->Int("SfxMuted")) Sound::SetSfxVolume(0.f); if (config->Int("MusicMuted")) GetMusicPlayer().SetEnabled(false); } draw_progress(gauge, label, 0.9f); OS::NotifyLoadEnd(); draw_progress(gauge, label, 1.0f); #if 0 // frame test code Frame *root = new Frame(0, "root", 0); Frame *p1 = new Frame(root, "p1", Frame::FLAG_HAS_ROT); Frame *p1r = new Frame(p1, "p1r", Frame::FLAG_ROTATING); Frame *m1 = new Frame(p1, "m1", Frame::FLAG_HAS_ROT); Frame *m1r = new Frame(m1, "m1r", Frame::FLAG_ROTATING); Frame *p2 = new Frame(root, "p2", Frame::FLAG_HAS_ROT); Frame *p2r = new Frame(p2, "pr2", Frame::FLAG_ROTATING); p1->SetPosition(vector3d(1000,0,0)); p1->SetVelocity(vector3d(0,1,0)); p2->SetPosition(vector3d(0,2000,0)); p2->SetVelocity(vector3d(-2,0,0)); p1r->SetAngVelocity(vector3d(0,0,0.0001)); p1r->SetOrient(matrix3x3d::BuildRotate(M_PI/4, vector3d(0,0,1))); p2r->SetAngVelocity(vector3d(0,0,-0.0004)); p2r->SetOrient(matrix3x3d::BuildRotate(-M_PI/2, vector3d(0,0,1))); root->UpdateOrbitRails(0, 0); CargoBody *c1 = new CargoBody(Equip::Type::SLAVES); c1->SetFrame(p1r); c1->SetPosition(vector3d(0,180,0)); // c1->SetVelocity(vector3d(1,0,0)); CargoBody *c2 = new CargoBody(Equip::Type::SLAVES); c2->SetFrame(p1r); c2->SetPosition(vector3d(0,200,0)); // c2->SetVelocity(vector3d(1,0,0)); vector3d pos = c1->GetPositionRelTo(p1); vector3d vel = c1->GetVelocityRelTo(p1); double speed = vel.Length(); vector3d pos2 = c2->GetPositionRelTo(p1); vector3d vel2 = c2->GetVelocityRelTo(p1); double speed2 = vel2.Length(); double speed3 = c2->GetVelocityRelTo(c1).Length(); c2->SwitchToFrame(p1); vector3d vel4 = c2->GetVelocityRelTo(c1); double speed4 = c2->GetVelocityRelTo(c1).Length(); root->UpdateOrbitRails(0, 1.0); //buildrotate test matrix3x3d m = matrix3x3d::BuildRotate(M_PI/2, vector3d(0,0,1)); vector3d v = m * vector3d(1,0,0); /* vector3d pos = p1r->GetPositionRelTo(p2r); vector3d vel = p1r->GetVelocityRelTo(p2r); matrix3x3d o1 = p1r->GetOrientRelTo(p2r); double speed = vel.Length(); vector3d pos2 = p2r->GetPositionRelTo(p1r); vector3d vel2 = p2r->GetVelocityRelTo(p1r); matrix3x3d o2 = p2r->GetOrientRelTo(p1r); double speed2 = vel2.Length(); */ root->UpdateOrbitRails(0, 1.0/60); delete p2r; delete p2; delete m1r; delete m1; delete p1r; delete p1; delete root; delete c1; delete c2; #endif #if 0 // test code to produce list of ship stats FILE *pStatFile = fopen("shipstat.csv","wt"); if (pStatFile) { fprintf(pStatFile, "name,modelname,hullmass,capacity,fakevol,rescale,xsize,ysize,zsize,facc,racc,uacc,sacc,aacc,exvel\n"); for (auto iter : ShipType::types) { const ShipType *shipdef = &(iter.second); SceneGraph::Model *model = Pi::FindModel(shipdef->modelName, false); double hullmass = shipdef->hullMass; double capacity = shipdef->capacity; double xsize = 0.0, ysize = 0.0, zsize = 0.0, fakevol = 0.0, rescale = 0.0, brad = 0.0; if (model) { std::unique_ptr<SceneGraph::Model> inst(model->MakeInstance()); model->CreateCollisionMesh(); Aabb aabb = model->GetCollisionMesh()->GetAabb(); xsize = aabb.max.x-aabb.min.x; ysize = aabb.max.y-aabb.min.y; zsize = aabb.max.z-aabb.min.z; fakevol = xsize*ysize*zsize; brad = aabb.GetRadius(); rescale = pow(fakevol/(100 * (hullmass+capacity)), 0.3333333333); } double simass = (hullmass + capacity) * 1000.0; double angInertia = (2/5.0)*simass*brad*brad; double acc1 = shipdef->linThrust[ShipType::THRUSTER_FORWARD] / (9.81*simass); double acc2 = shipdef->linThrust[ShipType::THRUSTER_REVERSE] / (9.81*simass); double acc3 = shipdef->linThrust[ShipType::THRUSTER_UP] / (9.81*simass); double acc4 = shipdef->linThrust[ShipType::THRUSTER_RIGHT] / (9.81*simass); double acca = shipdef->angThrust/angInertia; double exvel = shipdef->effectiveExhaustVelocity; fprintf(pStatFile, "%s,%s,%.1f,%.1f,%.1f,%.3f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%f,%.1f\n", shipdef->name.c_str(), shipdef->modelName.c_str(), hullmass, capacity, fakevol, rescale, xsize, ysize, zsize, acc1, acc2, acc3, acc4, acca, exvel); } fclose(pStatFile); } #endif luaConsole = new LuaConsole(); KeyBindings::toggleLuaConsole.onPress.connect(sigc::mem_fun(Pi::luaConsole, &LuaConsole::Toggle)); planner = new TransferPlanner(); timer.Stop(); Output("\n\nLoading took: %lf milliseconds\n", timer.millicycles()); }
void ModelViewer::SetupUI() { UI::Context *c = m_ui.Get(); c->SetFont(UI::Widget::FONT_XSMALL); for (unsigned int i=0; i<9; i++) colorSliders[i] = 0; for (unsigned int i=0; i<6; i++) thrustSliders[i] = 0; animSlider = 0; animValue = 0; if (!m_model) return SetupFilePicker(); const int spacing = 5; UI::SmallButton *reloadButton; UI::SmallButton *toggleGridButton; UI::CheckBox *collMeshCheck; UI::CheckBox *gunsCheck; UI::VBox* outerBox = c->VBox(); UI::VBox* mainBox = c->VBox(5); UI::VBox* bottomBox = c->VBox(5); UI::HBox* sliderBox = c->HBox(); bottomBox->PackEnd(sliderBox); outerBox->PackEnd(UI::WidgetSet( c->Expand()->SetInnerWidget(c->Grid(UI::CellSpec(0.20f,0.8f,0.25f),1) ->SetColumn(0, mainBox) ->SetColumn(2, m_logScroller.Get()) ), bottomBox )); c->SetInnerWidget(c->Margin(spacing)->SetInnerWidget(outerBox)); //model name + reload button: visible even if loading failed mainBox->PackEnd(nameLabel = c->Label(m_modelName)); nameLabel->SetFont(UI::Widget::FONT_NORMAL); add_pair(c, mainBox, reloadButton = c->SmallButton(), "Reload model"); reloadButton->onClick.connect(sigc::bind(sigc::mem_fun(*this, &ModelViewer::OnReloadModel), reloadButton)); if (m_model == 0) { c->Layout(); return; } add_pair(c, mainBox, toggleGridButton = c->SmallButton(), "Grid mode"); add_pair(c, mainBox, collMeshCheck = c->CheckBox(), "Collision mesh"); //pattern selector if (m_model->SupportsPatterns()) { mainBox->PackEnd(c->Label("Pattern:")); mainBox->PackEnd(patternSelector = c->DropDown()->AddOption("Default")); sliderBox->PackEnd( c->Grid(3,4) ->SetColumn(0, UI::WidgetSet( c->Label("Color 1"), c->HBox(spacing)->PackEnd(c->Label("R"))->PackEnd(colorSliders[0] = c->HSlider()), c->HBox(spacing)->PackEnd(c->Label("G"))->PackEnd(colorSliders[1] = c->HSlider()), c->HBox(spacing)->PackEnd(c->Label("B"))->PackEnd(colorSliders[2] = c->HSlider()) )) ->SetColumn(1, UI::WidgetSet( c->Label("Color 2"), c->HBox(spacing)->PackEnd(c->Label("R"))->PackEnd(colorSliders[3] = c->HSlider()), c->HBox(spacing)->PackEnd(c->Label("G"))->PackEnd(colorSliders[4] = c->HSlider()), c->HBox(spacing)->PackEnd(c->Label("B"))->PackEnd(colorSliders[5] = c->HSlider()) )) ->SetColumn(2, UI::WidgetSet( c->Label("Color 3"), c->HBox(spacing)->PackEnd(c->Label("R"))->PackEnd(colorSliders[6] = c->HSlider()), c->HBox(spacing)->PackEnd(c->Label("G"))->PackEnd(colorSliders[7] = c->HSlider()), c->HBox(spacing)->PackEnd(c->Label("B"))->PackEnd(colorSliders[8] = c->HSlider()) )) ); //connect slider signals, set initial values (RGB) const float values[] = { 1.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.f, 0.f, 1.f }; for(unsigned int i=0; i<3*3; i++) { colorSliders[i]->SetValue(values[i]); colorSliders[i]->onValueChanged.connect(sigc::mem_fun(*this, &ModelViewer::OnModelColorsChanged)); } //// slidems end patternSelector->onOptionSelected.connect(sigc::mem_fun(*this, &ModelViewer::OnPatternChanged)); UpdatePatternList(); } //decal selector //models support up to 4 but 1 is enough here if (m_model->SupportsDecals()) { mainBox->PackEnd(c->Label("Decal:")); mainBox->PackEnd(decalSelector = c->DropDown()); decalSelector->onOptionSelected.connect(sigc::mem_fun(*this, &ModelViewer::OnDecalChanged)); std::vector<std::string> decals; collect_decals(decals); for (std::vector<std::string>::const_iterator it = decals.begin(); it != decals.end(); ++it) { decalSelector->AddOption(*it); } } //light dropdown UI::DropDown *lightSelector; mainBox->PackEnd(c->Label("Lights:")); mainBox->PackEnd( lightSelector = c->DropDown() ->AddOption("1 Front white") ->AddOption("2 Two-point") ->AddOption("3 Backlight") //->AddOption("4 Nuts") ); m_options.lightPreset = 0; add_pair(c, mainBox, gunsCheck = c->CheckBox(), "Attach guns"); //Animation controls if (!m_model->GetAnimations().empty()) { //UI::Button *playBtn; //UI::Button *revBtn; //UI::Button *stopBtn; UI::Box *animBox; mainBox->PackEnd(animBox = c->VBox(spacing)); animBox->PackEnd(m_ui->Label("Animation:")); animBox->PackEnd(animSelector = m_ui->DropDown()->AddOption("None")); //add_pair(m_ui, animBox, playBtn = m_ui->Button(), "Play/Pause"); //add_pair(m_ui, animBox, revBtn = m_ui->Button(), "Play reverse"); //add_pair(m_ui, animBox, stopBtn = m_ui->Button(), "Stop"); bottomBox->PackStart(c->HBox(10)->PackEnd(UI::WidgetSet(c->Label("Animation:"), animSlider = c->HSlider(), animValue = c->Label("0.0")))); animValue->SetFont(UI::Widget::FONT_NORMAL); //playBtn->onClick.connect(sigc::bind(sigc::mem_fun(*this, &ModelViewer::OnAnimPlay), playBtn, false)); //revBtn->onClick.connect(sigc::bind(sigc::mem_fun(*this, &ModelViewer::OnAnimPlay), revBtn, true)); //stopBtn->onClick.connect(sigc::bind(sigc::mem_fun(*this, &ModelViewer::OnAnimStop), stopBtn)); animSlider->onValueChanged.connect(sigc::mem_fun(*this, &ModelViewer::OnAnimSliderChanged)); animSelector->onOptionSelected.connect(sigc::mem_fun(*this, &ModelViewer::OnAnimChanged)); //update anims from model UpdateAnimList(); } //// Thrust sliders bool supportsThrusters = false; { SceneGraph::FindNodeVisitor fivi(SceneGraph::FindNodeVisitor::MATCH_NAME_STARTSWITH, "thruster_"); m_model->GetRoot()->Accept(fivi); supportsThrusters = !fivi.GetResults().empty(); } if (supportsThrusters) { sliderBox->PackStart( c->Grid(2,4) ->SetColumn(0, UI::WidgetSet( // Column 1, Linear thrust sliders c->Label("Linear"), c->HBox(spacing)->PackEnd(c->Label("X"))->PackEnd(thrustSliders[0] = c->HSlider()), c->HBox(spacing)->PackEnd(c->Label("Y"))->PackEnd(thrustSliders[1] = c->HSlider()), c->HBox(spacing)->PackEnd(c->Label("Z"))->PackEnd(thrustSliders[2] = c->HSlider()) )) ->SetColumn(1, UI::WidgetSet( //Column 2, Angular thrust sliders c->Label("Angular"), c->HBox(spacing)->PackEnd(c->Label("Pitch"))->PackEnd(thrustSliders[3] = c->HSlider()), c->HBox(spacing)->PackEnd(c->Label("Yaw"))->PackEnd(thrustSliders[4] = c->HSlider()), c->HBox(spacing)->PackEnd(c->Label("Roll"))->PackEnd(thrustSliders[5] = c->HSlider()) )) ); for(unsigned int i=0; i<2*3; i++) { thrustSliders[i]->SetValue(0.5f); thrustSliders[i]->onValueChanged.connect(sigc::mem_fun(*this, &ModelViewer::OnThrustChanged)); } ////thruster sliders end } c->Layout(); //event handlers collMeshCheck->onClick.connect(sigc::bind(sigc::mem_fun(*this, &ModelViewer::OnToggleCollMesh), collMeshCheck)); gunsCheck->onClick.connect(sigc::bind(sigc::mem_fun(*this, &ModelViewer::OnToggleGuns), gunsCheck)); lightSelector->onOptionSelected.connect(sigc::mem_fun(*this, &ModelViewer::OnLightPresetChanged)); toggleGridButton->onClick.connect(sigc::bind(sigc::mem_fun(*this, &ModelViewer::OnToggleGrid), toggleGridButton)); }