示例#1
0
static void test_plane(CuTest *tc) {
    struct region *r;
    plane *pl;

    test_setup();
    r = test_create_region(0, 0, NULL);
    CuAssertPtrEquals(tc, NULL, findplane(0, 0));
    CuAssertPtrEquals(tc, NULL, getplane(r));
    CuAssertIntEquals(tc, 0, getplaneid(r));
    CuAssertPtrEquals(tc, NULL, getplanebyid(0));
    CuAssertIntEquals(tc, 0, plane_center_x(0));
    CuAssertIntEquals(tc, 0, plane_center_y(0));
    CuAssertIntEquals(tc, 0, plane_width(0));
    CuAssertIntEquals(tc, 0, plane_height(0));
    CuAssertPtrEquals(tc, NULL, get_homeplane());

    pl = create_new_plane(1, "Hell", 4, 8, 40, 80, 15);
    r = test_create_region(4, 40, 0);
    CuAssertIntEquals(tc, 15, pl->flags);
    CuAssertIntEquals(tc, 4, pl->minx);
    CuAssertIntEquals(tc, 8, pl->maxx);
    CuAssertIntEquals(tc, 40, pl->miny);
    CuAssertIntEquals(tc, 80, pl->maxy);
    CuAssertPtrEquals(tc, NULL, pl->attribs);
    CuAssertStrEquals(tc, "Hell", pl->name);
    CuAssertPtrEquals(tc, pl, findplane(4, 40));
    CuAssertPtrEquals(tc, pl, getplane(r));
    CuAssertPtrEquals(tc, pl, getplanebyid(1));
    CuAssertIntEquals(tc, 1, getplaneid(r));
    CuAssertIntEquals(tc, 6, plane_center_x(pl));
    CuAssertIntEquals(tc, 60, plane_center_y(pl));
    CuAssertIntEquals(tc, 5, plane_width(pl));
    CuAssertIntEquals(tc, 41, plane_height(pl));
    test_teardown();
}
示例#2
0
文件: bind_region.c 项目: stm2/server
static int tolua_plane_get_size(lua_State * L)
{
    plane *pl = (plane *)tolua_tousertype(L, 1, 0);
    lua_pushinteger(L, plane_width(pl));
    lua_pushinteger(L, plane_height(pl));
    return 2;
}
示例#3
0
// apply_gravity: Applies gravity to the camera
// ----------------------------------------- >>
void apply_gravity()
{
	int sector = determine_sector((int)(camera.position.x / SCALE_3D), (int)(camera.position.y / SCALE_3D));

	if (sector != -1)
	{
		float f_h = plane_height(sector_info[sector].f_plane, camera.position.x, camera.position.y) + (40 * SCALE_3D);
		float c_h = plane_height(sector_info[sector].c_plane, camera.position.x, camera.position.y);

		if (f_h >= c_h)
		{
			f_h = c_h - (4 * SCALE_3D);
			float diff = f_h - camera.position.z;
			camera.position.z = f_h;
			camera.view.z += diff;
			grav = 0.01f;
			return;
		}

		if (camera.position.z > f_h - grav && camera.position.z < f_h + grav)
		{
			float diff = f_h - camera.position.z;
			camera.position.z = f_h;
			camera.view.z += diff;
			grav = 0.01f;
			return;
		}

		if (camera.position.z > f_h + grav)
		{
			grav = grav * 1.5;
			camera.position.z -= grav;
			camera.view.z -= grav;
		}
		else if (camera.position.z < f_h - grav)
		{
			grav = grav * 1.5;
			camera.position.z += grav;
			camera.view.z += grav;
		}
	}
}
示例#4
0
文件: region.c 项目: Xolgrim/server
int koor_distance(int x1, int y1, int x2, int y2)
{
    const plane *p1 = findplane(x1, y1);
    const plane *p2 = findplane(x2, y2);
    if (p1 != p2)
        return INT_MAX;
    else {
        int width = plane_width(p1);
        int height = plane_height(p1);
        if (width && height) {
            return koor_distance_wrap_xy(x1, y1, x2, y2, width, height);
        }
        else {
            return koor_distance_orig(x1, y1, x2, y2);
        }
    }
}
示例#5
0
void determine_hilight()
{
	float min_dist = 1024;
	hl_wrect = NULL;
	hl_fpoly = NULL;
	hl_thing = NULL;

	// List of sectors the camera view ray passes through
	vector<int> sectors;

	// Check Things
	if (render_things > 0)
	{
		for (int t = 0; t < map.n_things; t++)
		{
			int f_height = 0;
			int height = things_3d[t]->sprite->height;

			if (things_3d[t]->parent_sector == -1)
				continue;

			if (sector_info[things_3d[t]->parent_sector].visible)
			{
				if (map.things[t]->ttype->hanging)
					f_height = map.sectors[things_3d[t]->parent_sector]->c_height - height;
				else
					f_height = map.sectors[things_3d[t]->parent_sector]->f_height;
			}

			if (map.things[t]->z != 0 && map.hexen)
				f_height += map.things[t]->z;

			int r = things_3d[t]->sprite->width / 2;
			if (map.things[t]->ttype->radius == -1)
			{
				r = 4;
				height = 8;
				f_height -= 4;
			}

			float x1 = (map.things[t]->x - camera.strafe.x * r) * SCALE_3D;
			float y1 = (map.things[t]->y - camera.strafe.y * r) * SCALE_3D;
			float x2 = (map.things[t]->x + camera.strafe.x * r) * SCALE_3D;
			float y2 = (map.things[t]->y + camera.strafe.y * r) * SCALE_3D;

			float dist = line_intersect(camera.position, camera.view, x1, y1, x2, y2);

			if (dist != -1 && dist < min_dist)
			{
				point3_t direction = camera.view - camera.position;

				point3_t hit_point(camera.position.x + (direction.x * dist),
					camera.position.y + (direction.y * dist),
					camera.position.z + (direction.z * dist));

				if (hit_point.z >= f_height * SCALE_3D && hit_point.z <= (f_height + height) * SCALE_3D)
				{
					min_dist = dist;
					hl_thing = things_3d[t];
				}
			}
		}
	}

	// Check Lines
	for (int a = 0; a < map.n_lines; a++)
	{
		if (!lines_3d[a].visible)
			continue;

		rect_t lrect = map.l_getrect(a);
		float dist = line_intersect(camera.position, camera.view,
									(float)lrect.x1() * SCALE_3D, (float)lrect.y1() * SCALE_3D,
									(float)lrect.x2() * SCALE_3D, (float)lrect.y2() * SCALE_3D);

		if (dist != -1 && dist < min_dist)
		{
			point3_t direction = camera.view - camera.position;
			point3_t hit_point(camera.position.x + (direction.x * dist),
								camera.position.y + (direction.y * dist),
								camera.position.z + (direction.z * dist));

			sectors.push_back(map.l_getsector1(a));
			sectors.push_back(map.l_getsector2(a));

			// For all wallrects on the line
			for (int r = 0; r < lines_3d[a].rects.size(); r++)
			{
				if (!determine_line_side(lines_3d[a].rects[r]->verts[0].x, lines_3d[a].rects[r]->verts[0].y,
										lines_3d[a].rects[r]->verts[1].x, lines_3d[a].rects[r]->verts[1].y,
										camera.position.x, camera.position.y))
					continue;

				float up = get_slope_height_point(lines_3d[a].rects[r]->verts[0], lines_3d[a].rects[r]->verts[1], hit_point);
				float lo = get_slope_height_point(lines_3d[a].rects[r]->verts[3], lines_3d[a].rects[r]->verts[2], hit_point);

				if (up >= hit_point.z && lo <= hit_point.z)
				{
					hl_thing = NULL;
					hl_wrect = lines_3d[a].rects[r];
					min_dist = dist;
					break;
				}
			}
		}
	}

	// Check sectors
	for (int a = 0; a < ssects_3d.size(); a++)
	{
		if (!ssects_3d[a].visible)
			continue;

		point3_t direction = camera.view - camera.position;
		for (int b = 0; b < ssects_3d[a].flats.size(); b++)
		{
			// Get flat plane
			flatpoly_t *poly = ssects_3d[a].flats[b];

			if (!(vector_exists(sectors, poly->parent_sector)))
				continue;

			plane_t plane;

			if (poly->part == PART_CEIL)
				plane = sector_info[poly->parent_sector].c_plane;
			else
				plane = sector_info[poly->parent_sector].f_plane;

			// Check side of plane
			float h = plane_height(plane, camera.position.x, camera.position.y);

			if (poly->part == PART_CEIL)
			{
				if (camera.position.z > h)
					continue;
			}

			if (poly->part == PART_FLOOR)
			{
				if (camera.position.z < h)
					continue;
			}

			float dist = dist_ray_plane(camera.position, direction, plane);
			if (dist <= min_dist && dist > 0.0f)
			{
				point3_t intersection(camera.position.x + (direction.x * dist),
								camera.position.y + (direction.y * dist),
								camera.position.z + (direction.z * dist));

				bool in = true;
				DWORD start = gl_ssects[a].startseg;
				DWORD end = start + gl_ssects[a].n_segs;
				for (DWORD seg = start; seg < end; seg++)
				{
					if (!determine_seg_side(seg, intersection.x, intersection.y))
					{
						in = false;
						break;
					}
				}

				if (in)
				{
					hl_wrect = NULL;
					hl_thing = NULL;
					hl_fpoly = poly;
					min_dist = dist;
				}
			}
		}
	}
}