Implement wall sign mesh

This commit is contained in:
Wuzzy 2017-07-26 15:11:52 +02:00
parent aa691808d0
commit 8d10a1a7c7
3 changed files with 75 additions and 18 deletions

View file

@ -110,9 +110,14 @@ local generate_line = function(s, ypos)
return texture return texture
end end
local generate_texture = function(lines) local generate_texture = function(lines, signnodename)
local texture = "[combine:"..SIGN_WIDTH.."x"..SIGN_WIDTH local texture = "[combine:"..SIGN_WIDTH.."x"..SIGN_WIDTH
local ypos = 9 local ypos
if signnodename == "mcl_signs:wall_sign" then
ypos = 27
else
ypos = 9
end
for i = 1, #lines do for i = 1, #lines do
texture = texture..generate_line(lines[i], ypos) texture = texture..generate_line(lines[i], ypos)
ypos = ypos + LINE_HEIGHT ypos = ypos + LINE_HEIGHT
@ -120,7 +125,7 @@ local generate_texture = function(lines)
return texture return texture
end end
local n = 7/16 - 1/128 local n = 23/56 - 1/128
local signtext_info_wall = { local signtext_info_wall = {
{delta = {x = 0, y = 0, z = n}, yaw = 0}, {delta = {x = 0, y = 0, z = n}, yaw = 0},
@ -178,7 +183,7 @@ local update_sign = function(pos, fields, sender)
local objects = minetest.get_objects_inside_radius(pos, 0.5) local objects = minetest.get_objects_inside_radius(pos, 0.5)
for _, v in ipairs(objects) do for _, v in ipairs(objects) do
if v:get_entity_name() == "mcl_signs:text" then if v:get_entity_name() == "mcl_signs:text" then
v:set_properties({textures={generate_texture(create_lines(text))}}) v:set_properties({textures={generate_texture(create_lines(text), v:get_luaentity()._signnodename)}})
return return
end end
end end
@ -206,6 +211,7 @@ local update_sign = function(pos, fields, sender)
elseif nn == "mcl_signs:standing_sign67_5" then elseif nn == "mcl_signs:standing_sign67_5" then
sign_info.yaw = sign_info.yaw + 3 * (math.pi / 8) sign_info.yaw = sign_info.yaw + 3 * (math.pi / 8)
end end
text_entity:get_luaentity()._signnodename = nn
text_entity:setyaw(sign_info.yaw) text_entity:setyaw(sign_info.yaw)
end end
@ -241,9 +247,10 @@ minetest.register_node("mcl_signs:wall_sign", {
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
paramtype2 = "wallmounted", paramtype2 = "wallmounted",
drawtype = "nodebox", drawtype = "mesh",
node_box = {type = "wallmounted", wall_side = {-0.499, -1/16, -7/16, -7/16, 7/16, 7/16}}, mesh = "mcl_signs_signonwallmount.obj",
tiles = {"mcl_signs_sign_wall.png"}, selection_box = {type = "wallmounted", wall_side = {-0.5, -7/28, -0.5, -23/56, 7/28, 0.5}},
tiles = {"mcl_signs_sign.png"},
groups = sign_groups, groups = sign_groups,
stack_max = 16, stack_max = 16,
sounds = mcl_sounds.node_sound_wood_defaults(), sounds = mcl_sounds.node_sound_wood_defaults(),
@ -276,6 +283,7 @@ minetest.register_node("mcl_signs:wall_sign", {
local sign_info local sign_info
local place_pos local place_pos
local nodeitem = ItemStack(itemstack)
-- Ceiling -- Ceiling
if wdir == 0 then if wdir == 0 then
--how would you add sign to ceiling? --how would you add sign to ceiling?
@ -286,7 +294,6 @@ minetest.register_node("mcl_signs:wall_sign", {
place_pos = above place_pos = above
-- Determine the sign rotation based on player's yaw -- Determine the sign rotation based on player's yaw
local stand = ItemStack(itemstack)
local yaw = math.pi*2 - placer:get_look_horizontal() local yaw = math.pi*2 - placer:get_look_horizontal()
-- Select one of 16 possible rotations (0-15) -- Select one of 16 possible rotations (0-15)
@ -300,18 +307,18 @@ minetest.register_node("mcl_signs:wall_sign", {
-- The actual rotation is a combination of predefined mesh and facedir (see node definition) -- The actual rotation is a combination of predefined mesh and facedir (see node definition)
if rotation_level % 4 == 0 then if rotation_level % 4 == 0 then
stand:set_name("mcl_signs:standing_sign") nodeitem:set_name("mcl_signs:standing_sign")
elseif rotation_level % 4 == 1 then elseif rotation_level % 4 == 1 then
stand:set_name("mcl_signs:standing_sign22_5") nodeitem:set_name("mcl_signs:standing_sign22_5")
elseif rotation_level % 4 == 2 then elseif rotation_level % 4 == 2 then
stand:set_name("mcl_signs:standing_sign45") nodeitem:set_name("mcl_signs:standing_sign45")
elseif rotation_level % 4 == 3 then elseif rotation_level % 4 == 3 then
stand:set_name("mcl_signs:standing_sign67_5") nodeitem:set_name("mcl_signs:standing_sign67_5")
end end
fdir = math.floor(rotation_level / 4) fdir = math.floor(rotation_level / 4)
-- Place the node! -- Place the node!
local _, success = minetest.item_place_node(stand, placer, pointed_thing, fdir) local _, success = minetest.item_place_node(nodeitem, placer, pointed_thing, fdir)
if not success then if not success then
return itemstack return itemstack
end end
@ -327,11 +334,12 @@ minetest.register_node("mcl_signs:wall_sign", {
sign_info = signtext_info_wall[fdir + 1] sign_info = signtext_info_wall[fdir + 1]
end end
local text = minetest.add_entity({ local text_entity = minetest.add_entity({
x = place_pos.x + sign_info.delta.x, x = place_pos.x + sign_info.delta.x,
y = place_pos.y + sign_info.delta.y, y = place_pos.y + sign_info.delta.y,
z = place_pos.z + sign_info.delta.z}, "mcl_signs:text") z = place_pos.z + sign_info.delta.z}, "mcl_signs:text")
text:setyaw(sign_info.yaw) text_entity:setyaw(sign_info.yaw)
text_entity:get_luaentity()._signnodename = nodeitem:get_name()
if not minetest.setting_getbool("creative_mode") then if not minetest.setting_getbool("creative_mode") then
itemstack:take_item() itemstack:take_item()
@ -409,14 +417,23 @@ minetest.register_entity("mcl_signs:text", {
physical = false, physical = false,
collide_with_objects = false, collide_with_objects = false,
on_activate = function(self) _signnodename = nil, -- node name of sign node to which the text belongs
on_activate = function(self, staticdata)
if staticdata then
self._signnodename = staticdata._signnodename
end
local meta = minetest.get_meta(self.object:getpos()) local meta = minetest.get_meta(self.object:getpos())
local text = meta:get_string("text") local text = meta:get_string("text")
self.object:set_properties({ self.object:set_properties({
textures={generate_texture(create_lines(text))}, textures={generate_texture(create_lines(text), self._signnodename)},
}) })
self.object:set_armor_groups({ immortal = 1 }) self.object:set_armor_groups({ immortal = 1 })
end end,
get_staticdata = function(self)
local out = { self._signnodename }
return minetest.serialize(out)
end,
}) })
minetest.register_craft({ minetest.register_craft({

View file

@ -0,0 +1,40 @@
# Blender v2.76 (sub 0) OBJ File: 'signonwallmount.blend'
# www.blender.org
mtllib signonwallmount.mtl
o wood_Cube.001
v 0.499985 -0.416668 -0.249992
v 0.499985 -0.416668 0.249993
v 0.499985 -0.499999 -0.249992
v 0.499985 -0.499999 0.249993
v -0.499985 -0.416668 -0.249993
v -0.499985 -0.416668 0.249992
v -0.499985 -0.499999 -0.249993
v -0.499985 -0.499999 0.249992
vt 0.031250 0.562500
vt 0.031250 0.937500
vt 0.000000 0.937500
vt 0.000000 0.562500
vt 0.812500 0.562500
vt 0.812500 0.937500
vt 0.437500 0.937500
vt 0.437500 0.562500
vt 0.406250 0.937500
vt 0.406250 0.562500
vt 0.406250 1.000000
vt 0.781250 1.000000
vt 0.781250 0.937500
vt 0.031250 1.000000
vn 1.000000 0.000000 0.000000
vn 0.000000 -1.000000 -0.000000
vn -1.000000 0.000000 -0.000000
vn -0.000000 1.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn -0.000000 -0.000000 1.000000
usemtl None
s off
f 1/1/1 2/2/1 4/3/1 3/4/1
f 3/5/2 4/6/2 8/7/2 7/8/2
f 7/8/3 8/7/3 6/9/3 5/10/3
f 5/10/4 6/9/4 2/2/4 1/1/4
f 3/11/5 7/12/5 5/13/5 1/9/5
f 8/11/6 4/14/6 2/2/6 6/9/6

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 B