make core:mob.look_at public
This commit is contained in:
parent
3c2061f788
commit
23a9ad0979
@ -26,6 +26,20 @@ def_prop("crouch_speed_mul", 0.35)
|
|||||||
def_prop("flight_speed_mul", 4.0)
|
def_prop("flight_speed_mul", 4.0)
|
||||||
def_prop("gravity_scale", 1.0)
|
def_prop("gravity_scale", 1.0)
|
||||||
|
|
||||||
|
local function normalize_angle(angle)
|
||||||
|
while angle > 180 do
|
||||||
|
angle = angle - 360
|
||||||
|
end
|
||||||
|
while angle <= -180 do
|
||||||
|
angle = angle + 360
|
||||||
|
end
|
||||||
|
return angle
|
||||||
|
end
|
||||||
|
|
||||||
|
local function angle_delta(a, b)
|
||||||
|
return normalize_angle(a - b)
|
||||||
|
end
|
||||||
|
|
||||||
local dir = {0, 0, -1}
|
local dir = {0, 0, -1}
|
||||||
local flight = false
|
local flight = false
|
||||||
|
|
||||||
@ -86,21 +100,25 @@ end
|
|||||||
|
|
||||||
local headIndex = rig:index("head")
|
local headIndex = rig:index("head")
|
||||||
|
|
||||||
-- todo: move somewhere
|
function look_at(point, change_dir)
|
||||||
local function update_head(point)
|
|
||||||
local pos = tsf:get_pos()
|
local pos = tsf:get_pos()
|
||||||
local viewdir = vec3.normalize(vec3.sub(point, pos))
|
local viewdir = vec3.normalize(vec3.sub(point, pos))
|
||||||
|
|
||||||
local dot = vec3.dot(viewdir, dir)
|
local dot = vec3.dot(viewdir, dir)
|
||||||
if dot > 0.0 then
|
if dot < 0.0 and not change_dir then
|
||||||
|
viewdir = mat4.mul(tsf:get_rot(), {0, 0, -1})
|
||||||
|
else
|
||||||
dir[1] = dir[1] * 0.8 + viewdir[1] * 0.2
|
dir[1] = dir[1] * 0.8 + viewdir[1] * 0.2
|
||||||
dir[3] = dir[3] * 0.8 + viewdir[3] * 0.2
|
dir[3] = dir[3] * 0.8 + viewdir[3] * 0.2
|
||||||
else
|
end
|
||||||
viewdir = mat4.mul(tsf:get_rot(), {0, 0, -1})
|
|
||||||
|
if not headIndex then
|
||||||
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local headrot = mat4.idt()
|
local headrot = mat4.idt()
|
||||||
local curdir = mat4.mul(mat4.mul(tsf:get_rot(), rig:get_matrix(headIndex)), {0, 0, -1})
|
local curdir = mat4.mul(mat4.mul(tsf:get_rot(),
|
||||||
|
rig:get_matrix(headIndex)), {0, 0, -1})
|
||||||
|
|
||||||
vec3.mix(curdir, viewdir, 0.2, viewdir)
|
vec3.mix(curdir, viewdir, 0.2, viewdir)
|
||||||
|
|
||||||
@ -140,20 +158,6 @@ function set_flight(flag) flight = flag end
|
|||||||
|
|
||||||
local prev_angle = 0.0
|
local prev_angle = 0.0
|
||||||
|
|
||||||
local function normalize_angle(angle)
|
|
||||||
while angle > 180 do
|
|
||||||
angle = angle - 360
|
|
||||||
end
|
|
||||||
while angle <= -180 do
|
|
||||||
angle = angle + 360
|
|
||||||
end
|
|
||||||
return angle
|
|
||||||
end
|
|
||||||
|
|
||||||
local function angle_delta(a, b)
|
|
||||||
return normalize_angle(a - b)
|
|
||||||
end
|
|
||||||
|
|
||||||
function on_physics_update(tps)
|
function on_physics_update(tps)
|
||||||
local delta = (1.0 / tps)
|
local delta = (1.0 / tps)
|
||||||
|
|
||||||
@ -174,19 +178,13 @@ function on_physics_update(tps)
|
|||||||
local rotate_speed = entity:get_player() == -1 and 200 or 400
|
local rotate_speed = entity:get_player() == -1 and 200 or 400
|
||||||
|
|
||||||
if math.abs(adelta) > 5 then
|
if math.abs(adelta) > 5 then
|
||||||
if adelta > 0 then
|
angle = angle + delta * rotate_speed * (adelta > 0 and 1 or -1)
|
||||||
angle = angle + delta * rotate_speed
|
|
||||||
else
|
|
||||||
angle = angle - delta * rotate_speed
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
tsf:set_rot(mat4.rotate({0, 1, 0}, angle + 180))
|
tsf:set_rot(mat4.rotate({0, 1, 0}, angle + 180))
|
||||||
prev_angle = angle
|
prev_angle = angle
|
||||||
|
|
||||||
if entity:get_player() == -1 then
|
if entity:get_player() == -1 then
|
||||||
update_head({player.get_pos(hud.get_player())})
|
look_at({player.get_pos(hud.get_player())})
|
||||||
else
|
|
||||||
local cam = cameras.get("core:first-person")
|
|
||||||
update_head(vec3.add({player.get_pos(entity:get_player())}, cam:get_front()))
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
local tsf = entity.transform
|
||||||
local body = entity.rigidbody
|
local body = entity.rigidbody
|
||||||
local mob = entity:require_component("core:mob")
|
local mob = entity:require_component("core:mob")
|
||||||
|
|
||||||
@ -54,6 +55,9 @@ function on_physics_update(tps)
|
|||||||
local delta = (1.0 / tps)
|
local delta = (1.0 / tps)
|
||||||
local pid = entity:get_player()
|
local pid = entity:get_player()
|
||||||
if pid ~= -1 then
|
if pid ~= -1 then
|
||||||
|
local pos = tsf:get_pos()
|
||||||
|
local cam = cameras.get("core:first-person")
|
||||||
process_player_inputs(pid, delta)
|
process_player_inputs(pid, delta)
|
||||||
|
mob.look_at(vec3.add(pos, cam:get_front()))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -91,7 +91,7 @@ static int l_set_texture(lua::State* L) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int l_index(lua::State* L) {
|
static int l_index(lua::State* L) {
|
||||||
if (auto skeleton= get_skeleton(L)) {
|
if (auto skeleton = get_skeleton(L)) {
|
||||||
if (auto bone = skeleton->config->find(lua::require_string(L, 2))) {
|
if (auto bone = skeleton->config->find(lua::require_string(L, 2))) {
|
||||||
return lua::pushinteger(L, bone->getIndex());
|
return lua::pushinteger(L, bone->getIndex());
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user