From e9620d9c8ca194a8cdac9e9b0ae32d67f3cf5cc2 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Mon, 14 Nov 2011 22:57:58 +0200 Subject: Make fence post selection box smaller and create code to allow node placement to the side of a static box --- src/game.cpp | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 11 deletions(-) (limited to 'src/game.cpp') diff --git a/src/game.cpp b/src/game.cpp index a0bc5ac15..bf601dd21 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -348,22 +348,66 @@ void getPointedNode(Client *client, v3f player_position, if(f.selection_box.type == NODEBOX_FIXED) { - f32 distance = (npf - camera_position).getLength(); - core::aabbox3d box = f.selection_box.fixed; box.MinEdge += npf; box.MaxEdge += npf; - if(distance < mindistance) + v3s16 facedirs[6] = { + v3s16(-1,0,0), + v3s16(1,0,0), + v3s16(0,-1,0), + v3s16(0,1,0), + v3s16(0,0,-1), + v3s16(0,0,1), + }; + + core::aabbox3d faceboxes[6] = { + // X- + core::aabbox3d( + box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z, + box.MinEdge.X+d, box.MaxEdge.Y, box.MaxEdge.Z + ), + // X+ + core::aabbox3d( + box.MaxEdge.X-d, box.MinEdge.Y, box.MinEdge.Z, + box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z + ), + // Y- + core::aabbox3d( + box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z, + box.MaxEdge.X, box.MinEdge.Y+d, box.MaxEdge.Z + ), + // Y+ + core::aabbox3d( + box.MinEdge.X, box.MaxEdge.Y-d, box.MinEdge.Z, + box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z + ), + // Z- + core::aabbox3d( + box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z, + box.MaxEdge.X, box.MaxEdge.Y, box.MinEdge.Z+d + ), + // Z+ + core::aabbox3d( + box.MinEdge.X, box.MinEdge.Y, box.MaxEdge.Z-d, + box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z + ), + }; + + for(u16 i=0; i<6; i++) { - if(box.intersectsWithLine(shootline)) - { - nodefound = true; - nodepos = np; - neighbourpos = np; - mindistance = distance; - nodehilightbox = box; - } + v3f facedir_f(facedirs[i].X, facedirs[i].Y, facedirs[i].Z); + v3f centerpoint = npf + facedir_f * BS/2; + f32 distance = (centerpoint - camera_position).getLength(); + if(distance >= mindistance) + continue; + if(!faceboxes[i].intersectsWithLine(shootline)) + continue; + nodefound = true; + nodepos = np; + neighbourpos = np+facedirs[i]; + mindistance = distance; + nodehilightbox = box; } } else if(f.selection_box.type == NODEBOX_WALLMOUNTED) -- cgit v1.2.3