1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
-- Client-side code of the test lua object
--
-- Some helper functions and classes
--
function split(str, pat)
local t = {} -- NOTE: use {n = 0} in Lua-5.0
local fpat = "(.-)" .. pat
local last_end = 1
local s, e, cap = str:find(fpat, 1)
while s do
if s ~= 1 or cap ~= "" then
table.insert(t,cap)
end
last_end = e+1
s, e, cap = str:find(fpat, last_end)
end
if last_end <= #str then
cap = str:sub(last_end)
table.insert(t, cap)
end
return t
end
-- For debugging
function dump(o)
if type(o) == 'table' then
local s = '{ '
for k,v in pairs(o) do
if type(k) ~= 'number' then k = '"'..k..'"' end
s = s .. '['..k..'] = ' .. dump(v) .. ','
end
return s .. '} '
else
return tostring(o)
end
end
function vector_subtract(a, b)
return {X=a.X-b.X, Y=a.Y-b.Y, Z=a.Z-b.Z}
end
function vector_add(a, b)
return {X=a.X+b.X, Y=a.Y+b.Y, Z=a.Z+b.Z}
end
function vector_multiply(a, d)
return {X=a.X*d, Y=a.Y*d, Z=a.Z*d}
end
SmoothTranslator = {}
SmoothTranslator.__index = SmoothTranslator
function SmoothTranslator.create()
local obj = {}
setmetatable(obj, SmoothTranslator)
obj.vect_old = {X=0, Y=0, Z=0}
obj.anim_counter = 0
obj.anim_time = 0
obj.anim_time_counter = 0
obj.vect_show = {X=0, Y=0, Z=0}
obj.vect_aim = {X=0, Y=0, Z=0}
return obj
end
function SmoothTranslator:update(vect_new)
self.vect_old = self.vect_show
self.vect_aim = vect_new
if self.anim_time < 0.001 or self.anim_time > 1.0 then
self.anim_time = self.anim_time_counter
else
self.anim_time = self.anim_time * 0.9 + self.anim_time_counter * 0.1
end
self.anim_time_counter = 0
self.anim_counter = 0
end
function SmoothTranslator:translate(dtime)
self.anim_time_counter = self.anim_time_counter + dtime
self.anim_counter = self.anim_counter + dtime
vect_move = vector_subtract(self.vect_aim, self.vect_old)
moveratio = 1.0
if self.anim_time > 0.001 then
moveratio = self.anim_time_counter / self.anim_time
end
-- Move a bit less than should, to avoid oscillation
moveratio = moveratio * 0.8
if moveratio > 1.5 then
moveratio = 1.5
end
self.vect_show = vector_add(self.vect_old, vector_multiply(vect_move, moveratio))
end
--
-- Actual code
--
pos_trans = SmoothTranslator.create()
rot_trans = SmoothTranslator.create()
-- Callback functions
function on_step(self, dtime)
pos_trans:translate(dtime)
rot_trans:translate(dtime)
object_set_position(self, pos_trans.vect_show)
object_set_rotation(self, rot_trans.vect_show)
end
function on_process_message(self, data)
--print("client got message: " .. data)
-- Receive our custom messages
sp = split(data, " ")
if sp[1] == "pos" then
pos_trans:update({X=sp[2], Y=sp[3], Z=sp[4]})
end
if sp[1] == "rot" then
rot_trans:update({X=sp[2], Y=sp[3], Z=sp[4]})
end
end
function on_initialize(self, data)
print("client object got initialization: " .. data)
corners = {
{-1/2,-1/2, 0},
{ 1/2,-1/2, 0},
{ 1/2, 0, 0},
{-1/2, 0, 0},
}
object_add_to_mesh(self, "rat.png", corners, false)
end
|