Subversion Repositories gelsvn

Rev

Rev 647 | Rev 662 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 647 Rev 657
Line 53... Line 53...
53
        refit();
53
        refit();
54
        return true;
54
        return true;
55
    }
55
    }
56
    
56
    
57
    
57
    
58
    
-
 
59
    void VisObj::display(const std::string& display_method , Console& cs, bool smooth, float gamma)
58
    bool VisObj::select_vertex(const CGLA::Vec2i& pos)
60
    {
59
    {
-
 
60
        float d;
61
        if(create_display_list){
61
        if(depth_pick(pos[0], pos[1], d))
-
 
62
        {
-
 
63
            Vec3d c;
-
 
64
            float r;
-
 
65
            bsphere(mani, c, r);
-
 
66
            VertexID closest = InvalidVertexID;
-
 
67
            double min_dist = DBL_MAX;
-
 
68
            for(auto vid : mani.vertices())
-
 
69
            {
-
 
70
                Vec3d wp = world2screen(mani.pos(vid));
-
 
71
                if(sqr_length(Vec2d(wp[0],wp[1])-Vec2d(pos))<100)
-
 
72
                {
-
 
73
                    double dist = sqr_length(screen2world(pos[0], pos[1], d)-mani.pos(vid));
-
 
74
                    if(dist < min_dist)
-
 
75
                    {
-
 
76
                        min_dist = dist;
-
 
77
                        closest = vid;
-
 
78
                    }
-
 
79
                }
-
 
80
            }
-
 
81
            if(closest != InvalidVertexID) {
-
 
82
                vertex_selection.resize(mani.allocated_vertices(),0);
-
 
83
                vertex_selection[closest] = 1;
-
 
84
                active_selection = true;
62
            create_display_list = false;
85
                post_create_display_list();
-
 
86
                return true;
-
 
87
            }
-
 
88
        }
-
 
89
        return false;
-
 
90
        
-
 
91
    }
63
            
92
 
-
 
93
    void VisObj::produce_renderer(const std::string& display_method , Console& cs, bool smooth, float gamma)
-
 
94
    {
64
            delete renderer;
95
        delete renderer;
65
            
96
        
66
            string short_name = display_method.substr(0,3);
97
        string short_name = display_method.substr(0,3);
67
            if(short_name== "wir")
98
        if(short_name== "wir")
68
                renderer = new WireframeRenderer(mani, smooth);
99
            renderer = new WireframeRenderer(mani, smooth);
Line 182... Line 213...
182
                renderer->compile_display_list(mani, smooth);
213
            renderer->compile_display_list(mani, smooth);
183
            }
214
        }
184
            
215
 
185
            
216
    
186
        }
217
    }
-
 
218
    
-
 
219
    void VisObj::draw_selection()
-
 
220
    {
-
 
221
        Vec3d c;
-
 
222
        float r;
-
 
223
        bsphere(mani, c, r);
-
 
224
        r *= 0.003;
-
 
225
        glDisable(GL_LIGHTING);
-
 
226
        for(auto vid : mani.vertices())
-
 
227
        {
-
 
228
            Vec3d p = mani.pos(vid);
-
 
229
            if(vertex_selection[vid])
-
 
230
                glColor3f(1,1,0);
-
 
231
            else
-
 
232
                glColor3f(0, 0, 0.3);
-
 
233
            glPushMatrix();
-
 
234
            glTranslated(p[0], p[1], p[2]);
-
 
235
            glScalef(r, r, r);
-
 
236
            draw_ball();
-
 
237
            glPopMatrix();
-
 
238
        }
-
 
239
        glEnable(GL_LIGHTING);
-
 
240
    }
-
 
241
 
-
 
242
    
-
 
243
    void VisObj::display(const std::string& display_method , Console& cs, bool smooth, float gamma)
-
 
244
    {
-
 
245
        if(create_display_list){
-
 
246
            create_display_list = false;
-
 
247
            produce_renderer(display_method, cs, smooth, gamma);
-
 
248
        }
187
        view_ctrl.set_gl_modelview();
249
        view_ctrl.set_gl_modelview();
188
        renderer->draw();
250
        renderer->draw();
-
 
251
        if(active_selection)
-
 
252
            draw_selection();
189
    }
253
    }
190
}
254
}
191
 
255