aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-11-14 22:57:58 +0200
committerPerttu Ahola <celeron55@gmail.com>2011-11-29 19:13:42 +0200
commite9620d9c8ca194a8cdac9e9b0ae32d67f3cf5cc2 (patch)
treefd37fe8c695cff362fe256cdca1c63dc9e9d32dd
parentde51f87e0591ecfc03f943c948ed8e476046b34c (diff)
downloadminetest-e9620d9c8ca194a8cdac9e9b0ae32d67f3cf5cc2.tar.gz
minetest-e9620d9c8ca194a8cdac9e9b0ae32d67f3cf5cc2.tar.bz2
minetest-e9620d9c8ca194a8cdac9e9b0ae32d67f3cf5cc2.zip
Make fence post selection box smaller and create code to allow node placement to the side of a static box
-rw-r--r--src/content_mapnode.cpp3
-rw-r--r--src/game.cpp66
2 files changed, 58 insertions, 11 deletions
diff --git a/src/content_mapnode.cpp b/src/content_mapnode.cpp
index eb7ca6689..d9b5d6e26 100644
--- a/src/content_mapnode.cpp
+++ b/src/content_mapnode.cpp
@@ -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;
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<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)