Make fence post selection box smaller and create code to allow node placement to...
authorPerttu Ahola <celeron55@gmail.com>
Mon, 14 Nov 2011 20:57:58 +0000 (22:57 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Tue, 29 Nov 2011 17:13:42 +0000 (19:13 +0200)
src/content_mapnode.cpp
src/game.cpp

index eb7ca6689ef8d4a2dbf3f4a93c79755c12762900..d9b5d6e268c9e08c6741b0d75b944a485e364c77 100644 (file)
@@ -375,6 +375,9 @@ void content_mapnode_init(ITextureSource *tsrc, IWritableNodeDefManager *nodemgr
        f->air_equivalent = true; // grass grows underneath
        f->setInventoryTexture("fence.png", tsrc);
        f->used_texturenames.insert("fence.png"); // Add to atlas
+       f->selection_box.type = NODEBOX_FIXED;
+       f->selection_box.fixed = core::aabbox3d<f32>(
+                       -BS/7, -BS/2, -BS/7, BS/7, BS/2, BS/7);
        setWoodLikeMaterialProperties(f->material, 0.75);
 
        i = CONTENT_RAIL;
index a0bc5ac15f721a799f2ab2d6bc512371f0d8146e..bf601dd2106a04d3b98b6e415bceb4aa7f230761 100644 (file)
@@ -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<f32> 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<f32> faceboxes[6] = {
+                               // X-
+                               core::aabbox3d<f32>(
+                                       box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z,
+                                       box.MinEdge.X+d, box.MaxEdge.Y, box.MaxEdge.Z
+                               ),
+                               // X+
+                               core::aabbox3d<f32>(
+                                       box.MaxEdge.X-d, box.MinEdge.Y, box.MinEdge.Z,
+                                       box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z
+                               ),
+                               // Y-
+                               core::aabbox3d<f32>(
+                                       box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z,
+                                       box.MaxEdge.X, box.MinEdge.Y+d, box.MaxEdge.Z
+                               ),
+                               // Y+
+                               core::aabbox3d<f32>(
+                                       box.MinEdge.X, box.MaxEdge.Y-d, box.MinEdge.Z,
+                                       box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z
+                               ),
+                               // Z-
+                               core::aabbox3d<f32>(
+                                       box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z,
+                                       box.MaxEdge.X, box.MaxEdge.Y, box.MinEdge.Z+d
+                               ),
+                               // Z+
+                               core::aabbox3d<f32>(
+                                       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)