Commit bac3824a authored by TheNumbat's avatar TheNumbat
Browse files

upstream changes

parent 090fe3ef
...@@ -187,7 +187,7 @@ Data cone(float bradius, float tradius, float height, int sides, bool caps) { ...@@ -187,7 +187,7 @@ Data cone(float bradius, float tradius, float height, int sides, bool caps) {
vertices[vert] = Vec3(std::cos(rad) * tradius, height, std::sin(rad) * tradius); vertices[vert] = Vec3(std::cos(rad) * tradius, height, std::sin(rad) * tradius);
vert++; vert++;
} }
int v = 0; size_t v = 0;
while (vert <= vertices.size() - 4) { while (vert <= vertices.size() - 4) {
float rad = (float)v / n_sides * _2pi; float rad = (float)v / n_sides * _2pi;
vertices[vert] = Vec3(std::cos(rad) * tradius, height, std::sin(rad) * tradius); vertices[vert] = Vec3(std::cos(rad) * tradius, height, std::sin(rad) * tradius);
......
...@@ -707,7 +707,7 @@ void Manager::UInew_obj(Undo &undo) { ...@@ -707,7 +707,7 @@ void Manager::UInew_obj(Undo &undo) {
ImGui::Begin("New Object", &new_obj_window, ImGui::Begin("New Object", &new_obj_window,
ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar |
ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_AlwaysAutoResize); ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_AlwaysAutoResize);
if (ImGui::CollapsingHeader("Cube")) { if (ImGui::CollapsingHeader("Cube")) {
ImGui::PushID(idx++); ImGui::PushID(idx++);
...@@ -731,6 +731,7 @@ void Manager::UInew_obj(Undo &undo) { ...@@ -731,6 +731,7 @@ void Manager::UInew_obj(Undo &undo) {
ImGui::PopID(); ImGui::PopID();
} }
#if 0 // These have some problems converting to halfedge
ImGui::Separator(); ImGui::Separator();
if (ImGui::CollapsingHeader("Cylinder")) { if (ImGui::CollapsingHeader("Cylinder")) {
...@@ -748,7 +749,6 @@ void Manager::UInew_obj(Undo &undo) { ...@@ -748,7 +749,6 @@ void Manager::UInew_obj(Undo &undo) {
ImGui::Separator(); ImGui::Separator();
#if 0 // The procedural torus has some problems converting to halfedge
if(ImGui::CollapsingHeader("Torus")) { if(ImGui::CollapsingHeader("Torus")) {
ImGui::PushID(idx++); ImGui::PushID(idx++);
static float IR = 0.8f, OR = 1.0f; static float IR = 0.8f, OR = 1.0f;
...@@ -764,8 +764,24 @@ void Manager::UInew_obj(Undo &undo) { ...@@ -764,8 +764,24 @@ void Manager::UInew_obj(Undo &undo) {
} }
ImGui::Separator(); ImGui::Separator();
if (ImGui::CollapsingHeader("Cone")) {
ImGui::PushID(idx++);
static float BR = 1.0f, TR = 0.1f, H = 1.0f;
static int S = 12;
ImGui::SliderFloat("Bottom Radius", &BR, 0.01f, 10.0f, "%.2f");
ImGui::SliderFloat("Top Radius", &TR, 0.01f, 10.0f, "%.2f");
ImGui::SliderFloat("Height", &H, 0.01f, 10.0f, "%.2f");
ImGui::SliderInt("Sides", &S, 3, 100);
if (ImGui::Button("Add")) {
add_mesh("Cone", Util::cone_mesh(BR, TR, H, S));
}
ImGui::PopID();
}
#endif #endif
ImGui::Separator();
if (ImGui::CollapsingHeader("Sphere")) { if (ImGui::CollapsingHeader("Sphere")) {
ImGui::PushID(idx++); ImGui::PushID(idx++);
static float R = 1.0f; static float R = 1.0f;
...@@ -779,22 +795,6 @@ void Manager::UInew_obj(Undo &undo) { ...@@ -779,22 +795,6 @@ void Manager::UInew_obj(Undo &undo) {
} }
ImGui::PopID(); ImGui::PopID();
} }
ImGui::Separator();
if (ImGui::CollapsingHeader("Cone")) {
ImGui::PushID(idx++);
static float BR = 1.0f, TR = 0.1f, H = 1.0f;
static int S = 12;
ImGui::SliderFloat("Bottom Radius", &BR, 0.01f, 10.0f, "%.2f");
ImGui::SliderFloat("Top Radius", &TR, 0.01f, 10.0f, "%.2f");
ImGui::SliderFloat("Height", &H, 0.01f, 10.0f, "%.2f");
ImGui::SliderInt("Sides", &S, 3, 100);
if (ImGui::Button("Add")) {
add_mesh("Cone", Util::cone_mesh(BR, TR, H, S));
}
ImGui::PopID();
}
ImGui::End(); ImGui::End();
} }
......
...@@ -217,19 +217,6 @@ std::optional<Halfedge_Mesh::ElementRef> Model::selected_element() { ...@@ -217,19 +217,6 @@ std::optional<Halfedge_Mesh::ElementRef> Model::selected_element() {
void Model::unset_mesh() { my_mesh = nullptr; } void Model::unset_mesh() { my_mesh = nullptr; }
void Model::set_mesh(Halfedge_Mesh &mesh) {
Halfedge_Mesh *old = my_mesh;
my_mesh = &mesh;
if (old != my_mesh) {
selected_elem_id = 0;
hovered_elem_id = 0;
rebuild();
} else if (old->render_dirty_flag) {
rebuild();
}
}
void Model::vertex_viz(Halfedge_Mesh::VertexRef v, float &size, Mat4 &transform) { void Model::vertex_viz(Halfedge_Mesh::VertexRef v, float &size, Mat4 &transform) {
// Sphere size ~ 0.05 * min incident edge length // Sphere size ~ 0.05 * min incident edge length
...@@ -572,23 +559,40 @@ void Model::zoom_to(Halfedge_Mesh::ElementRef ref, Camera &cam) { ...@@ -572,23 +559,40 @@ void Model::zoom_to(Halfedge_Mesh::ElementRef ref, Camera &cam) {
cam.look_at(center, pos); cam.look_at(center, pos);
} }
std::optional<std::reference_wrapper<Scene_Object>> Model::is_my_obj(Scene_Maybe obj_opt) { std::optional<std::reference_wrapper<Scene_Object>> Model::set_my_obj(Scene_Maybe obj_opt) {
if (!obj_opt.has_value()) if (!obj_opt.has_value()) {
my_mesh = nullptr;
return std::nullopt; return std::nullopt;
}
Scene_Item &item = obj_opt.value(); Scene_Item &item = obj_opt.value();
if (!item.is<Scene_Object>()) if (!item.is<Scene_Object>()) {
my_mesh = nullptr;
return std::nullopt; return std::nullopt;
}
Scene_Object &obj = item.get<Scene_Object>(); Scene_Object &obj = item.get<Scene_Object>();
if (obj.opt.shape_type != PT::Shape_Type::none) if (obj.opt.shape_type != PT::Shape_Type::none) {
my_mesh = nullptr;
return std::nullopt; return std::nullopt;
}
if (!my_mesh || !obj.is_editable()) if (!obj.is_editable()) {
my_mesh = nullptr;
return std::nullopt; return std::nullopt;
}
Halfedge_Mesh *old = my_mesh;
my_mesh = &obj.get_mesh();
assert(my_mesh == &obj.get_mesh()); if (old != my_mesh) {
selected_elem_id = 0;
hovered_elem_id = 0;
rebuild();
} else if (old->render_dirty_flag) {
rebuild();
}
return obj; return obj;
} }
...@@ -602,7 +606,7 @@ std::string Model::UIsidebar(Undo &undo, Widgets &widgets, Scene_Maybe obj_opt, ...@@ -602,7 +606,7 @@ std::string Model::UIsidebar(Undo &undo, Widgets &widgets, Scene_Maybe obj_opt,
} }
ImGui::Separator(); ImGui::Separator();
auto opt = is_my_obj(obj_opt); auto opt = set_my_obj(obj_opt);
if(!opt.has_value()) return {}; if(!opt.has_value()) return {};
Scene_Object& obj = opt.value(); Scene_Object& obj = opt.value();
...@@ -765,7 +769,7 @@ std::string Model::UIsidebar(Undo &undo, Widgets &widgets, Scene_Maybe obj_opt, ...@@ -765,7 +769,7 @@ std::string Model::UIsidebar(Undo &undo, Widgets &widgets, Scene_Maybe obj_opt,
void Model::erase_selected(Undo& undo, Scene_Maybe obj_opt) { void Model::erase_selected(Undo& undo, Scene_Maybe obj_opt) {
auto opt = is_my_obj(obj_opt); auto opt = set_my_obj(obj_opt);
if(!opt.has_value()) return; if(!opt.has_value()) return;
Scene_Object& obj = opt.value(); Scene_Object& obj = opt.value();
...@@ -801,21 +805,11 @@ void Model::clear_select() { selected_elem_id = 0; } ...@@ -801,21 +805,11 @@ void Model::clear_select() { selected_elem_id = 0; }
void Model::render(Scene_Maybe obj_opt, Widgets &widgets, Camera &cam) { void Model::render(Scene_Maybe obj_opt, Widgets &widgets, Camera &cam) {
if (!obj_opt.has_value()) auto obj = set_my_obj(obj_opt);
return; if (!obj.has_value()) return;
Scene_Item &item = obj_opt.value();
if (!item.is<Scene_Object>())
return;
Scene_Object &obj = item.get<Scene_Object>();
if (obj.opt.shape_type != PT::Shape_Type::none)
return;
Mat4 view = cam.get_view(); Mat4 view = cam.get_view();
set_mesh(obj.get_mesh());
Renderer::HalfedgeOpt opts(*this); Renderer::HalfedgeOpt opts(*this);
opts.modelview = view; opts.modelview = view;
opts.v_color = v_col; opts.v_color = v_col;
......
...@@ -45,11 +45,10 @@ private: ...@@ -45,11 +45,10 @@ private:
std::string update_mesh_global(Undo &undo, Scene_Object &obj, Halfedge_Mesh &&before, T &&op); std::string update_mesh_global(Undo &undo, Scene_Object &obj, Halfedge_Mesh &&before, T &&op);
void zoom_to(Halfedge_Mesh::ElementRef ref, Camera &cam); void zoom_to(Halfedge_Mesh::ElementRef ref, Camera &cam);
void set_mesh(Halfedge_Mesh &mesh);
void begin_transform(); void begin_transform();
bool begin_bevel(std::string &err); bool begin_bevel(std::string &err);
void set_selected(Halfedge_Mesh::ElementRef elem); void set_selected(Halfedge_Mesh::ElementRef elem);
std::optional<std::reference_wrapper<Scene_Object>> is_my_obj(Scene_Maybe obj_opt); std::optional<std::reference_wrapper<Scene_Object>> set_my_obj(Scene_Maybe obj_opt);
std::optional<Halfedge_Mesh::ElementRef> selected_element(); std::optional<Halfedge_Mesh::ElementRef> selected_element();
void rebuild(); void rebuild();
......
...@@ -495,11 +495,10 @@ std::string Scene::load(bool new_scene, Undo &undo, Gui::Manager &gui, std::stri ...@@ -495,11 +495,10 @@ std::string Scene::load(bool new_scene, Undo &undo, Gui::Manager &gui, std::stri
Assimp::Importer importer; Assimp::Importer importer;
const aiScene *scene = importer.ReadFile( const aiScene *scene = importer.ReadFile(
file.c_str(), aiProcess_PopulateArmatureData | aiProcess_FixInfacingNormals | file.c_str(), aiProcess_PopulateArmatureData | aiProcess_OptimizeMeshes |
aiProcess_ValidateDataStructure | aiProcess_OptimizeMeshes | aiProcess_ValidateDataStructure | aiProcess_FindInvalidData |
aiProcess_FindInstances | aiProcess_FindDegenerates | aiProcess_FindInstances | aiProcess_FindDegenerates |
aiProcess_DropNormals | aiProcess_JoinIdenticalVertices | aiProcess_DropNormals | aiProcess_JoinIdenticalVertices);
aiProcess_FindInvalidData);
if (!scene) { if (!scene) {
return "Parsing scene " + file + ": " + std::string(importer.GetErrorString()); return "Parsing scene " + file + ": " + std::string(importer.GetErrorString());
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment