Improve scrape particle position for fence & sign

This commit is contained in:
Wuzzy 2024-05-30 15:35:51 +02:00
parent e405b857ca
commit 1eeb4abab4
4 changed files with 47 additions and 5 deletions

View File

@ -70,6 +70,7 @@ local function register_fence(name, def)
def_painted.tiles = {def.texture_top_painted, def.texture_top_painted, def.texture_side_painted}
def_painted.inventory_image = def.inventory_image.."^[hsl:0:-100:0"
def_painted.wield_image = def.wield_image.."^[hsl:0:-100:0"
def_painted._rp_paint_particle_pos = "cube_inside"
local name_painted = name .. "_painted"
minetest.register_node(name_painted, def_painted)
end
@ -238,6 +239,7 @@ local function register_fence_gate(name, def)
def_open_painted.tiles = {def.texture_top_painted, def.texture_top_painted, def.texture_side_painted, def.texture_side_painted, def.texture_front_painted}
def_open_painted.inventory_image = nil
def_open_painted.wield_image = nil
def_open_painted._rp_paint_particle_pos = "cube_inside"
minetest.register_node(gate_id_open_painted, def_open_painted)
local def_closed_painted = table.copy(def_closed)
@ -250,6 +252,7 @@ local function register_fence_gate(name, def)
def_closed_painted.tiles = {def.texture_top_painted, def.texture_top_painted, def.texture_side_painted, def.texture_side_painted, def.texture_front_painted}
def_closed_painted.inventory_image = def.inventory_image.."^[hsl:0:-100:0"
def_closed_painted.wield_image = def.wield_image.."^[hsl:0:-100:0"
def_closed_painted._rp_paint_particle_pos = "cube_inside"
minetest.register_node(gate_id_closed_painted, def_closed_painted)
end

View File

@ -147,14 +147,26 @@ Removes color of a paintable node at `pos`, returning it to its
Returns `true` on success, `false` on failure or if node was not painted
or if node does not support an unpainted state.
### `rp_paint.scrape_color(pos)`
### `rp_paint.scrape_color(pos, pointed_thing)`
Same as `rp_paint.remove_color`, but will also play a “scraping-off”
sound effect (`_rp_scrape`) and show a particle effect.
The recommended use case for this function is tools.
By default, the particles will be based on the node itself by adding
* `pos`: Position of node to scrape off
* `pointed_thing`: A pointed thing table specifying where the position
was pointed to (used for particle position)
See also "Scrape particle fine-tuning" for details on how to customize
the scrape particles for nodes.
## Appendix
### Scrape particle fine-tuning
By default, when scraping off a node, the particles will be based on
the node itself by adding
`node = <the node that was scraped>` to the particle spawner
definition. This looks good for most nodes but sometimes it doesnt.
@ -164,6 +176,13 @@ particle effect on. If set to `false`, there will be no scraping
particles.
(Example: `_rp_paint_particle_node = "rp_default:planks_painted"`)
With the field `_rp_paint_particle_pos`, you can specify a custom
position for the particles:
* `"flat_above"` (default): Particles appear in front of the node
where it was scraped
* `"cube_inside"`: Particles appear inside the scraped node
### Color IDs
Each color has an unique numeric ID. The following IDs are available:

View File

@ -247,12 +247,18 @@ rp_paint.add_scrape_particles = function(pos, oldnode, direction)
if not olddef then
return false
end
local ptype = olddef._rp_paint_particle_pos
local rpos = table.copy(pos)
-- Spawn particles where we scrape
local offset1, offset2
local SQ = 0.48 -- "radius" of square
local H1 = 0.48 -- min. distance from node
local H2 = 0.49 -- max. distance from node
if direction.y > 0 then
if ptype == "cube_inside" then
offset1 = {x=-SQ, y=-SQ, z=-SQ}
offset2 = {x=SQ, y=SQ, z=SQ}
rpos = vector.subtract(rpos, direction)
elseif direction.y > 0 then
offset1 = {x=-SQ, y=-H2, z=-SQ}
offset2 = {x=SQ, y=-H1, z=SQ}
elseif direction.y < 0 then
@ -290,11 +296,20 @@ rp_paint.add_scrape_particles = function(pos, oldnode, direction)
else
particle_node = oldnode
end
local minpos, maxpos
if ptype == "flat_under" then
rpos = vector.subtract(rpos, direction)
minpos = vector.add(rpos, offset1)
maxpos = vector.add(rpos, offset2)
else
minpos = vector.add(rpos, offset1)
maxpos = vector.add(rpos, offset2)
end
minetest.add_particlespawner({
amount = math.random(10, 20),
time = 0.1,
minpos = vector.add(pos, offset1),
maxpos = vector.add(pos, offset2),
minpos = minpos,
maxpos = maxpos,
minvel = {x=-0.2, y=0, z=-0.2},
maxvel = {x=0.2, y=2, z=0.2},
minacc = {x=0, y=-GRAVITY, z=0},

View File

@ -1076,6 +1076,7 @@ local function register_sign(id, def)
sdef_p.inventory_image = def.inv_image.."^[hsl:0:-100:0"
sdef_p.wield_image = def.inv_image.."^[hsl:0:-100:0"
sdef_p.drop = "rp_signs:"..id
sdef_p._rp_paint_particle_pos = "cube_inside"
minetest.register_node("rp_signs:"..id.."_painted", sdef_p)
-- Wall sign, rotated by 90°, painted
@ -1095,6 +1096,7 @@ local function register_sign(id, def)
sdef_r90_p.inventory_image = "("..def.inv_image..")^[transformR90^[hsl:0:-100:0"
sdef_r90_p.wield_image = "("..def.inv_image..")^[transformR90^[hsl:0:-100:0"
sdef_r90_p.drop = "rp_signs:"..id
sdef_r90_p._rp_paint_particle_pos = "cube_inside"
minetest.register_node("rp_signs:"..id.."_r90_painted", sdef_r90_p)
-- Standing sign, painted
@ -1116,6 +1118,7 @@ local function register_sign(id, def)
ssdef_p.inventory_image = "("..def.inv_image_standing..")^[hsl:0:-100:0"
ssdef_p.wield_image = "("..def.inv_image_standing..")^[hsl:0:-100:0"
ssdef_p.drop = "rp_signs:"..id.."_standing"
ssdef_p._rp_paint_particle_pos = "cube_inside"
minetest.register_node("rp_signs:"..id.."_standing_painted", ssdef_p)
-- Hanging sign, painted
@ -1137,6 +1140,7 @@ local function register_sign(id, def)
shdef_p.inventory_image = nil
shdef_p.wield_image = nil
shdef_p.drop = "rp_signs:"..id.."_standing"
shdef_p._rp_paint_particle_pos = "cube_inside"
minetest.register_node("rp_signs:"..id.."_hanging_painted", shdef_p)
-- Sideways sign, painted
@ -1157,6 +1161,7 @@ local function register_sign(id, def)
stsdef_p.inventory_image = nil
stsdef_p.wield_image = nil
stsdef_p.drop = "rp_signs:"..id.."_standing"
stsdef_p._rp_paint_particle_pos = "cube_inside"
minetest.register_node("rp_signs:"..id.."_side_painted", stsdef_p)
register_sign_page(id, {