Add FillPoly entity type
This commit is contained in:
parent
fd89aef210
commit
7157c963a9
7
map.cpp
7
map.cpp
@ -62,6 +62,8 @@ void ui_map() {
|
||||
e = new CameraFocus();
|
||||
CMD("FILL")
|
||||
e = new FillBox;
|
||||
CMD("FILLPOLY")
|
||||
e = new FillPoly;
|
||||
CMD("CUTOFF")
|
||||
cutoff = strtod(strtok(NULL, " "), NULL);
|
||||
CMD("BACKGROUND") {
|
||||
@ -120,6 +122,11 @@ void ui_map() {
|
||||
entities.push_back((new FillBox())->setpos(center));
|
||||
selected_entity = entities.back();
|
||||
}
|
||||
ig::SameLine();
|
||||
if (ig::Button("Fill Poly")) {
|
||||
entities.push_back((new FillPoly())->setpos(center));
|
||||
selected_entity = entities.back();
|
||||
}
|
||||
|
||||
DragDouble("Cutoff depth", &cutoff);
|
||||
ImGui::ColorEdit3("Background", bgcolor, ImGuiColorEditFlags_PickerHueWheel);
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <cstring>
|
||||
#include <iterator>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
||||
class EntityBase {
|
||||
@ -350,3 +351,67 @@ public:
|
||||
Box2 box;
|
||||
float color[3];
|
||||
};
|
||||
|
||||
class FillPoly: public EntityBase {
|
||||
public:
|
||||
std::string type() override { return "fillpoly"; }
|
||||
std::string to_file() override {
|
||||
std::string ans;
|
||||
snprintf(buf, sizeof(buf), "FILLPOLY %.0f %.0f %.0f %d", color[0] * 255, color[1] * 255, color[2] * 255, (int)points.size());
|
||||
ans += buf;
|
||||
|
||||
for (const Vec2 &p: points) {
|
||||
snprintf(buf, sizeof(buf), " %.0lf %.0lf", p.x, p.y);
|
||||
ans += buf;
|
||||
}
|
||||
|
||||
ans += "\n";
|
||||
return ans;
|
||||
}
|
||||
void from_strtok() override {
|
||||
color[0] = TOKEN_DOUBLE / 255.0;
|
||||
color[1] = TOKEN_DOUBLE / 255.0;
|
||||
color[2] = TOKEN_DOUBLE / 255.0;
|
||||
int n = TOKEN_INT;
|
||||
points.resize(n);
|
||||
for (int i = 0; i < n; i++) {
|
||||
double x = TOKEN_DOUBLE;
|
||||
double y = TOKEN_DOUBLE;
|
||||
points[i] = Vec2(x, y);
|
||||
}
|
||||
}
|
||||
|
||||
void imgui() override {
|
||||
ig::ColorEdit3("Fill", color, ImGuiColorEditFlags_PickerHueWheel);
|
||||
ig::SameLine();
|
||||
if (ig::Button("Add Point")) {
|
||||
if (points.empty())
|
||||
points.push_back(pos0);
|
||||
else
|
||||
points.push_back(points.back());
|
||||
}
|
||||
for (int i = 0; i < points.size(); i++) {
|
||||
ig::PushID(i);
|
||||
DragVec2("", &points[i]);
|
||||
ig::PopID();
|
||||
}
|
||||
}
|
||||
void draw_prev(Vec2 offset, bool selected) override {
|
||||
if (points.size() < 3)
|
||||
return;
|
||||
ImDrawList *d = ig::GetBackgroundDrawList();
|
||||
static std::vector<ImVec2> screen;
|
||||
screen.clear();
|
||||
for (const Vec2 &p: points)
|
||||
screen.push_back((p + offset).im());
|
||||
d->AddConvexPolyFilled(screen.data(), screen.size(), ImColor(color[0], color[1], color[2]));
|
||||
}
|
||||
EntityBase *setpos(Vec2 pos) override {
|
||||
pos0 = pos;
|
||||
return this;
|
||||
}
|
||||
|
||||
std::vector<Vec2> points;
|
||||
float color[3];
|
||||
Vec2 pos0;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user