add a file preview and improve plane collision detection with a max radius from camera
This commit is contained in:
parent
2898cfce76
commit
726682d5e7
@ -34,6 +34,11 @@ pointerY : s32;
|
|||||||
|
|
||||||
world : World;
|
world : World;
|
||||||
|
|
||||||
|
show_trile_preview : bool = true;
|
||||||
|
trile_preview_x : int = 0;
|
||||||
|
trile_preview_y : int = 0;
|
||||||
|
trile_preview_z : int = 0;
|
||||||
|
|
||||||
Level_Editor_Tab :: enum {
|
Level_Editor_Tab :: enum {
|
||||||
TACOMA;
|
TACOMA;
|
||||||
TOOLS;
|
TOOLS;
|
||||||
@ -241,9 +246,18 @@ add_trile :: (name: string, x: float, y: float, z: float) {
|
|||||||
tick_level_editor :: () {
|
tick_level_editor :: () {
|
||||||
tick_level_editor_camera();
|
tick_level_editor_camera();
|
||||||
ray := get_mouse_ray(*get_level_editor_camera());
|
ray := get_mouse_ray(*get_level_editor_camera());
|
||||||
hit, point := ray_plane_collision_point(ray, 0.0);
|
hit, point := ray_plane_collision_point(ray, 0.0, 20);
|
||||||
if hit && input_button_states[Key_Code.MOUSE_BUTTON_LEFT] & .START {
|
|
||||||
handle_tool_click(xx floor(point.x), 0, xx floor(point.y));
|
show_trile_preview = false;
|
||||||
|
if hit {
|
||||||
|
show_trile_preview = true;
|
||||||
|
trile_preview_x = xx floor(point.x);
|
||||||
|
trile_preview_y = xx floor(0);
|
||||||
|
trile_preview_z = xx floor(point.y);
|
||||||
|
|
||||||
|
if input_button_states[Key_Code.MOUSE_BUTTON_LEFT] & .START {
|
||||||
|
handle_tool_click(xx floor(point.x), 0, xx floor(point.y));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,6 +283,11 @@ draw_level_editor :: () {
|
|||||||
idx += 1;
|
idx += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if show_trile_preview && it.trileName == editor_current_trile.name {
|
||||||
|
positions[idx] = .{xx trile_preview_x, xx trile_preview_y, xx trile_preview_z, 0.0};
|
||||||
|
idx += 1;
|
||||||
|
}
|
||||||
|
|
||||||
sg_update_buffer(gPipelines.trile.bind.vertex_buffers[3], *(sg_range.{
|
sg_update_buffer(gPipelines.trile.bind.vertex_buffers[3], *(sg_range.{
|
||||||
ptr = positions.data,
|
ptr = positions.data,
|
||||||
size = size_of(type_of(positions)),
|
size = size_of(type_of(positions)),
|
||||||
|
|||||||
@ -42,12 +42,15 @@ Ray_Collision :: struct {
|
|||||||
|
|
||||||
// At which 2D XZ point does a ray hit the ground plane at a height of
|
// At which 2D XZ point does a ray hit the ground plane at a height of
|
||||||
// plane_height. Used for the level editor and maybe later the trile editor as well.
|
// plane_height. Used for the level editor and maybe later the trile editor as well.
|
||||||
ray_plane_collision_point :: (ray: Ray, plane_height: float) -> (bool, Vector2) {
|
ray_plane_collision_point :: (ray: Ray, plane_height: float, acceptable_radius: float = -1) -> (bool, Vector2) {
|
||||||
dist_to_plane := ray.origin.y - plane_height;
|
dist_to_plane := ray.origin.y - plane_height;
|
||||||
if ray.direction.y >= 0 then return false, .{0,0};
|
if ray.direction.y >= 0 then return false, .{0,0};
|
||||||
multi := dist_to_plane / abs(ray.direction.y);
|
multi := dist_to_plane / abs(ray.direction.y);
|
||||||
ray_to_plane := ray.direction * multi;
|
ray_to_plane := ray.direction * multi;
|
||||||
planePoint := ray_to_plane + ray.origin;
|
planePoint := ray_to_plane + ray.origin;
|
||||||
|
if acceptable_radius > 0 && abs(length(Vector2.{planePoint.x, planePoint.z} - Vector2.{ray.origin.x, ray.origin.z})) > acceptable_radius {
|
||||||
|
return false, .{};
|
||||||
|
}
|
||||||
return true, .{planePoint.x, planePoint.z};
|
return true, .{planePoint.x, planePoint.z};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user