BSP_Node* GameObject::build_bsp_tree() { if (get_polygon_count() == 0) return 0; std::vector<PolygonFace *> polygons; for (int i = 0; i < get_polygon_count(); ++i) { PolygonFace *polygon = new PolygonFace(get_original_polygon(i)); update_polygon(*polygon); polygons.push_back(polygon); } BSP_Node *bsp_root = new BSP_Node(); make_bsp_node(bsp_root, polygons); return bsp_root; }
GameObject::~GameObject() { delete bsp_root_; for (int i = 0; i < get_polygon_count(); ++i) { delete polygons_[i]; } }
Ref<Mesh> NavigationMesh::get_debug_mesh() { if (debug_mesh.is_valid()) return debug_mesh; PoolVector<Vector3> vertices = get_vertices(); PoolVector<Vector3>::Read vr=vertices.read(); List<Face3> faces; for(int i=0;i<get_polygon_count();i++) { Vector<int> p = get_polygon(i); for(int j=2;j<p.size();j++) { Face3 f; f.vertex[0]=vr[p[0]]; f.vertex[1]=vr[p[j-1]]; f.vertex[2]=vr[p[j]]; faces.push_back(f); } } Map<_EdgeKey,bool> edge_map; PoolVector<Vector3> tmeshfaces; tmeshfaces.resize(faces.size()*3); { PoolVector<Vector3>::Write tw=tmeshfaces.write(); int tidx=0; for(List<Face3>::Element *E=faces.front();E;E=E->next()) { const Face3 &f = E->get(); for(int j=0;j<3;j++) { tw[tidx++]=f.vertex[j]; _EdgeKey ek; ek.from=f.vertex[j].snapped(CMP_EPSILON); ek.to=f.vertex[(j+1)%3].snapped(CMP_EPSILON); if (ek.from<ek.to) SWAP(ek.from,ek.to); Map<_EdgeKey,bool>::Element *E=edge_map.find(ek); if (E) { E->get()=false; } else { edge_map[ek]=true; } } } } List<Vector3> lines; for(Map<_EdgeKey,bool>::Element *E=edge_map.front();E;E=E->next()) { if (E->get()) { lines.push_back(E->key().from); lines.push_back(E->key().to); } } PoolVector<Vector3> varr; varr.resize(lines.size()); { PoolVector<Vector3>::Write w = varr.write(); int idx=0; for(List<Vector3>::Element *E=lines.front();E;E=E->next()) { w[idx++]=E->get(); } } debug_mesh = Ref<Mesh>( memnew( Mesh ) ); Array arr; arr.resize(Mesh::ARRAY_MAX); arr[Mesh::ARRAY_VERTEX]=varr; debug_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_LINES,arr); return debug_mesh; }