public BodyEngine AttchBodyEngineToObject(GameObject gb, GameObject viewer, GraphicsEngine ge, Projector proj, RenderEngine re, FaceEngine fe,
                                              List <Vector2> axis, bool iscurve)
    {
        BodyEngine be = gb.AddComponent <BodyEngine>() as BodyEngine;

        be.CreateBodyEngine(viewer, ge, proj, re, fe, axis, iscurve);
        return(be);
    }
    public BodyEngine AttchHandleEngineToObject(GameObject gb, GameObject viewer, GraphicsEngine ge, Projector proj, RenderEngine re, FaceEngine fe, BodyEngine be,
                                                Image <Gray, byte> img, List <Vector2> axis, bool iscurve)
    {
        BodyEngine he       = gb.AddComponent <BodyEngine>() as BodyEngine;
        bool       isHandle = true;

        he.CreateHandleEngine(viewer, ge, proj, re, fe, be, axis, img, iscurve, isHandle);
        return(he);
    }
 public void FitHandle(BodyEngine handleEngine)
 {
     handleEngine.SolveBody();
 }
    public void ReconstructAllGeometries()
    {
        UpdateEngine();

        int i_inst = 0;

        // Fix null detection result
        if (geometries.Count == 0 && exper_isCubeExper)
        {
            SaveInstanceSeg();
        }
        foreach (var geo in geometries)
        {
            i_inst++;
            // Creat GameObject
            GameObject inst = new GameObject("Instance" + i_inst);
            inst.transform.parent = this.gameObject.transform;
            this.m_Inst_list.Add(inst);

            // Creat FaceEngine
            FaceEngine faceEngine = AttchFaceEngineToObject(inst, m_projector, m_renderEngine);
            List <Image <Rgb, byte> > face_imgs   = geo.GetFaceImage();
            List <Image <Rgb, byte> > handle_imgs = geo.GetHandleImage();
            this.m_faceEngine_list.Add(faceEngine);

            // Creat MeshViwer
            GameObject meshViewer = GameObject.Instantiate(m_meshViewer);
            meshViewer.name = m_ImgName + '_' + i_inst;
            this.m_meshViewer_list.Add(meshViewer);

            if (geo.label == Label.Cube)
            {
                Image <Rgb, byte> body_img = geo.GetBodyImage(true);

                // skeleton extractor
                SkeletonExtractor se   = new SkeletonExtractor(geo.GetBodyImage(), face_imgs[0], i_inst);
                bool           iscurve = false;
                List <Vector2> axis    = se.ExtractCubeSkeleton(out iscurve);
                faceEngine.axis     = axis;
                faceEngine.body_img = body_img.Convert <Gray, byte>();
                this.FitTopRect(faceEngine, face_imgs[0].Convert <Gray, byte>());
                BodyEngine bodyEngine = AttchBodyEngineToObject(inst, meshViewer, this, m_projector, m_renderEngine, faceEngine, axis, iscurve);
                this.m_bodyEngine_list.Add(bodyEngine);
                //---------------------------------------------------
                //this.FitBody(bodyEngine);
                //---------------------------------------------------

                // Handle
                List <BodyEngine> m_handleEngine_list = new List <BodyEngine>();
                List <GameObject> m_handleViewer_list = new List <GameObject>();
                int handle_i_inst = 0;
                foreach (Image <Rgb, byte> hi in handle_imgs)
                {
                    GameObject handleViewer = GameObject.Instantiate(m_meshViewer);
                    handleViewer.name = m_ImgName + '_' + i_inst + "_handle" + handle_i_inst;
                    m_handleViewer_list.Add(handleViewer);

                    SkeletonExtractor seh = new SkeletonExtractor(handle_i_inst);
                    seh.SkeletonExtractorHandle(geo.GetBodyImage(), hi);
                    bool           ishcurve = false;
                    List <Vector2> axis_h   = seh.ExtractSkeleton(out ishcurve);

                    BodyEngine handleEngine = AttchHandleEngineToObject(inst, handleViewer, this,
                                                                        m_projector, m_renderEngine, faceEngine, bodyEngine,
                                                                        hi.Convert <Gray, byte>(), axis_h, ishcurve);
                    m_handleEngine_list.Add(handleEngine);
                    handle_i_inst++;
                }
                this.m_handleViewer_lists.Add(m_handleViewer_list);
                this.m_handleEngine_lists.Add(m_handleEngine_list);
            }
            else if (geo.label == Label.Cylinder)
            {
                List <List <Vector2> > face_points = geo.Faces();
                double minerror      = double.MaxValue;
                int    best_face_idx = 0;
                for (int i = 0; i < face_points.Count; i++)
                {
                    double error = faceEngine.LikeAEllipse(face_points[i]);
                    if (error < minerror)
                    {
                        minerror      = error;
                        best_face_idx = i;
                    }
                }
                Image <Rgb, byte> body_img = geo.GetBodyImage(true);
                //body_img = MaskParser.FillBodyWithHandle(body_img, handle_imgs);

                // skeleton extractor
                bool iscurve           = false;
                SkeletonExtractor se   = new SkeletonExtractor(geo.GetBodyImage(), face_imgs, best_face_idx, i_inst);
                List <Vector2>    axis = se.ExtractSkeleton(out iscurve);
                faceEngine.axis     = axis;
                faceEngine.body_img = body_img.Convert <Gray, byte>();

                this.FitTopCircle(faceEngine, face_imgs[best_face_idx].Convert <Gray, byte>());
                BodyEngine bodyEngine = AttchBodyEngineToObject(inst, meshViewer, this, m_projector, m_renderEngine, faceEngine, axis, iscurve);

                this.m_bodyEngine_list.Add(bodyEngine);
                //---------------------------------------------------
                //this.FitBody(bodyEngine);
                //---------------------------------------------------

                // Handle
                List <BodyEngine> m_handleEngine_list = new List <BodyEngine>();
                List <GameObject> m_handleViewer_list = new List <GameObject>();
                int handle_i_inst = 0;
                foreach (Image <Rgb, byte> hi in handle_imgs)
                {
                    GameObject handleViewer = GameObject.Instantiate(m_meshViewer);
                    handleViewer.name = m_ImgName + '_' + i_inst + "_handle" + handle_i_inst;
                    m_handleViewer_list.Add(handleViewer);

                    SkeletonExtractor seh = new SkeletonExtractor(handle_i_inst);
                    seh.SkeletonExtractorHandle(geo.GetBodyImage(), hi);
                    bool           ishcurve = false;
                    List <Vector2> axis_h   = seh.ExtractSkeleton(out ishcurve);

                    BodyEngine handleEngine = AttchHandleEngineToObject(inst, handleViewer, this,
                                                                        m_projector, m_renderEngine, faceEngine, bodyEngine,
                                                                        hi.Convert <Gray, byte>(), axis_h, ishcurve);
                    m_handleEngine_list.Add(handleEngine);
                    handle_i_inst++;
                }
                this.m_handleViewer_lists.Add(m_handleViewer_list);
                this.m_handleEngine_lists.Add(m_handleEngine_list);
            }
        }
////        if(m_bodyEngine_list.Count>1)
//        {
//            FaceEngineMulti m_FEM = new FaceEngineMulti(this, m_projector, m_renderEngine, m_faceEngine_list);
//            m_FEM.Optimize_allRects();
//        }

        foreach (var be in m_bodyEngine_list)
        {
            this.FitBody(be);
        }
    }
 public void FitBody(BodyEngine bodyEngine)
 {
     bodyEngine.SolveBody();
 }