Pos2D projectShadow(const Pos3D &p) { #ifdef SHADOW_DOWN return Pos2D(p.x,p.z); #else //return Pos2D((int)(p*Pos3D(0,0,1)),(int)(p*Pos3D(1,1,0))); // return Pos2D((int)(p.z),(int)(VOXELHEIGHT-p.y-p.x-1)); return Pos2D((int)(p*Pos3D(1,0,-1)),(int)(p*Pos3D(1,1,1))); // return Pos2D((int)(p.z-p.x),(int)(VOXELHEIGHT-p.y-p.x-1)); #endif }
VoxelImage::VoxelImage(const std::string &pFilename): AVItem(Pos3D(0,0,0)) { mTexture=getTextureCache()->get(TILEDIR+pFilename+".png"); // FIXME: Check this Pos2D c=getVoxelID()->getCenter(pFilename); if(c==Pos2D(0,0)) { c=Pos2D(mTexture.width()/2,mTexture.height()-mTexture.width()/4); } setCenter(c);//Pos2D(mTexture.width()/2,mTexture.height()-mTexture.width()/4)+c); }
Pos2D VoxelImageData::getCenter(const std::string &pFilename) { std::map<std::string,Pos2D>::const_iterator i=mPositions.find(pFilename); if(i==mPositions.end()) return Pos2D(0,0); return i->second; }
void MiniMap::update() { // CTRACE; mustUpdate=true; AGSurfacePainter p(mSurface); float zoom=2; float mx,my; Pos2D maxPos=mMap->getMaxPos(); for(int x=0;x<mSurface.width();x++) { for(int y=0;y<mSurface.height();y++) { mx=float(x)/mSurface.width()*maxPos.x; my=float(y)/mSurface.height()*maxPos.y; Pos3D normal=mMap->getNormal(mx,my); float l=normal*Pos3D(1,1,-1).normalized(); l+=3; l*=0.25; if(mMap->getHeight(Pos2D(mx,my))<10) p.putPixel(x,mSurface.height()-1-y,AGColor(0,0,(int)(0xFF*l),MINIMAP_ALPHA)); else p.putPixel(x,mSurface.height()-1-y,AGColor(0,(int)(MINIMAP_GREEN*l),0,MINIMAP_ALPHA)); } } }
// returns diff from uppper left corner void VoxelImage::cutBorders() { AGPainter p(mSurface); int minx,miny,maxx,maxy; bool found=false; minx=maxx=miny=maxy=0; cdebug(mSurface.width()<<"///"<<mSurface.height()); for(int x=0; x<mSurface.width(); x++) for(int y=0; y<mSurface.height(); y++) { AGColor c=p.getPixel(x,y); if(c.a>0) { if(found) { minx=std::min(minx,x); miny=std::min(miny,y); maxx=std::max(maxx,x); maxy=std::max(maxy,y); //cdebug("x:"<<x<<" y:"<<y); //cdebug(minx<<"/"<<maxx<<","<<miny<<",m:"<<maxy); } else { minx=maxx=x; miny=maxy=y; found=true; } } } cdebug(minx<<";"<<maxx<<";"<<miny<<";"<<maxy); cdebug(mSurface.width()<<"///"<<mSurface.height()); if(!found) { maxx=maxy=5; minx=miny=0; } int w=maxx-minx+1; int h=maxy-miny+1; w=std::max(10,w); // workaround for bad libpng calls h=std::max(10,h); if(w<=0 || h<=0) std::cerr<<"Error cutting! "<<w<<","<<h<<std::endl; AGSurface ns(w,h); AGPainter p2(ns); p2.blit(mSurface,AGRect(0,0,w,h),AGRect(minx,miny,w,h)); mSurface=ns; mCenter=mCenter-Pos2D(minx,miny); if(w==0 || h==0) mSurface=AGSurface(1,1); // FIXME: this is some workaround }
Pos2D IsoView::getTilePos(const IVTile &t) { int mx=t.x; int my=t.y; return Pos2D(mx*TILE_WIDTH/POINTS_PER_TILE,my*TILE_WIDTH/POINTS_PER_TILE); }
void EditIsoView::init() { mOldPoint=0; mPoints.clear(); if(!mEditing) { CompleteIsoView::init(); return; } //CTRACE; CompleteIsoView::init(); if(!mShowPoints) return; // add pins int mw=width()/64+2; int mh=height()/16+4; mw*=2; mh*=2; int sx=0; int sy=0; sx=(int)(mPos.x/(TILE_WIDTH/2)); if(sx<0) sx=0; sy=(int)(mPos.y/(TILE_WIDTH/4)); if(sy<0) sy=0; for(int y=-1+sy;y<mh+sy;y++) { for(int x=-1+sx;x<mw+sx;x++) { int mx=x; int my=y; mx*=TILE_WIDTH/POINTS_PER_TILE; my*=TILE_WIDTH/POINTS_PER_TILE; //mx-=TILE_WIDTH/2; //my-=TILE_WIDTH/2; Pos3D mp(mx,getMap()->getHeight(Pos2D(mx,my)),my); // start one into zeroness VoxelImage *i=new VoxelImage("white_pin"); i->setPosition(mp); i->setVirtualY(150); insert(i); mPoints.push_back(i); } } }
void VoxelImageData::loadXML(const xmlpp::Node &n) { mPositions.clear(); xmlpp::Node::const_iterator i=n.begin(); for(; i!=n.end(); i++) { mPositions.insert(std::make_pair((*i)->get("name"),Pos2D((*i)->get("pos")))); } }
VoxelImage::VoxelImage(AGSurface pSurface,Pos3D pPos): AVItem(pPos) { mSurface=pSurface; // SDL_SaveBMP(pSurface.surface(),"hupe3.bmp"); // SDL_SaveBMP(mSurface.surface(),"hupe4.bmp"); mTexture=AGTexture(mSurface); // mSurface=SDL_DisplayFormatAlpha(pSurface.surface()); setCenter(Pos2D(mSurface.width()/2,mSurface.height()-mSurface.width()/4)); }
bool EditIsoView::eventMouseClick(const AGEvent *m) { if(!mEditing) return CompleteIsoView::eventMouseClick(m); const AGSDLEvent *e=reinterpret_cast<const AGSDLEvent*>(m); if(e) { if(getScreenRect().contains(e->getMousePosition())) { if(e->getButton()==SDL_BUTTON_LEFT||e->getButton()==SDL_BUTTON_RIGHT) { if(mOldPoint) { Pos3D p=mOldPoint->getPosition(); editMarkClicked(Pos2D(p.x,p.z),e); /* Pos3D p=mOldPoint->getPosition(); if(mAddEntity=="") editAt(p,e->getButton()==SDL_BUTTON_LEFT); else if(mAddEntity=="rubber") { // getEntity and delete std::vector<AntEntity *> es=getEntity(e->getMousePosition()); if(es.size()) { for(std::vector<AntEntity*>::iterator i=es.begin();i!=es.end();i++) getMap()->removeEntity(*i); } } else if(mAddEntity=="tree") getMap()->insertEntity(new AntTree(Pos2D(p.x,p.z),rand()%11)); else if(mAddEntity=="stones") getMap()->insertEntity(new AntDeco(Pos2D(p.x,p.z),rand()%2)); else if(mAddEntity=="tower") getMap()->insertEntity(new AntHouse(Pos2D(p.x,p.z),"tower2")); */ } update(); return true; } } } return false; }
Pos2D Rect2D::get10() const { return Pos2D(x+w-1,y); }
Panel::Panel(Uint id) : currentPriority(backgroundPriority), zIndex(0), description("Empty Panel"), name("Panel 0"), panelDimensions(Pos2D(10, 10)), panelCenter(Pos2D(10, 10)), panelId(id), panelColor(FV3(0, 0, 0)) {}
Pos2D Pos2D::operator*(float f) const { return Pos2D(x*f,y*f); }
Pos2D projectView(const Pos3D &p) { // cdebug(VOXELHEIGHT); return Pos2D((int)(p.x),(int)(VOXELHEIGHT-p.y-p.z/2-1)); }
Pos2D Pos2D::operator/(float f) const { return Pos2D(x/f,y/f); }
Pos2D AntargisMap::truncPos(const Pos2D &p) const { Pos2D maxPos=getMaxPos(); return Pos2D(std::max(0.0f,std::min(maxPos.x,p.x)), std::max(0.0f,std::min(maxPos.y,p.y))); }
Pos2D AntargisMap::getMaxPos() const { return Pos2D(mW*TILE_WIDTH/POINTS_PER_TILE-2,mH*TILE_WIDTH/POINTS_PER_TILE-2); }
Pos2D CTerrainData::getCellPosByVertexIndex(unsigned long uVertexIndex)const { return Pos2D(uVertexIndex%m_nVertexXCount,uVertexIndex/m_nVertexXCount); }
Pos2D Rect2D::get11() const { return Pos2D(x+w-1,y+h-1); }
Pos2D Pos2D::operator-(const Pos2D &p) const { return Pos2D(x-p.x,y-p.y); }
Pos2D Rect2D::get00() const { return Pos2D(x,y); }
void VoxelImage::setTexture(const std::string &pFilename) { mTexture=getTextureCache()->get(pFilename+".png"); // FIXME: Check this setCenter(Pos2D(mTexture.width()/2,mTexture.height()-mTexture.width()/4)); }
Pos2D Rect2D::get01() const { return Pos2D(x,y+h-1); }
Pos2D Pos2D::operator+(const Pos2D &p) const { return Pos2D(x+p.x,y+p.y); }