bool pick_vertex(struct group *group, mat4 const *model, mat4 const *projection, viewport const *viewport, vec2 const *mouse, cornerref *ref) { struct groupdata *groupdata = group->data; struct vertexpickdata pickdata = { model, projection, viewport, mouse, FLT_MAX }; size_t blockcount = ptrarray_count(groupdata->blocks); for (size_t i = 0; i < blockcount; ++i) { block *block = get_ptrarray(groupdata->blocks, i); cornerref cornerrefs[4]; make_cornerrefs(cornerrefs, block); for (size_t i = 0; i < 4; ++i) { cornerref *cornerRef = cornerrefs + i; check_vertex(&pickdata, cornertop (cornerRef->corner), cornerRef, CORNERREF_TOP); check_vertex(&pickdata, cornerbottom(cornerRef->corner), cornerRef, CORNERREF_BOTTOM); } } if (pickdata.distance != FLT_MAX) { *ref = pickdata.cornerref; return true; } else { return false; } }
int main(int argc, char ** argv){ int[] depth[512*424]; int[] depth_m[512*424]; float x_angular_pitch = 70.0; float y_angular_pitch = 60.0; float x_angular_density = 70.0/512.0; float y_angular_density = 60.0/424.0; //params to adjust with config.ini float max_depth = 50.0; int edge_filter = 2; float cameras[4*6]; int ahh; for (ahh = 0; ahh < 24; ahh++) { cameras[ahh] = 0; } while (1) { for (int i = 0; i<4; i++) { getDepth(i, depth); for (int j = 0 ; j < 512; j++) { for (int k = 0; k < 424; k++) { if (depth[k*512 + j] > max_depth) { depth_m[k*512 + j] = 1; } else { if (j>2 && j<509 && k>2 && k<421) { // eugh might be way too slow for (int j_off = -2; j_off <=2; j_off++) { for (int k_off = -2; k_off <=2; k_off++) { if (depth[(k+k_off)*512+j+j_off] > max_depth) { depth_m[k*512+j] = 1; break; } } } } else { depth_m[k*512+j] = 0; } } } int num_vertices = 0; int num_triangles = 0; float[] vertices_x[512*424]; float[] vertices_y[512*424]; float[] vertices_z[512*424]; int[] triangle_1[2*512*424]; int[] triangle_2[2*512*424]; int[] triangle_3[2*512*424]; int[] vert_enabled[512*424]; int[] vert_map[512*424]; for (int j = 1; j < 511; j++) { for (int k = 1; k < 423; k++) { if (!depth_m[k*512+j] && !depth_m[j-1+k*512] && !depth_m[(k-1)*512+j]) { num_vertices += check_vertex((k-1)*512+j, i, vertices_x, vertices_y, vertices_z, vert_enabled, vert_map, num_vertices, depth, cameras); num_vertices += check_vertex(k*512+j, i, vertices_x, vertices_y, vertices_z, vert_enabled, vert_map, num_vertices, depth, cameras); num_vertices += check_vertex(k*512+j-1, i, vertices_x, vertices_y, vertices_z, vert_enabled, vert_map, num_vertices, depth, cameras); triangle_1[num_triangles] = vert_map[k*512+j]; triangle_2[num_triangles] = vert_map[j-1+k*512]; triangle_3[num_triangles] = vert_map[j+(k-1)*512]; num_triangles++; } if (!depth_m[k*512+j] && !depth_m[j+1+k*512] && !depth_m[j+(k+1)*512]) { num_vertices += check_vertex((k+1)*512+j, i, vertices_x, vertices_y, vertices_z, vert_enabled, vert_map, num_vertices, depth, cameras); num_vertices += check_vertex(k*512+j, i, vertices_x, vertices_y, vertices_z, vert_enabled, vert_map, num_vertices, depth, cameras); num_vertices += check_vertex(k*512+j+1, i, vertices_x, vertices_y, vertices_z, vert_enabled, vert_map, num_vertices, depth, cameras); triangle_1[num_triangles] = vert_map[k*512+j]; triangle_2[num_triangles] = vert_map[j+1+k*512]; triangle_3[num_triangles] = vert_map[j+(k+1)*512]; num_triangles++; } } } } // getColor // send mesh } return 0; }
/*- * Add a tile described by vtype to the side of vertex. This must be * allowed by the rules -- we do not check it here. New vertices are * allocated as necessary. The fringe and the forced vertex pool are updated. * The new tile is drawn on the display. * * One thing we do check here is whether the new tile causes an untiled * area to become enclosed by the tiling. If this would happen, the tile * is not added. The return value is true iff a tile was added. */ static int add_tile(ModeInfo * mi, fringe_node_c * vertex, unsigned side, vertex_type_c vtype) { tiling_c *tp = &tilings[MI_SCREEN(mi)]; fringe_node_c *left = (fringe_node_c *) NULL, *right = (fringe_node_c *) NULL, *far = (fringe_node_c *) NULL, *node; unsigned fc = fringe_changes(mi, vertex, side, vtype, &right, &far, &left); vertex_type_c ltype = VT_LEFT(vtype), rtype = VT_RIGHT(vtype), ftype = VT_FAR(vtype); /* By our conventions vertex->next lies to the left of vertex and vertex->prev to the right. */ /* This should never occur. */ if (fc & FC_BAG) { tp->done = True; if (MI_IS_VERBOSE(mi)) { (void) fprintf(stderr, "Weirdness in add_tile()\n"); (void) fprintf(stderr, "fc = %d, FC_BAG = %d\n", fc, FC_BAG); } } if (side == S_LEFT) { if (right == NULL) if ((right = alloc_vertex(mi, vertex_dir(mi, vertex, S_LEFT) - vtype_angle(vtype), vertex, tp)) == NULL) return False; if (far == NULL) if ((far = alloc_vertex(mi, vertex_dir(mi, left, S_RIGHT) + vtype_angle(ltype), left, tp)) == NULL) return False; } else { if (left == NULL) if ((left = alloc_vertex(mi, vertex_dir(mi, vertex, S_RIGHT) + vtype_angle(vtype), vertex, tp)) == NULL) return False; if (far == NULL) if ((far = alloc_vertex(mi, vertex_dir(mi, right, S_LEFT) - vtype_angle(rtype), right, tp)) == NULL) return False; } /* Having allocated the new vertices, but before joining them with the rest of the fringe, check if vertices with same coordinates already exist. If any such are found, give up. */ node = tp->fringe.nodes; do { if (((fc & FC_NEW_LEFT) && fived_equal(node->fived, left->fived)) || ((fc & FC_NEW_RIGHT) && fived_equal(node->fived, right->fived)) || ((fc & FC_NEW_FAR) && fived_equal(node->fived, far->fived))) { /* Better luck next time. */ if (fc & FC_NEW_LEFT) delete_vertex(mi, left, tp); if (fc & FC_NEW_RIGHT) delete_vertex(mi, right, tp); if (fc & FC_NEW_FAR) delete_vertex(mi, far, tp); return False; } node = node->next; } while (node != tp->fringe.nodes); /* Rechain. */ if (!(fc & FC_CUT_THIS)) { if (side == S_LEFT) { vertex->next = right; right->prev = vertex; } else { vertex->prev = left; left->next = vertex; } } if (!(fc & FC_CUT_FAR)) { if (!(fc & FC_CUT_LEFT)) { far->next = left; left->prev = far; } if (!(fc & FC_CUT_RIGHT)) { far->prev = right; right->next = far; } } draw_tile(vertex, right, far, left, vtype, mi); /* Delete vertices that are no longer on the fringe. Check the others. */ if (fc & FC_CUT_THIS) { tp->fringe.nodes = far; delete_vertex(mi, vertex, tp); } else { add_vtype(vertex, side, vtype); check_vertex(mi, vertex, tp); tp->fringe.nodes = vertex; } if (fc & FC_CUT_FAR) delete_vertex(mi, far, tp); else { add_vtype(far, fc & FC_CUT_RIGHT ? S_LEFT : S_RIGHT, ftype); check_vertex(mi, far, tp); } if (fc & FC_CUT_LEFT) delete_vertex(mi, left, tp); else { add_vtype(left, fc & FC_CUT_FAR ? S_LEFT : S_RIGHT, ltype); check_vertex(mi, left, tp); } if (fc & FC_CUT_RIGHT) delete_vertex(mi, right, tp); else { add_vtype(right, fc & FC_CUT_FAR ? S_RIGHT : S_LEFT, rtype); check_vertex(mi, right, tp); } return True; }