Only respect floor triangles when picking room
This commit is contained in:
parent
b4adc20ef0
commit
02d3608a8b
2 changed files with 13 additions and 11 deletions
|
@ -38,7 +38,7 @@ void RoomListRenderer::render_vfunc(const Glib::RefPtr<Gdk::Drawable> &window, G
|
||||||
const Gdk::Rectangle &/*background_area*/, const Gdk::Rectangle &cell_area,
|
const Gdk::Rectangle &/*background_area*/, const Gdk::Rectangle &cell_area,
|
||||||
const Gdk::Rectangle &/*expose_area*/, Gtk::CellRendererState /*flags*/) {
|
const Gdk::Rectangle &/*expose_area*/, Gtk::CellRendererState /*flags*/) {
|
||||||
|
|
||||||
Data::Room *room = reinterpret_cast<Data::Room*>(value.get_value());
|
Data::Room *room = static_cast<Data::Room*>(value.get_value());
|
||||||
|
|
||||||
int xpad, ypad;
|
int xpad, ypad;
|
||||||
get_padding(xpad, ypad);
|
get_padding(xpad, ypad);
|
||||||
|
|
|
@ -236,30 +236,32 @@ void TopView::click(float x, float y, unsigned int button) {
|
||||||
|
|
||||||
vmml::vec2f v(xCenter + x/scale, yCenter + y/scale);
|
vmml::vec2f v(xCenter + x/scale, yCenter + y/scale);
|
||||||
|
|
||||||
Data::Room *selectedRoom = 0;
|
|
||||||
|
|
||||||
const std::list<Data::Room*> &rooms = instance->getLevel()->getRooms();
|
const std::list<Data::Room*> &rooms = instance->getLevel()->getRooms();
|
||||||
|
|
||||||
for(std::list<Data::Room*>::const_iterator room = rooms.begin(); room != rooms.end(); ++room) {
|
for(std::list<Data::Room*>::const_iterator room = rooms.begin(); room != rooms.end(); ++room) {
|
||||||
const std::list<Data::Triangle*>& triangles = (*room)->getTriangles();
|
const std::list<Data::Triangle*>& triangles = (*room)->getTriangles();
|
||||||
|
|
||||||
for(std::list<Data::Triangle*>::const_iterator t = triangles.begin(); t != triangles.end(); ++t) {
|
for(std::list<Data::Triangle*>::const_iterator t = triangles.begin(); t != triangles.end(); ++t) {
|
||||||
|
vmml::vec3f edge1 = (*t)->getVertex(1) - (*t)->getVertex(0);
|
||||||
|
vmml::vec3f edge2 = (*t)->getVertex(2) - (*t)->getVertex(0);
|
||||||
|
|
||||||
|
vmml::vec3f normal = edge1.cross(edge2);
|
||||||
|
|
||||||
|
if(normal.y() <= 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
vmml::vec2f v1((*t)->getVertex(0).x(), (*t)->getVertex(0).z());
|
vmml::vec2f v1((*t)->getVertex(0).x(), (*t)->getVertex(0).z());
|
||||||
vmml::vec2f v2((*t)->getVertex(1).x(), (*t)->getVertex(1).z());
|
vmml::vec2f v2((*t)->getVertex(1).x(), (*t)->getVertex(1).z());
|
||||||
vmml::vec2f v3((*t)->getVertex(2).x(), (*t)->getVertex(2).z());
|
vmml::vec2f v3((*t)->getVertex(2).x(), (*t)->getVertex(2).z());
|
||||||
|
|
||||||
if(Math::Triangle2D(v1, v2, v3).contains(v)) {
|
if(Math::Triangle2D(v1, v2, v3).contains(v)) {
|
||||||
selectedRoom = *room;
|
instance->setSelectedRoom(*room);
|
||||||
break;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(selectedRoom)
|
instance->setSelectedRoom(0);
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
instance->setSelectedRoom(selectedRoom);
|
|
||||||
signalUpdate().emit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue