/**--------------------------------------------------------------------------<BR> C2DPolyArc::MakeClockwise <BR> \brief . <P>---------------------------------------------------------------------------*/ void C2DPolyBase::MakeClockwise(void) { if (!IsClockwise()) ReverseDirection(); }
void CSketch::CalculateSketchOrder() { if(m_objects.size() == 0) { m_order = SketchOrderTypeEmpty; return; } HeeksObj* prev_object = NULL; HeeksObj* first_object = NULL; bool well_ordered = true; std::list<HeeksObj*>::iterator It; for(It=m_objects.begin(); It!=m_objects.end() ;It++) { HeeksObj* object = *It; if(object->GetType() == CircleType) { m_order = SketchOrderHasCircles; return; } if(prev_object) { double prev_e[3], s[3]; if(!prev_object->GetEndPoint(prev_e)){well_ordered = false; break;} if(!object->GetStartPoint(s)){well_ordered = false; break;} if(!(make_point(prev_e).IsEqual(make_point(s), wxGetApp().m_geom_tol))){well_ordered = false; break;} } if(first_object == NULL)first_object = object; prev_object = object; } if(well_ordered) { if(prev_object && first_object) { double e[3], s[3]; if(prev_object->GetEndPoint(e)) { if(first_object->GetStartPoint(s)) { if(make_point(e).IsEqual(make_point(s), wxGetApp().m_geom_tol)) { // closed if(IsClockwise())m_order = SketchOrderTypeCloseCW; else m_order = SketchOrderTypeCloseCCW; return; } } } } m_order = SketchOrderTypeOpen; return; } m_order = SketchOrderTypeBad; // although it might still be multiple, but will have to wait until ReOrderSketch is done. }
bool ribi::Geometry::IsCounterClockwise(const double a, const double b) const noexcept { return !IsClockwise(a,b); }
FBXLoader::FBXLoader(const char *filename) { m_error = true; if (m_fbx_sdk_manager == nullptr) { m_fbx_sdk_manager = FbxManager::Create(); m_fbx_sdk_manager->SetIOSettings(FbxIOSettings::Create(m_fbx_sdk_manager, IOSROOT)); } FbxImporter *importer = FbxImporter::Create(m_fbx_sdk_manager, ""); FbxScene *scene = FbxScene::Create(m_fbx_sdk_manager, ""); if (!importer->Initialize(filename, -1, m_fbx_sdk_manager->GetIOSettings())) return; if (!importer->Import(scene)) return; importer->Destroy(); FbxNode *root_node = scene->GetRootNode(); if (root_node) { for (int i = 0; i < root_node->GetChildCount(); i++) { FbxNode *child_node = root_node->GetChild(i); if (child_node->GetNodeAttribute() == NULL) continue; FbxNodeAttribute::EType type = child_node->GetNodeAttribute()->GetAttributeType(); if (type != FbxNodeAttribute::eMesh) continue; FbxMesh *mesh = (FbxMesh *) child_node->GetNodeAttribute(); FbxVector4 *vertices = mesh->GetControlPoints(); for (int j = 0; j < mesh->GetPolygonCount(); j++) { int num_verts = mesh->GetPolygonSize(j); assert(num_verts == 3); DirectX::XMFLOAT3 vertex[3]; FbxVector4 polygon_normal(0, 0, 0); for (int k = 0; k < num_verts; k++) { int control_point_idx = mesh->GetPolygonVertex(j, k); FbxVector4 vertex_normal; mesh->GetPolygonVertexNormal(j, k, vertex_normal); polygon_normal += vertex_normal; vertex[k].x = (float) vertices[control_point_idx].mData[0]; vertex[k].y = (float) vertices[control_point_idx].mData[1]; vertex[k].z = (float) vertices[control_point_idx].mData[2]; } if (IsClockwise(vertex, num_verts, polygon_normal)) { for (int i = 0; i < num_verts; i++) m_vertices.push_back(ToD3DCoordinateSystem(vertex[i])); } else { for (int i = 0; i < num_verts; i++) m_vertices.push_back(ToD3DCoordinateSystem(vertex[num_verts - 1 - i])); } } } } for (size_t i = 0; i < m_vertices.size(); i++) m_indices.push_back(i); m_error = false; }