GameModel::GameModel(): sim(NULL), ren(NULL), currentBrush(0), currentUser(0, ""), currentSave(NULL), colourSelector(false), clipboard(NULL), stamp(NULL), placeSave(NULL), colour(255, 0, 0, 255), toolStrength(1.0f) { sim = new Simulation(); ren = new Renderer(ui::Engine::Ref().g, sim); memset(activeTools, 0, sizeof(activeTools)); //Load config into renderer try { ren->SetColourMode(Client::Ref().GetPrefUInteger("Renderer.ColourMode", 0)); vector<unsigned int> tempArray = Client::Ref().GetPrefUIntegerArray("Renderer.DisplayModes"); if(tempArray.size()) { std::vector<unsigned int> displayModes(tempArray.begin(), tempArray.end()); ren->SetDisplayMode(displayModes); } tempArray = Client::Ref().GetPrefUIntegerArray("Renderer.RenderModes"); if(tempArray.size()) { std::vector<unsigned int> renderModes(tempArray.begin(), tempArray.end()); ren->SetRenderMode(renderModes); } } catch(json::Exception & e) { } //Load config into simulation sim->SetEdgeMode(Client::Ref().GetPrefInteger("Simulation.EdgeMode", 0)); //Load last user if(Client::Ref().GetAuthUser().ID) { currentUser = Client::Ref().GetAuthUser(); } //Set stamp to first stamp in list vector<string> stamps = Client::Ref().GetStamps(0, 1); if(stamps.size()>0) { SaveFile * stampFile = Client::Ref().GetStamp(stamps[0]); if(stampFile && stampFile->GetGameSave()) stamp = stampFile->GetGameSave(); } BuildMenus(); BuildQuickOptionMenu(); //Set default decoration colour unsigned char colourR = min(Client::Ref().GetPrefInteger("Decoration.Red", 200), 255); unsigned char colourG = min(Client::Ref().GetPrefInteger("Decoration.Green", 100), 255); unsigned char colourB = min(Client::Ref().GetPrefInteger("Decoration.Blue", 50), 255); unsigned char colourA = min(Client::Ref().GetPrefInteger("Decoration.Alpha", 255), 255); SetColourSelectorColour(ui::Colour(colourR, colourG, colourB, colourA)); }
GameModel::GameModel(): sim(NULL), ren(NULL), currentBrush(0), currentUser(0, ""), currentSave(NULL), currentFile(NULL), colourSelector(false), clipboard(NULL), stamp(NULL), placeSave(NULL), colour(255, 0, 0, 255), toolStrength(1.0f), activeColourPreset(-1), activeMenu(NULL), edgeMode(0) { sim = new Simulation(); ren = new Renderer(ui::Engine::Ref().g, sim); activeTools = regularToolset; std::fill(decoToolset, decoToolset+3, (Tool*)NULL); std::fill(regularToolset, regularToolset+3, (Tool*)NULL); //Default render prefs std::vector<unsigned int> tempArray; tempArray.push_back(RENDER_FIRE); tempArray.push_back(RENDER_EFFE); tempArray.push_back(RENDER_BASC); ren->SetRenderMode(tempArray); tempArray.clear(); ren->SetDisplayMode(tempArray); ren->SetColourMode(0); //Load config into renderer try { ren->SetColourMode(Client::Ref().GetPrefUInteger("Renderer.ColourMode", 0)); vector<unsigned int> tempArray = Client::Ref().GetPrefUIntegerArray("Renderer.DisplayModes"); if(tempArray.size()) { std::vector<unsigned int> displayModes(tempArray.begin(), tempArray.end()); ren->SetDisplayMode(displayModes); } tempArray = Client::Ref().GetPrefUIntegerArray("Renderer.RenderModes"); if(tempArray.size()) { std::vector<unsigned int> renderModes(tempArray.begin(), tempArray.end()); ren->SetRenderMode(renderModes); } ren->gravityFieldEnabled = Client::Ref().GetPrefBool("Renderer.GravityField", false); ren->decorations_enable = Client::Ref().GetPrefBool("Renderer.Decorations", true); } catch(json::Exception & e) { } //Load config into simulation edgeMode = Client::Ref().GetPrefInteger("Simulation.EdgeMode", 0); sim->SetEdgeMode(edgeMode); //Load last user if(Client::Ref().GetAuthUser().ID) { currentUser = Client::Ref().GetAuthUser(); } //Set stamp to first stamp in list vector<string> stamps = Client::Ref().GetStamps(0, 1); if(stamps.size()>0) { SaveFile * stampFile = Client::Ref().GetStamp(stamps[0]); if(stampFile && stampFile->GetGameSave()) stamp = stampFile->GetGameSave(); } BuildMenus(); //Set default decoration colour unsigned char colourR = min(Client::Ref().GetPrefInteger("Decoration.Red", 200), 255); unsigned char colourG = min(Client::Ref().GetPrefInteger("Decoration.Green", 100), 255); unsigned char colourB = min(Client::Ref().GetPrefInteger("Decoration.Blue", 50), 255); unsigned char colourA = min(Client::Ref().GetPrefInteger("Decoration.Alpha", 255), 255); SetColourSelectorColour(ui::Colour(colourR, colourG, colourB, colourA)); colourPresets.push_back(ui::Colour(255, 255, 255)); colourPresets.push_back(ui::Colour(0, 255, 255)); colourPresets.push_back(ui::Colour(255, 0, 255)); colourPresets.push_back(ui::Colour(255, 255, 0)); colourPresets.push_back(ui::Colour(255, 0, 0)); colourPresets.push_back(ui::Colour(0, 255, 0)); colourPresets.push_back(ui::Colour(0, 0, 255)); }
GameModel::GameModel(): sim(NULL), ren(NULL), currentBrush(0), currentUser(0, ""), currentSave(NULL), currentFile(NULL), colourSelector(false), clipboard(NULL), stamp(NULL), placeSave(NULL), colour(255, 0, 0, 255), toolStrength(1.0f), activeColourPreset(-1), activeMenu(-1), edgeMode(0) { sim = new Simulation(); ren = new Renderer(ui::Engine::Ref().g, sim); activeTools = regularToolset; std::fill(decoToolset, decoToolset+4, (Tool*)NULL); std::fill(regularToolset, regularToolset+4, (Tool*)NULL); //Default render prefs std::vector<unsigned int> tempArray; tempArray.push_back(RENDER_FIRE); tempArray.push_back(RENDER_EFFE); tempArray.push_back(RENDER_BASC); ren->SetRenderMode(tempArray); tempArray.clear(); ren->SetDisplayMode(tempArray); ren->SetColourMode(0); //Load config into renderer try { ren->SetColourMode(Client::Ref().GetPrefUInteger("Renderer.ColourMode", 0)); vector<unsigned int> tempArray = Client::Ref().GetPrefUIntegerArray("Renderer.DisplayModes"); if(tempArray.size()) { std::vector<unsigned int> displayModes(tempArray.begin(), tempArray.end()); ren->SetDisplayMode(displayModes); } tempArray = Client::Ref().GetPrefUIntegerArray("Renderer.RenderModes"); if(tempArray.size()) { std::vector<unsigned int> renderModes(tempArray.begin(), tempArray.end()); ren->SetRenderMode(renderModes); } ren->gravityFieldEnabled = Client::Ref().GetPrefBool("Renderer.GravityField", false); ren->decorations_enable = Client::Ref().GetPrefBool("Renderer.Decorations", true); } catch(json::Exception & e) { } //Load config into simulation edgeMode = Client::Ref().GetPrefInteger("Simulation.EdgeMode", 0); sim->SetEdgeMode(edgeMode); int ngrav_enable = Client::Ref().GetPrefInteger("Simulation.NewtonianGravity", 0); if (ngrav_enable) sim->grav->start_grav_async(); sim->aheat_enable = Client::Ref().GetPrefInteger("Simulation.AmbientHeat", 0); sim->pretty_powder = Client::Ref().GetPrefInteger("Simulation.PrettyPowder", 0); //Load last user if(Client::Ref().GetAuthUser().ID) { currentUser = Client::Ref().GetAuthUser(); } //Set stamp to first stamp in list vector<string> stamps = Client::Ref().GetStamps(0, 1); if(stamps.size()>0) { SaveFile * stampFile = Client::Ref().GetStamp(stamps[0]); if(stampFile && stampFile->GetGameSave()) stamp = stampFile->GetGameSave(); } BuildMenus(); //Set default brush palette brushList.push_back(new EllipseBrush(ui::Point(4, 4))); brushList.push_back(new Brush(ui::Point(4, 4))); brushList.push_back(new TriangleBrush(ui::Point(4, 4))); //Load more from brushes folder std::vector<string> brushFiles = Client::Ref().DirectorySearch(BRUSH_DIR, "", ".ptb"); for(int i = 0; i < brushFiles.size(); i++) { std::vector<unsigned char> brushData = Client::Ref().ReadFile(brushFiles[i]); if(!brushData.size()) { std::cout << "Brushes: Skipping " << brushFiles[i] << ". Could not open" << std::endl; continue; } int dimension = std::sqrt((float)brushData.size()); if(dimension * dimension != brushData.size()) { std::cout << "Brushes: Skipping " << brushFiles[i] << ". Invalid bitmap size" << std::endl; continue; } brushList.push_back(new BitmapBrush(brushData, ui::Point(dimension, dimension))); } //Set default decoration colour unsigned char colourR = min(Client::Ref().GetPrefInteger("Decoration.Red", 200), 255); unsigned char colourG = min(Client::Ref().GetPrefInteger("Decoration.Green", 100), 255); unsigned char colourB = min(Client::Ref().GetPrefInteger("Decoration.Blue", 50), 255); unsigned char colourA = min(Client::Ref().GetPrefInteger("Decoration.Alpha", 255), 255); SetColourSelectorColour(ui::Colour(colourR, colourG, colourB, colourA)); colourPresets.push_back(ui::Colour(255, 255, 255)); colourPresets.push_back(ui::Colour(0, 255, 255)); colourPresets.push_back(ui::Colour(255, 0, 255)); colourPresets.push_back(ui::Colour(255, 255, 0)); colourPresets.push_back(ui::Colour(255, 0, 0)); colourPresets.push_back(ui::Colour(0, 255, 0)); colourPresets.push_back(ui::Colour(0, 0, 255)); colourPresets.push_back(ui::Colour(0, 0, 0)); }
void GameModel::BuildMenus() { int lastMenu = -1; if(activeMenu != -1) lastMenu = activeMenu; std::string activeToolIdentifiers[4]; if(regularToolset[0]) activeToolIdentifiers[0] = regularToolset[0]->GetIdentifier(); if(regularToolset[1]) activeToolIdentifiers[1] = regularToolset[1]->GetIdentifier(); if(regularToolset[2]) activeToolIdentifiers[2] = regularToolset[2]->GetIdentifier(); if(regularToolset[3]) activeToolIdentifiers[3] = regularToolset[3]->GetIdentifier(); //Empty current menus for (size_t i = 0; i < menuList.size(); i++) { if (i == SC_FAVORITES) menuList[i]->ClearTools(); delete menuList[i]; } menuList.clear(); toolList.clear(); for(std::vector<Tool*>::iterator iter = extraElementTools.begin(), end = extraElementTools.end(); iter != end; ++iter) { delete *iter; } extraElementTools.clear(); elementTools.clear(); //Create menus for (int i = 0; i < SC_TOTAL; i++) { menuList.push_back(new Menu((const char)sim->msections[i].icon[0], sim->msections[i].name, sim->msections[i].doshow)); } //Build menus from Simulation elements for(int i = 0; i < PT_NUM; i++) { if(sim->elements[i].Enabled) { Tool * tempTool; if(i == PT_LIGH) { tempTool = new Element_LIGH_Tool(i, sim->elements[i].Name, sim->elements[i].Description, PIXR(sim->elements[i].Colour), PIXG(sim->elements[i].Colour), PIXB(sim->elements[i].Colour), sim->elements[i].Identifier, sim->elements[i].IconGenerator); } else if(i == PT_TESC) { tempTool = new Element_TESC_Tool(i, sim->elements[i].Name, sim->elements[i].Description, PIXR(sim->elements[i].Colour), PIXG(sim->elements[i].Colour), PIXB(sim->elements[i].Colour), sim->elements[i].Identifier, sim->elements[i].IconGenerator); } else if(i == PT_STKM || i == PT_FIGH || i == PT_STKM2) { tempTool = new PlopTool(i, sim->elements[i].Name, sim->elements[i].Description, PIXR(sim->elements[i].Colour), PIXG(sim->elements[i].Colour), PIXB(sim->elements[i].Colour), sim->elements[i].Identifier, sim->elements[i].IconGenerator); } else { tempTool = new ElementTool(i, sim->elements[i].Name, sim->elements[i].Description, PIXR(sim->elements[i].Colour), PIXG(sim->elements[i].Colour), PIXB(sim->elements[i].Colour), sim->elements[i].Identifier, sim->elements[i].IconGenerator); } if (sim->elements[i].MenuSection >= 0 && sim->elements[i].MenuSection < SC_TOTAL && sim->elements[i].MenuVisible) { menuList[sim->elements[i].MenuSection]->AddTool(tempTool); } else { extraElementTools.push_back(tempTool); } elementTools.push_back(tempTool); } } //Build menu for GOL types for(int i = 0; i < NGOL; i++) { Tool * tempTool = new ElementTool(PT_LIFE|(i<<8), sim->gmenu[i].name, std::string(sim->gmenu[i].description), PIXR(sim->gmenu[i].colour), PIXG(sim->gmenu[i].colour), PIXB(sim->gmenu[i].colour), "DEFAULT_PT_LIFE_"+std::string(sim->gmenu[i].name)); menuList[SC_LIFE]->AddTool(tempTool); } //Build other menus from wall data for(int i = 0; i < UI_WALLCOUNT; i++) { Tool * tempTool = new WallTool(i, "", std::string(sim->wtypes[i].descs), PIXR(sim->wtypes[i].colour), PIXG(sim->wtypes[i].colour), PIXB(sim->wtypes[i].colour), sim->wtypes[i].identifier, sim->wtypes[i].textureGen); menuList[SC_WALL]->AddTool(tempTool); //sim->wtypes[i] } //Build menu for tools for (size_t i = 0; i < sim->tools.size(); i++) { Tool * tempTool; tempTool = new Tool(i, sim->tools[i]->Name, sim->tools[i]->Description, PIXR(sim->tools[i]->Colour), PIXG(sim->tools[i]->Colour), PIXB(sim->tools[i]->Colour), sim->tools[i]->Identifier); menuList[SC_TOOL]->AddTool(tempTool); } //Add special sign and prop tools menuList[SC_TOOL]->AddTool(new WindTool(0, "WIND", "Creates air movement.", 64, 64, 64, "DEFAULT_UI_WIND")); menuList[SC_TOOL]->AddTool(new PropertyTool()); menuList[SC_TOOL]->AddTool(new SignTool(this)); menuList[SC_TOOL]->AddTool(new SampleTool(this)); //Add decoration tools to menu menuList[SC_DECO]->AddTool(new DecorationTool(ren, DECO_ADD, "ADD", "Colour blending: Add.", 0, 0, 0, "DEFAULT_DECOR_ADD")); menuList[SC_DECO]->AddTool(new DecorationTool(ren, DECO_SUBTRACT, "SUB", "Colour blending: Subtract.", 0, 0, 0, "DEFAULT_DECOR_SUB")); menuList[SC_DECO]->AddTool(new DecorationTool(ren, DECO_MULTIPLY, "MUL", "Colour blending: Multiply.", 0, 0, 0, "DEFAULT_DECOR_MUL")); menuList[SC_DECO]->AddTool(new DecorationTool(ren, DECO_DIVIDE, "DIV", "Colour blending: Divide." , 0, 0, 0, "DEFAULT_DECOR_DIV")); menuList[SC_DECO]->AddTool(new DecorationTool(ren, DECO_SMUDGE, "SMDG", "Smudge tool, blends surrounding deco together.", 0, 0, 0, "DEFAULT_DECOR_SMDG")); menuList[SC_DECO]->AddTool(new DecorationTool(ren, DECO_CLEAR, "CLR", "Erase any set decoration.", 0, 0, 0, "DEFAULT_DECOR_CLR")); menuList[SC_DECO]->AddTool(new DecorationTool(ren, DECO_DRAW, "SET", "Draw decoration (No blending).", 0, 0, 0, "DEFAULT_DECOR_SET")); SetColourSelectorColour(colour); // update tool colors decoToolset[0] = GetToolFromIdentifier("DEFAULT_DECOR_SET"); decoToolset[1] = GetToolFromIdentifier("DEFAULT_DECOR_CLR"); decoToolset[2] = GetToolFromIdentifier("DEFAULT_UI_SAMPLE"); decoToolset[3] = GetToolFromIdentifier("DEFAULT_PT_NONE"); //Set default tools regularToolset[0] = GetToolFromIdentifier("DEFAULT_PT_DUST"); regularToolset[1] = GetToolFromIdentifier("DEFAULT_PT_NONE"); regularToolset[2] = GetToolFromIdentifier("DEFAULT_UI_SAMPLE"); regularToolset[3] = GetToolFromIdentifier("DEFAULT_PT_NONE"); if(activeToolIdentifiers[0].length()) regularToolset[0] = GetToolFromIdentifier(activeToolIdentifiers[0]); if(activeToolIdentifiers[1].length()) regularToolset[1] = GetToolFromIdentifier(activeToolIdentifiers[1]); if(activeToolIdentifiers[2].length()) regularToolset[2] = GetToolFromIdentifier(activeToolIdentifiers[2]); if(activeToolIdentifiers[3].length()) regularToolset[3] = GetToolFromIdentifier(activeToolIdentifiers[3]); lastTool = activeTools[0]; //Set default menu activeMenu = SC_POWDERS; if(lastMenu != -1) activeMenu = lastMenu; if(activeMenu != -1) toolList = menuList[activeMenu]->GetToolList(); else toolList = std::vector<Tool*>(); notifyMenuListChanged(); notifyToolListChanged(); notifyActiveToolsChanged(); notifyLastToolChanged(); //Build menu for favorites BuildFavoritesMenu(); }