diff --git a/TiledCollisionEditor/TiledCollisionEditor.vcxproj b/TiledCollisionEditor/TiledCollisionEditor.vcxproj index 0e6c677..5112476 100644 --- a/TiledCollisionEditor/TiledCollisionEditor.vcxproj +++ b/TiledCollisionEditor/TiledCollisionEditor.vcxproj @@ -119,6 +119,7 @@ true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + stdcpp20 Console diff --git a/TiledCollisionEditor/main.cpp b/TiledCollisionEditor/main.cpp index a818b69..02e3d12 100644 --- a/TiledCollisionEditor/main.cpp +++ b/TiledCollisionEditor/main.cpp @@ -40,8 +40,8 @@ public: Manager gui; - ImageCheckBox*createNewButton; - ImageCheckBox*editButton; + ImageCheckBox*createNewButton=nullptr; + ImageCheckBox*editButton=nullptr; public: bool OnUserCreate() override @@ -73,13 +73,6 @@ public: return true; } - float hundredsDigit=0.f; - float tensDigit=0.f; - float onesDigit=0.f; - - float currentHealth=0; - float targetHealth=60; - void Update(){ const Tileset&tileset=tilesets[activeTileset]; @@ -145,7 +138,7 @@ public: geom2d::triangle{quad[0],quad[2],quad[3]}, }; for(geom2d::triangle&tri:collisionTris){ - if(geom2d::contains(tri,view.ScreenToWorld(GetMousePos()))){ + if(geom2d::overlaps(tri,geom2d::circle(view.ScreenToWorld(GetMousePos()),3.f))){ dragTranslate=true; editingQuad=const_cast(&quad); upperLeftDragOffset=GetSnapPoint()-quad[0]; @@ -188,7 +181,7 @@ public: geom2d::triangle{quad[0],quad[2],quad[3]}, }; for(geom2d::triangle&tri:collisionTris){ - if(geom2d::contains(tri,view.ScreenToWorld(GetMousePos()))){ + if(geom2d::overlaps(tri,geom2d::circle(view.ScreenToWorld(GetMousePos()),3.f))){ //Delete this quad, the mouse is overlapping it! quadsToBeRemoved.push_back(const_cast(&quad)); break; @@ -215,25 +208,50 @@ public: editingPoint=4; } dragTranslate=false; + editingQuad=nullptr; } } } void NewObjectUpdate(){ + const Tileset&tileset=tilesets[activeTileset]; if(GetMouse(Mouse::LEFT).bPressed){ - const Tileset&tileset=tilesets[activeTileset]; - vf2d worldCoords=view.ScreenToWorld(GetMousePos()); - upperLeftObjTile=vf2d{round(worldCoords.x/tileset.tilewidth)*tileset.tilewidth,round(worldCoords.y/tileset.tileheight)*tileset.tileheight}; + upperLeftObjTile=vi2d{int(round(worldCoords.x/tileset.tilewidth)*tileset.tilewidth),int(round(worldCoords.y/tileset.tileheight)*tileset.tileheight)}; dragNewObj=true; } if(GetMouse(Mouse::LEFT).bReleased){ dragNewObj=false; + + vf2d worldCoords=view.ScreenToWorld(GetMousePos()); + vi2d lowerRightObjTile=vi2d{int(round(worldCoords.x/tileset.tilewidth)*tileset.tilewidth),int(round(worldCoords.y/tileset.tileheight)*tileset.tileheight)}; + + geom2d::rectnewObjRect{upperLeftObjTile,lowerRightObjTile-upperLeftObjTile}; const Tileset&tileset=tilesets[activeTileset]; //Check for intersection with other objects, if found then we deny creating this object this way. + bool intersectionFound=false; for(auto&[name,obj]:tileset.objects){ - + geom2d::rectoffsetBounds{obj.bounds.pos+vf2d{0.5f,0.5f},obj.bounds.size-vf2d{1.f,1.f}}; + if(geom2d::overlaps(offsetBounds,newObjRect)){ + intersectionFound=true; + break; + } + } + + if(!intersectionFound){ + std::string objName=std::format("Object{}",tilesets[activeTileset].objects.size()); + + TilesetObject&newObj=tilesets[activeTileset].objects[objName]; + newObj.name=objName; + for(int y=0;ybPressed)editButton->bChecked=false; @@ -291,7 +315,7 @@ public: geom2d::triangle{quad[0],quad[2],quad[3]}, }; for(geom2d::triangle&tri:collisionTris){ - if(geom2d::contains(tri,view.ScreenToWorld(GetMousePos()))){ + if(geom2d::overlaps(tri,geom2d::circle(view.ScreenToWorld(GetMousePos()),3.f))){ highlightedQuad=const_cast(&quad); goto renderQuads; } @@ -308,17 +332,36 @@ public: view.DrawPolygonDecal(nullptr,points,uvs,cols); for(bool highlighted=false;const vf2d&point:quad){ - if(geom2d::line(point,view.ScreenToWorld(GetMousePos())).length()<4&&!highlighted){ - view.DrawRotatedDecal(point,circle.Decal(),0.f,circle.Sprite()->Size()/2,{1.f,1.f},YELLOW); - highlighted=true; + if(highlightedQuad==&quad){ + if(geom2d::line(point,view.ScreenToWorld(GetMousePos())).length()<4&&!highlighted){ + view.DrawRotatedDecal(point,circle.Decal(),0.f,circle.Sprite()->Size()/2,{1.f,1.f},YELLOW); + highlighted=true; + }else{ + view.DrawRotatedDecal(point,circle.Decal(),0.f,circle.Sprite()->Size()/2,{1.f,1.f},RED); + } }else{ - view.DrawRotatedDecal(point,circle.Decal(),0.f,circle.Sprite()->Size()/2,{1.f,1.f},RED); + view.DrawRotatedDecal(point,circle.Decal(),0.f,circle.Sprite()->Size()/2,{0.25f,0.25f},DARK_GREY); } } } }else if(dragNewObj){ - + vf2d worldCoords=view.ScreenToWorld(GetMousePos()); + vi2d lowerRightObjTile=vi2d{int(round(worldCoords.x/tileset.tilewidth)*tileset.tilewidth),int(round(worldCoords.y/tileset.tileheight)*tileset.tileheight)}; + + Pixel overlayCol={0,0,255,160}; + + geom2d::rectnewObjRect{upperLeftObjTile,lowerRightObjTile-upperLeftObjTile}; + + for(auto&[name,obj]:tileset.objects){ + geom2d::rectoffsetBounds{obj.bounds.pos+vf2d{0.5f,0.5f},obj.bounds.size-vf2d{1.f,1.f}}; + if(geom2d::overlaps(offsetBounds,newObjRect)){ + overlayCol={255,0,0,160}; + break; + } + } + + view.FillRectDecal(upperLeftObjTile,lowerRightObjTile-upperLeftObjTile,overlayCol); } for(auto&[objName,obj]:tileset.objects){