JackEditor/map.cpp

185 lines
5.4 KiB
C++

#include "gui/gui.hpp"
#include "gui/imgui/imgui.h"
#include "gui/imgui/imgui_stdlib.h"
#include "ig001.hpp"
#include "map_types.hpp"
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <list>
#include <sstream>
static std::list<EntityBase *> entities;
static EntityBase *selected_entity = NULL;
static EntityBase *to_delete = NULL;
static Vec2 offset0(0, 0);
static double cutoff = 1500;
static float bgcolor[3] = {0.0f, 0.0f, 0.0f};
void ui_map() {
Vec2 newdelta(ig::GetMouseDragDelta(ImGuiMouseButton_Right));
Vec2 offset = offset0 + newdelta;
if (!ig::IsMouseDragging(ImGuiMouseButton_Right))
offset0 = offset0 + newdelta;
if (ig::Begin("Entities")) {
if (ig::BeginMenu("Load Entities from Text")) {
static std::string buf_code;
ig::InputTextMultiline("##Code", &buf_code, ImVec2(400, 300));
if (ig::Button("Load!")) {
for (EntityBase *e: entities)
delete e;
entities.clear();
selected_entity = NULL;
std::istringstream is(buf_code);
std::string line;
while (std::getline(is, line)) {
if (line.size() == 0)
continue;
char *cmd = std::strtok(line.data(), " ");
#define CMD1(str) if (std::strcmp(cmd, str) == 0)
#define CMD(str) else if (std::strcmp(cmd, str) == 0)
if (!cmd)
continue;
EntityBase *e = NULL;
CMD1("HITBOX")
e = new Hitbox();
CMD("PLAYER")
e = new Player();
CMD("HAZARD_RESPAWN")
e = new HazardRespawn();
CMD("HAZARD")
e = new Hazard();
CMD("TEXTBOX")
e = new Textbox();
CMD("LEVEL_TRANSITION")
e = new LevelTransition();
CMD("CAMERA_FOCUS")
e = new CameraFocus();
CMD("FILL")
e = new FillBox;
CMD("CUTOFF")
cutoff = strtod(strtok(NULL, " "), NULL);
CMD("BACKGROUND") {
bgcolor[0] = strtof(TOKEN, NULL) / 255.0f;
bgcolor[1] = strtof(TOKEN, NULL) / 255.0f;
bgcolor[2] = strtof(TOKEN, NULL) / 255.0f;
}
if (e != NULL) {
e->from_strtok();
entities.push_back(e);
}
}
buf_code.clear();
}
ig::EndMenu();
}
Vec2 center = Vec2(ig::GetIO().DisplaySize) * 0.5 - offset;
ig::SeparatorText("Add Entity");
if (ig::Button("Hitbox")) {
entities.push_back((new Hitbox())->setpos(center));
selected_entity = entities.back();
}
ig::SameLine();
if (ig::Button("Player")) {
entities.push_back((new Player())->setpos(center));
selected_entity = entities.back();
}
ig::SameLine();
if (ig::Button("Hazard Respawn")) {
entities.push_back((new HazardRespawn())->setpos(center));
selected_entity = entities.back();
}
if (ig::Button("Hazard")) {
entities.push_back((new Hazard())->setpos(center));
selected_entity = entities.back();
}
ig::SameLine();
if (ig::Button("Textbox")) {
entities.push_back((new Textbox())->setpos(center));
selected_entity = entities.back();
}
ig::SameLine();
if (ig::Button("Level Transition")) {
entities.push_back((new LevelTransition())->setpos(center));
selected_entity = entities.back();
}
if (ig::Button("Camera Focus")) {
entities.push_back((new CameraFocus())->setpos(center));
selected_entity = entities.back();
}
ig::SameLine();
if (ig::Button("Fill Box")) {
entities.push_back((new FillBox())->setpos(center));
selected_entity = entities.back();
}
DragDouble("Cutoff depth", &cutoff);
ImGui::ColorEdit3("Background", bgcolor, ImGuiColorEditFlags_PickerHueWheel);
ig::SeparatorText("Entities");
if (ig::Selectable("<<< CLEAR >>>", selected_entity == NULL))
selected_entity = NULL;
ig::Separator();
for (EntityBase *e: entities) {
ig::PushID(e);
if (ig::Selectable(e->type().c_str(), selected_entity == e))
selected_entity = e;
if (ig::IsItemHovered())
if (ig::IsMouseDoubleClicked(ImGuiMouseButton_Right))
to_delete = e;
ig::PopID();
}
}
ig::End();
ImVec2 screen_size = ig::GetIO().DisplaySize;
ImDrawList *drawlist = ig::GetBackgroundDrawList();
drawlist->AddRectFilled(ImVec2(0, 0), screen_size, ImGui::ColorConvertFloat4ToU32(ImVec4(bgcolor[0], bgcolor[1], bgcolor[2], 1.0f)));
if (ig::Begin("Properities") && selected_entity != NULL) {
ig::PushID(selected_entity);
selected_entity->imgui();
ig::PopID();
}
ig::End();
drawlist->AddLine(ImVec2(0, offset.y), ImVec2(screen_size.x, offset.y), IM_COL32_WHITE);
drawlist->AddLine(ImVec2(offset.x, 0), ImVec2(offset.x, screen_size.y), IM_COL32_WHITE);
drawlist->AddLine(ImVec2(0, cutoff + offset.y), ImVec2(screen_size.x, cutoff + offset.y), IM_COL32(255, 0, 0, 255));
// Draw every entity
for (EntityBase *e: entities)
e->draw_prev(offset, e == selected_entity);
for (EntityBase *e: entities)
e->draw(offset, e == selected_entity);
static std::string buff;
buff.clear();
buff = "CUTOFF " + std::to_string((int)std::round(cutoff)) + "\n";
buff += "BACKGROUND " + std::to_string((int)std::round(bgcolor[0] * 255.0f)) + " " + std::to_string((int)std::round(bgcolor[1] * 255.0f)) + " " + std::to_string((int)std::round(bgcolor[2] * 255.0f)) + "\n";
for (EntityBase *e: entities) {
buff += e->to_file();
}
if (ig::Begin("Output")) {
if (ig::Button("Copy!"))
ig::SetClipboardText(buff.c_str());
ig::InputTextMultiline("##Text", &buff, ImVec2(-1, -1), ImGuiInputTextFlags_ReadOnly);
}
ig::End();
if (to_delete != NULL) {
entities.remove(to_delete);
to_delete = NULL;
}
}