void DecorationTool::DrawFill(Simulation * sim, Brush * brush, ui::Point position) { pixel loc = ren->vid[position.X+position.Y*WINDOWW]; if (toolID == DECO_CLEAR) sim->ApplyDecorationFill(ren, position.X, position.Y, 0, 0, 0, 0, PIXR(loc), PIXG(loc), PIXB(loc)); else sim->ApplyDecorationFill(ren, position.X, position.Y, Red, Green, Blue, Alpha, PIXR(loc), PIXG(loc), PIXB(loc)); }
char * Graphics::GenerateGradient(pixel * colours, float * points, int pointcount, int size) { int cp, i, j; pixel ptemp; char * newdata = (char*)malloc(size * 3); float poss, pose, temp; memset(newdata, 0, size*3); //Sort the Colours and Points for (i = (pointcount - 1); i > 0; i--) { for (j = 1; j <= i; j++) { if (points[j-1] > points[j]) { temp = points[j-1]; points[j-1] = points[j]; points[j] = temp; ptemp = colours[j-1]; colours[j-1] = colours[j]; colours[j] = ptemp; } } } i = 0; j = 1; poss = points[i]; pose = points[j]; for (cp = 0; cp < size; cp++) { float cpos = (float)cp / (float)size, ccpos, cccpos; if(cpos > pose && j+1 < pointcount) { poss = points[++i]; pose = points[++j]; } ccpos = cpos - poss; cccpos = ccpos / (pose - poss); if(cccpos > 1.0f) cccpos = 1.0f; newdata[(cp*3)] = PIXR(colours[i])*(1.0f-cccpos) + PIXR(colours[j])*(cccpos); newdata[(cp*3)+1] = PIXG(colours[i])*(1.0f-cccpos) + PIXG(colours[j])*(cccpos); newdata[(cp*3)+2] = PIXB(colours[i])*(1.0f-cccpos) + PIXB(colours[j])*(cccpos); } return newdata; }
//#TPT-Directive ElementHeader Element_LIFE static int graphics(GRAPHICS_FUNC_ARGS) int Element_LIFE::graphics(GRAPHICS_FUNC_ARGS) { pixel pc; if (cpart->ctype==NGT_LOTE)//colors for life states { if (cpart->tmp==2) pc = PIXRGB(255, 128, 0); else if (cpart->tmp==1) pc = PIXRGB(255, 255, 0); else pc = PIXRGB(255, 0, 0); } else if (cpart->ctype==NGT_FRG2)//colors for life states { if (cpart->tmp==2) pc = PIXRGB(0, 100, 50); else pc = PIXRGB(0, 255, 90); } else if (cpart->ctype==NGT_STAR)//colors for life states { if (cpart->tmp==4) pc = PIXRGB(0, 0, 128); else if (cpart->tmp==3) pc = PIXRGB(0, 0, 150); else if (cpart->tmp==2) pc = PIXRGB(0, 0, 190); else if (cpart->tmp==1) pc = PIXRGB(0, 0, 230); else pc = PIXRGB(0, 0, 70); } else if (cpart->ctype==NGT_FROG)//colors for life states { if (cpart->tmp==2) pc = PIXRGB(0, 100, 0); else pc = PIXRGB(0, 255, 0); } else if (cpart->ctype==NGT_BRAN)//colors for life states { if (cpart->tmp==1) pc = PIXRGB(150, 150, 0); else pc = PIXRGB(255, 255, 0); } else { pc = Element_GOL_colour[cpart->ctype]; } *colr = PIXR(pc); *colg = PIXG(pc); *colb = PIXB(pc); return 0; }
TPT_INLINE void VideoBuffer::BlendPixel(int x, int y, int r, int g, int b, int a) { #ifdef PIX32OGL pixel t; if (x<0 || y<0 || x>=Width || y>=Height) return; if (a!=255) { t = Buffer[y*(Width)+x]; r = (a*r + (255-a)*PIXR(t)) >> 8; g = (a*g + (255-a)*PIXG(t)) >> 8; b = (a*b + (255-a)*PIXB(t)) >> 8; a = a > PIXA(t) ? a : PIXA(t); }
int graphics_STKM(GRAPHICS_FUNC_ARGS) { *pixel_mode = PSPEC_STICKMAN; if ((int)player.elem<PT_NUM) { *colr = PIXR(ptypes[player.elem].pcolors); *colg = PIXG(ptypes[player.elem].pcolors); *colb = PIXB(ptypes[player.elem].pcolors); } else { *colr = *colg = *colb = 255; } return 1; }
VideoBuffer * SignTool::GetIcon(int toolID, int width, int height) { VideoBuffer * newTexture = new VideoBuffer(width, height); for (int y=0; y<height; y++) { for (int x=0; x<width; x++) { pixel pc = x==0||x==width-1||y==0||y==height-1 ? PIXPACK(0xA0A0A0) : PIXPACK(0x000000); newTexture->SetPixel(x, y, PIXR(pc), PIXG(pc), PIXB(pc), 255); } } newTexture->AddCharacter((width/2)-5, (height/2)-5, 0xE021, 32, 64, 128, 255); newTexture->BlendCharacter((width/2)-5, (height/2)-5, 0xE020, 255, 255, 255, 255); return newTexture; }
int graphics_STKM(GRAPHICS_FUNC_ARGS) { if ((int)player.elem<PT_NUM) { *colr = PIXR(ptypes[player.elem].pcolors); *colg = PIXG(ptypes[player.elem].pcolors); *colb = PIXB(ptypes[player.elem].pcolors); } else { *colr = *colg = *colb = 255; } graphics_stickmen(GRAPHICS_FUNC_SUBCALL_ARGS); return 0; }
int graphics_FIGH(GRAPHICS_FUNC_ARGS) { playerst * cplayer = &fighters[(unsigned char)cpart->tmp]; *pixel_mode = PSPEC_STICKMAN; if (cplayer->elem<PT_NUM) { *colr = PIXR(ptypes[cplayer->elem].pcolors); *colg = PIXG(ptypes[cplayer->elem].pcolors); *colb = PIXB(ptypes[cplayer->elem].pcolors); } else { *colr = *colg = *colb = 255; } return 1; }
void SampleTool::Draw(Simulation * sim, Brush * brush, ui::Point position) { if(gameModel->GetColourSelectorVisibility()) { pixel colour = gameModel->GetRenderer()->sampleColor; gameModel->SetColourSelectorColour(ui::Colour(PIXR(colour), PIXG(colour), PIXB(colour), 255)); } else { int particleType = 0; int particleCtype = 0; if (sim->photons[position.Y][position.X]) { particleType = sim->parts[ID(sim->photons[position.Y][position.X])].type; particleCtype = sim->parts[ID(sim->pmap[position.Y][position.X])].ctype; } else if (sim->pmap[position.Y][position.X]) { particleType = sim->parts[ID(sim->pmap[position.Y][position.X])].type; particleCtype = sim->parts[ID(sim->pmap[position.Y][position.X])].ctype; } if(particleType) { if(particleType == PT_LIFE) { Menu * lifeMenu = gameModel->GetMenuList()[SC_LIFE]; std::vector<Tool*> elementTools = lifeMenu->GetToolList(); for(std::vector<Tool*>::iterator iter = elementTools.begin(), end = elementTools.end(); iter != end; ++iter) { Tool * elementTool = *iter; if(elementTool && ID(elementTool->GetToolID()) == particleCtype) gameModel->SetActiveTool(0, elementTool); } } else { Tool * elementTool = gameModel->GetElementTool(particleType); if(elementTool) gameModel->SetActiveTool(0, elementTool); } } } }
void *Graphics::ptif_pack(pixel *src, int w, int h, int *result_size){ int i = 0, datalen = (w*h)*3, cx = 0, cy = 0; unsigned char *red_chan = (unsigned char*)calloc(1, w*h); unsigned char *green_chan = (unsigned char*)calloc(1, w*h); unsigned char *blue_chan = (unsigned char*)calloc(1, w*h); unsigned char *data = (unsigned char*)malloc(((w*h)*3)+8); unsigned char *result = (unsigned char*)malloc(((w*h)*3)+8); for(cx = 0; cx<w; cx++){ for(cy = 0; cy<h; cy++){ red_chan[w*(cy)+(cx)] = PIXR(src[w*(cy)+(cx)]); green_chan[w*(cy)+(cx)] = PIXG(src[w*(cy)+(cx)]); blue_chan[w*(cy)+(cx)] = PIXB(src[w*(cy)+(cx)]); } } memcpy(data, red_chan, w*h); memcpy(data+(w*h), green_chan, w*h); memcpy(data+((w*h)*2), blue_chan, w*h); free(red_chan); free(green_chan); free(blue_chan); result[0] = 'P'; result[1] = 'T'; result[2] = 'i'; result[3] = 1; result[4] = w; result[5] = w>>8; result[6] = h; result[7] = h>>8; i -= 8; if(BZ2_bzBuffToBuffCompress((char *)(result+8), (unsigned *)&i, (char *)data, datalen, 9, 0, 0) != 0){ free(data); free(result); return NULL; } *result_size = i+8; free(data); return result; }
pixel *Graphics::rescale_img(pixel *src, int sw, int sh, int *qw, int *qh, int f) { int i,j,x,y,w,h,r,g,b,c; pixel p, *q; w = (sw+f-1)/f; h = (sh+f-1)/f; q = (pixel *)malloc(w*h*PIXELSIZE); for (y=0; y<h; y++) for (x=0; x<w; x++) { r = g = b = c = 0; for (j=0; j<f; j++) for (i=0; i<f; i++) if (x*f+i<sw && y*f+j<sh) { p = src[(y*f+j)*sw + (x*f+i)]; if (p) { r += PIXR(p); g += PIXG(p); b += PIXB(p); c ++; } } if (c>1) { r = (r+c/2)/c; g = (g+c/2)/c; b = (b+c/2)/c; } q[y*w+x] = PIXRGB(r, g, b); } *qw = w; *qh = h; return q; }
void GameModel::BuildMenus() { //Empty current menus for(std::vector<Menu*>::iterator iter = menuList.begin(), end = menuList.end(); iter != end; ++iter) { delete *iter; } menuList.clear(); toolList.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)); } //Build menus from Simulation elements for(int i = 0; i < PT_NUM; i++) { if(sim->elements[i].MenuSection < 12 && sim->elements[i].Enabled && sim->elements[i].MenuVisible) { 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].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].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].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].IconGenerator); } menuList[sim->elements[i].MenuSection]->AddTool(tempTool); } } //Build menu for GOL types for(int i = 0; i < NGOL; i++) { Tool * tempTool = new GolTool(i, 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)); 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].textureGen); menuList[SC_WALL]->AddTool(tempTool); //sim->wtypes[i] } //Add special sign and prop tools menuList[SC_TOOL]->AddTool(new SignTool()); menuList[SC_TOOL]->AddTool(new PropertyTool()); menuList[SC_TOOL]->AddTool(new WindTool(0, "WIND", "Create air movement", 64, 64, 64)); //Build menu for simtools for(int 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)); menuList[SC_TOOL]->AddTool(tempTool); } //Add decoration tools to menu menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::BlendAdd, "ADD", "Colour blending: Add", 0, 0, 0)); menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::BlendRemove, "SUB", "Colour blending: Subtract", 0, 0, 0)); menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::BlendMultiply, "MUL", "Colour blending: Multiply", 0, 0, 0)); menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::BlendDivide, "DIV", "Colour blending: Divide" , 0, 0, 0)); menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::BlendSmudge, "SMDG", "Smudge colour", 0, 0, 0)); menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::BlendSet, "SET", "Set colour (No blending)", 0, 0, 0)); menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::Remove, "CLR", "Clear any set decoration", 0, 0, 0)); //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))); //Set default tools activeTools[0] = menuList[SC_POWDERS]->GetToolList()[0]; activeTools[1] = menuList[SC_SPECIAL]->GetToolList()[0]; activeTools[2] = NULL; lastTool = activeTools[0]; //Set default menu activeMenu = menuList[SC_POWDERS]; toolList = menuList[SC_POWDERS]->GetToolList(); notifyMenuListChanged(); notifyToolListChanged(); notifyActiveToolsChanged(); notifyLastToolChanged(); }
pixel *Graphics::resample_img(pixel *src, int sw, int sh, int rw, int rh) { #ifdef HIGH_QUALITY_RESAMPLE unsigned char * source = (unsigned char*)src; int sourceWidth = sw, sourceHeight = sh; int resultWidth = rw, resultHeight = rh; int sourcePitch = sourceWidth*PIXELSIZE, resultPitch = resultWidth*PIXELSIZE; // Filter scale - values < 1.0 cause aliasing, but create sharper looking mips. const float filter_scale = 0.75f; const char* pFilter = "lanczos12"; Resampler * resamplers[PIXELCHANNELS]; float * samples[PIXELCHANNELS]; //Resampler for each colour channel resamplers[0] = new Resampler(sourceWidth, sourceHeight, resultWidth, resultHeight, Resampler::BOUNDARY_CLAMP, 0.0f, 1.0f, pFilter, NULL, NULL, filter_scale, filter_scale); samples[0] = new float[sourceWidth]; for (int i = 1; i < PIXELCHANNELS; i++) { resamplers[i] = new Resampler(sourceWidth, sourceHeight, resultWidth, resultHeight, Resampler::BOUNDARY_CLAMP, 0.0f, 1.0f, pFilter, resamplers[0]->get_clist_x(), resamplers[0]->get_clist_y(), filter_scale, filter_scale); samples[i] = new float[sourceWidth]; } unsigned char * resultImage = new unsigned char[resultHeight * resultPitch]; std::fill(resultImage, resultImage + (resultHeight*resultPitch), 0); //Resample time int resultY = 0; for (int sourceY = 0; sourceY < sourceHeight; sourceY++) { unsigned char * sourcePixel = &source[sourceY * sourcePitch]; //Move pixel components into channel samples for (int c = 0; c < PIXELCHANNELS; c++) { for (int x = 0; x < sourceWidth; x++) { samples[c][x] = sourcePixel[(x*PIXELSIZE)+c] * (1.0f/255.0f); } } //Put channel sample data into resampler for (int c = 0; c < PIXELCHANNELS; c++) { if (!resamplers[c]->put_line(&samples[c][0])) { printf("Out of memory!\n"); return NULL; } } //Perform resample and Copy components from resampler result samples to image buffer for ( ; ; ) { int comp_index; for (comp_index = 0; comp_index < PIXELCHANNELS; comp_index++) { const float* resultSamples = resamplers[comp_index]->get_line(); if (!resultSamples) break; unsigned char * resultPixel = &resultImage[(resultY * resultPitch) + comp_index]; for (int x = 0; x < resultWidth; x++) { int c = (int)(255.0f * resultSamples[x] + .5f); if (c < 0) c = 0; else if (c > 255) c = 255; *resultPixel = (unsigned char)c; resultPixel += PIXELSIZE; } } if (comp_index < PIXELCHANNELS) break; resultY++; } } //Clean up for(int i = 0; i < PIXELCHANNELS; i++) { delete resamplers[i]; delete[] samples[i]; } return (pixel*)resultImage; #else #ifdef DEBUG std::cout << "Resampling " << sw << "x" << sh << " to " << rw << "x" << rh << std::endl; #endif bool stairstep = false; if(rw < sw || rh < sh) { float fx = (float)(((float)sw)/((float)rw)); float fy = (float)(((float)sh)/((float)rh)); int fxint, fyint; double fxintp_t, fyintp_t; float fxf = modf(fx, &fxintp_t), fyf = modf(fy, &fyintp_t); fxint = fxintp_t; fyint = fyintp_t; if(((fxint & (fxint-1)) == 0 && fxf < 0.1f) || ((fyint & (fyint-1)) == 0 && fyf < 0.1f)) stairstep = true; #ifdef DEBUG if(stairstep) std::cout << "Downsampling by " << fx << "x" << fy << " using stairstepping" << std::endl; else std::cout << "Downsampling by " << fx << "x" << fy << " without stairstepping" << std::endl; #endif } int y, x, fxceil, fyceil; //int i,j,x,y,w,h,r,g,b,c; pixel *q = NULL; if(rw == sw && rh == sh){ //Don't resample q = new pixel[rw*rh]; std::copy(src, src+(rw*rh), q); } else if(!stairstep) { float fx, fy, fyc, fxc; double intp; pixel tr, tl, br, bl; q = new pixel[rw*rh]; //Bilinear interpolation for upscaling for (y=0; y<rh; y++) for (x=0; x<rw; x++) { fx = ((float)x)*((float)sw)/((float)rw); fy = ((float)y)*((float)sh)/((float)rh); fxc = modf(fx, &intp); fyc = modf(fy, &intp); fxceil = (int)ceil(fx); fyceil = (int)ceil(fy); if (fxceil>=sw) fxceil = sw-1; if (fyceil>=sh) fyceil = sh-1; tr = src[sw*(int)floor(fy)+fxceil]; tl = src[sw*(int)floor(fy)+(int)floor(fx)]; br = src[sw*fyceil+fxceil]; bl = src[sw*fyceil+(int)floor(fx)]; q[rw*y+x] = PIXRGB( (int)(((((float)PIXR(tl))*(1.0f-fxc))+(((float)PIXR(tr))*(fxc)))*(1.0f-fyc) + ((((float)PIXR(bl))*(1.0f-fxc))+(((float)PIXR(br))*(fxc)))*(fyc)), (int)(((((float)PIXG(tl))*(1.0f-fxc))+(((float)PIXG(tr))*(fxc)))*(1.0f-fyc) + ((((float)PIXG(bl))*(1.0f-fxc))+(((float)PIXG(br))*(fxc)))*(fyc)), (int)(((((float)PIXB(tl))*(1.0f-fxc))+(((float)PIXB(tr))*(fxc)))*(1.0f-fyc) + ((((float)PIXB(bl))*(1.0f-fxc))+(((float)PIXB(br))*(fxc)))*(fyc)) ); } } else { //Stairstepping float fx, fy, fyc, fxc; double intp; pixel tr, tl, br, bl; int rrw = rw, rrh = rh; pixel * oq; oq = new pixel[sw*sh]; std::copy(src, src+(sw*sh), oq); rw = sw; rh = sh; while(rrw != rw && rrh != rh){ if(rw > rrw) rw *= 0.7; if(rh > rrh) rh *= 0.7; if(rw <= rrw) rw = rrw; if(rh <= rrh) rh = rrh; q = new pixel[rw*rh]; //Bilinear interpolation for (y=0; y<rh; y++) for (x=0; x<rw; x++) { fx = ((float)x)*((float)sw)/((float)rw); fy = ((float)y)*((float)sh)/((float)rh); fxc = modf(fx, &intp); fyc = modf(fy, &intp); fxceil = (int)ceil(fx); fyceil = (int)ceil(fy); if (fxceil>=sw) fxceil = sw-1; if (fyceil>=sh) fyceil = sh-1; tr = oq[sw*(int)floor(fy)+fxceil]; tl = oq[sw*(int)floor(fy)+(int)floor(fx)]; br = oq[sw*fyceil+fxceil]; bl = oq[sw*fyceil+(int)floor(fx)]; q[rw*y+x] = PIXRGB( (int)(((((float)PIXR(tl))*(1.0f-fxc))+(((float)PIXR(tr))*(fxc)))*(1.0f-fyc) + ((((float)PIXR(bl))*(1.0f-fxc))+(((float)PIXR(br))*(fxc)))*(fyc)), (int)(((((float)PIXG(tl))*(1.0f-fxc))+(((float)PIXG(tr))*(fxc)))*(1.0f-fyc) + ((((float)PIXG(bl))*(1.0f-fxc))+(((float)PIXG(br))*(fxc)))*(fyc)), (int)(((((float)PIXB(tl))*(1.0f-fxc))+(((float)PIXB(tr))*(fxc)))*(1.0f-fyc) + ((((float)PIXB(bl))*(1.0f-fxc))+(((float)PIXB(br))*(fxc)))*(fyc)) ); } delete[] oq; oq = q; sw = rw; sh = rh; } } return q; #endif }
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(std::vector<Menu*>::iterator iter = menuList.begin(), end = menuList.end(); iter != end; ++iter) { delete *iter; } 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)); } //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 < 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), "DEFAULT_WL_"+format::NumberToString<int>(i), sim->wtypes[i].textureGen); menuList[SC_WALL]->AddTool(tempTool); //sim->wtypes[i] } //Build menu for tools for(int 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(DECO_ADD, "ADD", "Colour blending: Add.", 0, 0, 0, "DEFAULT_DECOR_ADD")); menuList[SC_DECO]->AddTool(new DecorationTool(DECO_SUBTRACT, "SUB", "Colour blending: Subtract.", 0, 0, 0, "DEFAULT_DECOR_SUB")); menuList[SC_DECO]->AddTool(new DecorationTool(DECO_MULTIPLY, "MUL", "Colour blending: Multiply.", 0, 0, 0, "DEFAULT_DECOR_MUL")); menuList[SC_DECO]->AddTool(new DecorationTool(DECO_DIVIDE, "DIV", "Colour blending: Divide." , 0, 0, 0, "DEFAULT_DECOR_DIV")); menuList[SC_DECO]->AddTool(new DecorationTool(DECO_SMUDGE, "SMDG", "Smudge tool, blends surrounding deco together.", 0, 0, 0, "DEFAULT_DECOR_SMDG")); menuList[SC_DECO]->AddTool(new DecorationTool(DECO_CLEAR, "CLR", "Erase any set decoration.", 0, 0, 0, "DEFAULT_DECOR_CLR")); menuList[SC_DECO]->AddTool(new DecorationTool(DECO_DRAW, "SET", "Draw decoration (No blending).", 0, 0, 0, "DEFAULT_DECOR_SET")); 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(); }
void ElementPopulationDebug::Draw() { Graphics * g = ui::Engine::Ref().g; int yBottom = YRES-10; int xStart = 10; String maxValString; String halfValString; float maxVal = 255; float scale = 1.0f; int bars = 0; for(int i = 0; i < PT_NUM; i++) { if(sim->elements[i].Enabled) { if(maxVal < sim->elementCount[i]) maxVal = sim->elementCount[i]; bars++; } } maxAverage = (maxAverage*(1.0f-0.015f)) + (0.015f*maxVal); scale = 255.0f/maxAverage; maxValString = String::Build(maxAverage); halfValString = String::Build(maxAverage/2); g->fillrect(xStart-5, yBottom - 263, bars+10+Graphics::textwidth(maxValString)+10, 255 + 13, 0, 0, 0, 180); bars = 0; for(int i = 0; i < PT_NUM; i++) { if(sim->elements[i].Enabled) { float count = sim->elementCount[i]; int barSize = (count * scale - 0.5f); int barX = bars;//*2; g->draw_line(xStart+barX, yBottom+3, xStart+barX, yBottom+2, PIXR(sim->elements[i].Colour), PIXG(sim->elements[i].Colour), PIXB(sim->elements[i].Colour), 255); if(sim->elementCount[i]) { if(barSize > 256) { barSize = 256; g->blendpixel(xStart+barX, yBottom-barSize-3, PIXR(sim->elements[i].Colour), PIXG(sim->elements[i].Colour), PIXB(sim->elements[i].Colour), 255); g->blendpixel(xStart+barX, yBottom-barSize-5, PIXR(sim->elements[i].Colour), PIXG(sim->elements[i].Colour), PIXB(sim->elements[i].Colour), 255); g->blendpixel(xStart+barX, yBottom-barSize-7, PIXR(sim->elements[i].Colour), PIXG(sim->elements[i].Colour), PIXB(sim->elements[i].Colour), 255); } else { g->draw_line(xStart+barX, yBottom-barSize-3, xStart+barX, yBottom-barSize-2, 255, 255, 255, 180); } g->draw_line(xStart+barX, yBottom-barSize, xStart+barX, yBottom, PIXR(sim->elements[i].Colour), PIXG(sim->elements[i].Colour), PIXB(sim->elements[i].Colour), 255); } bars++; } } g->drawtext(xStart + bars + 5, yBottom-5, "0", 255, 255, 255, 255); g->drawtext(xStart + bars + 5, yBottom-132, halfValString, 255, 255, 255, 255); g->drawtext(xStart + bars + 5, yBottom-260, maxValString, 255, 255, 255, 255); }
void GameModel::BuildMenus() { char lastMenu = 0; if(activeMenu) lastMenu = activeMenu->GetIcon(); std::string activeToolIdentifiers[3]; if(regularToolset[0]) activeToolIdentifiers[0] = regularToolset[0]->GetIdentifier(); if(regularToolset[1]) activeToolIdentifiers[1] = regularToolset[1]->GetIdentifier(); if(regularToolset[2]) activeToolIdentifiers[2] = regularToolset[2]->GetIdentifier(); //Empty current menus for(std::vector<Menu*>::iterator iter = menuList.begin(), end = menuList.end(); iter != end; ++iter) { delete *iter; } 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)); } //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 < 12 && 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 GolTool(i, 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), "DEFAULT_WL_"+format::NumberToString<int>(i), sim->wtypes[i].textureGen); menuList[SC_WALL]->AddTool(tempTool); //sim->wtypes[i] } //Add special sign and prop tools menuList[SC_TOOL]->AddTool(new SampleTool(this)); menuList[SC_TOOL]->AddTool(new SignTool()); menuList[SC_TOOL]->AddTool(new PropertyTool()); menuList[SC_TOOL]->AddTool(new WindTool(0, "WIND", "Create air movement", 64, 64, 64, "DEFAULT_UI_WIND")); //Build menu for simtools for(int 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 decoration tools to menu menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::BlendAdd, "ADD", "Colour blending: Add", 0, 0, 0, "DEFAULT_DECOR_ADD")); menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::BlendRemove, "SUB", "Colour blending: Subtract", 0, 0, 0, "DEFAULT_DECOR_SUB")); menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::BlendMultiply, "MUL", "Colour blending: Multiply", 0, 0, 0, "DEFAULT_DECOR_MUL")); menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::BlendDivide, "DIV", "Colour blending: Divide" , 0, 0, 0, "DEFAULT_DECOR_DIV")); menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::BlendSmudge, "SMDG", "Smudge colour", 0, 0, 0, "DEFAULT_DECOR_SMDG")); menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::BlendSet, "SET", "Set colour (No blending)", 0, 0, 0, "DEFAULT_DECOR_SET")); menuList[SC_DECO]->AddTool(new DecorationTool(DecorationTool::Remove, "CLR", "Clear any set decoration", 0, 0, 0, "DEFAULT_DECOR_CLR")); decoToolset[0] = GetToolFromIdentifier("DEFAULT_DECOR_SET"); decoToolset[1] = GetToolFromIdentifier("DEFAULT_DECOR_CLR"); decoToolset[2] = GetToolFromIdentifier("DEFAULT_UI_SAMPLE"); //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 tools regularToolset[0] = GetToolFromIdentifier("DEFAULT_PT_DUST"); regularToolset[1] = GetToolFromIdentifier("DEFAULT_PT_NONE"); regularToolset[2] = GetToolFromIdentifier("DEFAULT_UI_SAMPLE"); 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]); lastTool = activeTools[0]; //Set default menu activeMenu = menuList[SC_POWDERS]; if(lastMenu) { for(std::vector<Menu*>::iterator iter = menuList.begin(), end = menuList.end(); iter != end; ++iter) { if((*iter)->GetIcon() == lastMenu) activeMenu = *iter; } } if(activeMenu) toolList = activeMenu->GetToolList(); else toolList = std::vector<Tool*>(); notifyMenuListChanged(); notifyToolListChanged(); notifyActiveToolsChanged(); notifyLastToolChanged(); }