예제 #1
0
파일: group.c 프로젝트: lilliemarck/kloss
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;
    }
}
예제 #2
0
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;
}
예제 #3
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;
}