mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-22 18:41:09 +01:00
Implement wall sign mesh
This commit is contained in:
parent
aa691808d0
commit
8d10a1a7c7
3 changed files with 75 additions and 18 deletions
|
@ -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({
|
||||||
|
|
40
mods/ITEMS/mcl_signs/models/mcl_signs_signonwallmount.obj
Normal file
40
mods/ITEMS/mcl_signs/models/mcl_signs_signonwallmount.obj
Normal 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 |
Loading…
Reference in a new issue