First commit for fine pointed (#5485)
authorMarkuBu <markus.burrer@gmail.com>
Sat, 1 Apr 2017 14:50:53 +0000 (16:50 +0200)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Sat, 1 Apr 2017 14:50:53 +0000 (16:50 +0200)
builtin/common/misc_helpers.lua
doc/client_lua_api.md
doc/lua_api.txt

index f7111680c329975894d19cad18be03ee45f7f1e8..1c7ff3958b437e3b9c54d6aafed880132ab129d3 100644 (file)
@@ -691,3 +691,35 @@ end
 function core.strip_colors(str)
        return (str:gsub(ESCAPE_CHAR .. "%([bc]@[^)]+%)", ""))
 end
+
+--------------------------------------------------------------------------------
+-- Returns the exact coordinate of a pointed surface
+--------------------------------------------------------------------------------
+function core.pointed_thing_to_face_pos(placer, pointed_thing)
+       local eye_offset_first = placer:get_eye_offset()
+       local node_pos = pointed_thing.under
+       local camera_pos = placer:get_pos()
+       local pos_off = vector.multiply(
+                       vector.subtract(pointed_thing.above, node_pos), 0.5)
+       local look_dir = placer:get_look_dir()
+       local offset, nc
+       local oc = {}
+
+       for c, v in pairs(pos_off) do
+               if v == 0 then
+                       oc[#oc + 1] = c
+               else
+                       offset = v
+                       nc = c
+               end
+       end
+       local fine_pos = {[nc] = node_pos[nc] + offset}
+       camera_pos.y = camera_pos.y + 1.625 + eye_offset_first.y / 10
+       local f = (node_pos[nc] + offset - camera_pos[nc]) / look_dir[nc]
+
+       for i = 1, #oc do
+               fine_pos[oc[i]] = camera_pos[oc[i]] + look_dir[oc[i]] * f
+       end
+       return fine_pos
+end
+
index deb5bfb13536bb15772c564c0b92f3f90157038b..c9ccbeefacca7309976f877f797d6865ca53e923 100644 (file)
@@ -752,6 +752,8 @@ Call these functions only at load time!
       extra arguments and return the result
 * `fgettext(string, ...)` : returns string
     * same as fgettext_ne(), but calls minetest.formspec_escape before returning result
+* `minetest.pointed_thing_to_face_pos(placer, pointed_thing)`: returns a position
+    * returns the exact position on the surface of a pointed node
 
 ### UI
 * `minetest.ui.minimap`
@@ -827,7 +829,7 @@ The following functions provide escape sequences:
     * Removes background colors added by `get_background_escape_sequence`.
 * `color.strip_colors(str)`
     * Removes all color escape sequences.
-         
+
 `ColorString`
 -------------
 `#RGB` defines a color in hexadecimal format.
index 0ca3767f972b00ef34a601d9f518b4fe8e097b77..0d3f00c67873d699a4708c7b6f4a52314cc0cb4d 100644 (file)
@@ -1939,6 +1939,8 @@ Helper functions
     * returns time with microsecond precision. May not return wall time.
 * `table.copy(table)`: returns a table
     * returns a deep copy of `table`
+* `minetest.pointed_thing_to_face_pos(placer, pointed_thing)`: returns a position
+    * returns the exact position on the surface of a pointed node
 
 `minetest` namespace reference
 ------------------------------