mirror of
https://github.com/ZDoom/Raze.git
synced 2024-11-16 09:21:36 +00:00
Lunatic: serialization for cdata types, currently xmath.vec3 and ivec3.
git-svn-id: https://svn.eduke32.com/eduke32@3914 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
dea960d350
commit
fb0c13f9f2
8 changed files with 64 additions and 15 deletions
|
@ -41,8 +41,13 @@ local sector, wall, sprite = dc.sector, dc.wall, dc.sprite
|
||||||
local wallsofsect = dc.wallsofsect
|
local wallsofsect = dc.wallsofsect
|
||||||
local spritesofsect, spritesofstat = dc.spritesofsect, dc.spritesofstat
|
local spritesofsect, spritesofstat = dc.spritesofsect, dc.spritesofstat
|
||||||
|
|
||||||
local OUR_NAME = "_con"
|
local OUR_REQUIRE_STRING = [[
|
||||||
local OUR_REQUIRE_STRING = "local "..OUR_NAME.."=require'con'"
|
local _con=require'con'
|
||||||
|
local _ga,_av,_pv=_con._gamearray,_con.actorvar,_con.playervar
|
||||||
|
]]
|
||||||
|
local function our_get_require()
|
||||||
|
return OUR_REQUIRE_STRING
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
module(...)
|
module(...)
|
||||||
|
@ -1900,10 +1905,6 @@ local function serialize_array(ar, strtab, maxnum)
|
||||||
return table.concat(strtab)
|
return table.concat(strtab)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function our_get_require()
|
|
||||||
return OUR_REQUIRE_STRING
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
--- Game arrays ---
|
--- Game arrays ---
|
||||||
|
|
||||||
|
@ -2069,7 +2070,7 @@ local gamearray_methods = {
|
||||||
_get_require = our_get_require,
|
_get_require = our_get_require,
|
||||||
|
|
||||||
_serialize = function(gar)
|
_serialize = function(gar)
|
||||||
local strtab = { OUR_NAME.."._gamearray(", tostring(gar._size), ",{" }
|
local strtab = { "_ga(", tostring(gar._size), ",{" }
|
||||||
gar:_cleanup()
|
gar:_cleanup()
|
||||||
return serialize_array(gar, strtab, gar._size)
|
return serialize_array(gar, strtab, gar._size)
|
||||||
end,
|
end,
|
||||||
|
@ -2149,7 +2150,7 @@ local actorvar_methods = {
|
||||||
_get_require = our_get_require,
|
_get_require = our_get_require,
|
||||||
|
|
||||||
_serialize = function(acv)
|
_serialize = function(acv)
|
||||||
local strtab = { OUR_NAME..".actorvar(", tostring(acv._defval), ",{" }
|
local strtab = { "_av(", tostring(acv._defval), ",{" }
|
||||||
-- NOTE: We also clean up when spawning a sprite, too. (See
|
-- NOTE: We also clean up when spawning a sprite, too. (See
|
||||||
-- A_ResetVars() and related functions above.)
|
-- A_ResetVars() and related functions above.)
|
||||||
acv:_cleanup()
|
acv:_cleanup()
|
||||||
|
@ -2191,7 +2192,7 @@ local playervar_methods = {
|
||||||
_get_require = our_get_require,
|
_get_require = our_get_require,
|
||||||
|
|
||||||
_serialize = function(plv)
|
_serialize = function(plv)
|
||||||
local strtab = { OUR_NAME..".playervar(", tostring(plv._defval), ",{" }
|
local strtab = { "_pv(", tostring(plv._defval), ",{" }
|
||||||
return serialize_array(plv, strtab, ffiC.MAXSPRITES)
|
return serialize_array(plv, strtab, ffiC.MAXSPRITES)
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,10 @@ local tonumber = tonumber
|
||||||
local tostring = tostring
|
local tostring = tostring
|
||||||
local type = type
|
local type = type
|
||||||
|
|
||||||
|
-- Create a new module for passing stuff to other modules.
|
||||||
|
local lprivate = {}
|
||||||
|
require("package").loaded.lprivate = lprivate
|
||||||
|
|
||||||
require("jit.opt").start("maxmcode=10240") -- in KiB
|
require("jit.opt").start("maxmcode=10240") -- in KiB
|
||||||
|
|
||||||
-- The "gv" global will provide access to C global *scalars* and safe functions.
|
-- The "gv" global will provide access to C global *scalars* and safe functions.
|
||||||
|
@ -1433,6 +1437,27 @@ local allowed_modules = {
|
||||||
con = con,
|
con = con,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
local ctype_cansave = {}
|
||||||
|
|
||||||
|
-- Register as "serializeable" the type of cdata object <v>.
|
||||||
|
local function reg_serializable_cv(v)
|
||||||
|
assert(type(v)=="cdata")
|
||||||
|
assert(type(v._serialize)=="function")
|
||||||
|
-- NOTE: tonumber() on a ctype cdata object gets its LuaJIT-internal
|
||||||
|
-- ID, the one that would be shown with tostring(), e.g.
|
||||||
|
-- ctype<struct 95>
|
||||||
|
ctype_cansave[tonumber(ffi.typeof(v))] = true
|
||||||
|
end
|
||||||
|
|
||||||
|
function lprivate.cansave_cdata(v)
|
||||||
|
return type(v)=="cdata" and ctype_cansave[tonumber(ffi.typeof(v))]
|
||||||
|
end
|
||||||
|
|
||||||
|
reg_serializable_cv(allowed_modules.xmath.vec3())
|
||||||
|
reg_serializable_cv(allowed_modules.xmath.ivec3())
|
||||||
|
end
|
||||||
|
|
||||||
-- Protect base modules.
|
-- Protect base modules.
|
||||||
local function basemodule_newindex()
|
local function basemodule_newindex()
|
||||||
error("modifying base module table forbidden", 2)
|
error("modifying base module table forbidden", 2)
|
||||||
|
|
|
@ -363,7 +363,7 @@ function readintostr(fd, kopen4load_func)
|
||||||
ffiC.kclose(fd); fd=-1
|
ffiC.kclose(fd); fd=-1
|
||||||
|
|
||||||
if (readlen ~= sz) then
|
if (readlen ~= sz) then
|
||||||
error("INTERNAL ERROR: couldn't read \""..fn.."\" wholly")
|
error("INTERNAL ERROR: couldn't read file wholly")
|
||||||
end
|
end
|
||||||
|
|
||||||
return ffi.string(str, sz)
|
return ffi.string(str, sz)
|
||||||
|
|
|
@ -1059,8 +1059,8 @@ Returns an approximation of the 2D Euclidean distance between points `pos1` and
|
||||||
`pos2`, both of which can be any object indexable with `x` and `y`.
|
`pos2`, both of which can be any object indexable with `x` and `y`.
|
||||||
|
|
||||||
[[vector_types]]
|
[[vector_types]]
|
||||||
The types `xmath.vec3` and `xmath.ivec3`
|
The types `xmath.vec3` and `xmath.ivec3` [_serializeable_]
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Another purpose of the `xmath` module is to provide _vector_ types that allow
|
Another purpose of the `xmath` module is to provide _vector_ types that allow
|
||||||
writing concise and clear code involving geometrical calculations. There are
|
writing concise and clear code involving geometrical calculations. There are
|
||||||
|
|
|
@ -13,6 +13,8 @@ local setmetatable = setmetatable
|
||||||
local tostring = tostring
|
local tostring = tostring
|
||||||
local type = type
|
local type = type
|
||||||
|
|
||||||
|
local cansave_cdata = require("lprivate").cansave_cdata
|
||||||
|
|
||||||
|
|
||||||
module(...)
|
module(...)
|
||||||
|
|
||||||
|
@ -39,7 +41,7 @@ end
|
||||||
|
|
||||||
|
|
||||||
local function isSerializeable(obj)
|
local function isSerializeable(obj)
|
||||||
return (getmetatable(obj)=="serializeable")
|
return (getmetatable(obj)=="serializeable" or cansave_cdata(obj))
|
||||||
end
|
end
|
||||||
|
|
||||||
-- 'Save buffer' class. Objects of this class keep track of a string buffer
|
-- 'Save buffer' class. Objects of this class keep track of a string buffer
|
||||||
|
|
|
@ -3,6 +3,7 @@ local require = require
|
||||||
|
|
||||||
local string = require("string")
|
local string = require("string")
|
||||||
local con = require("con")
|
local con = require("con")
|
||||||
|
local xmath = require("xmath")
|
||||||
|
|
||||||
local gv = gv
|
local gv = gv
|
||||||
local sprite = sprite
|
local sprite = sprite
|
||||||
|
@ -31,6 +32,9 @@ tag.hi, tag.lo = 0, 0
|
||||||
-- Preliminary dummy of a local gamevar.
|
-- Preliminary dummy of a local gamevar.
|
||||||
local ournumjumps = 0
|
local ournumjumps = 0
|
||||||
|
|
||||||
|
local lastv = xmath.vec3()
|
||||||
|
ilastv = xmath.ivec3()
|
||||||
|
|
||||||
require "end_gamevars"
|
require "end_gamevars"
|
||||||
|
|
||||||
-- We may cache globals defined in the gamevar section afterwards, but not
|
-- We may cache globals defined in the gamevar section afterwards, but not
|
||||||
|
@ -67,6 +71,8 @@ function(aci, pli)
|
||||||
if (nearesti >= 0) then
|
if (nearesti >= 0) then
|
||||||
local spr = sprite[nearesti]
|
local spr = sprite[nearesti]
|
||||||
tag.lo, tag.hi = spr.lotag, spr.hitag
|
tag.lo, tag.hi = spr.lotag, spr.hitag
|
||||||
|
lastv.x, lastv.y, lastv.z = spr.x, spr.y, spr.z+0.5
|
||||||
|
ilastv.x, ilastv.y, ilastv.z = spr.x, spr.y, spr.z
|
||||||
actor.delete(nearesti)
|
actor.delete(nearesti)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,14 @@ local assert = assert
|
||||||
local error = error
|
local error = error
|
||||||
local type = type
|
local type = type
|
||||||
|
|
||||||
|
local OUR_REQUIRE_STRING = [[
|
||||||
|
local _xm=require'xmath'
|
||||||
|
local _v,_iv=_xm.vec3,_xm.ivec3
|
||||||
|
]]
|
||||||
|
local function our_get_require()
|
||||||
|
return OUR_REQUIRE_STRING
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
module(...)
|
module(...)
|
||||||
|
|
||||||
|
@ -182,7 +190,7 @@ local vec3_mt = {
|
||||||
return v:_ctor(v.x, v.y, v.z-zofs)
|
return v:_ctor(v.x, v.y, v.z-zofs)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
-- XXX: Rewrite using _serialize internal API instead.
|
-- Convenience for human-readable display.
|
||||||
__tostring = function(a)
|
__tostring = function(a)
|
||||||
return (a:_isi() and "i" or "").."vec3("..a.x..", "..a.y..", "..a.z..")"
|
return (a:_isi() and "i" or "").."vec3("..a.x..", "..a.y..", "..a.z..")"
|
||||||
end,
|
end,
|
||||||
|
@ -224,6 +232,13 @@ local vec3_mt = {
|
||||||
_isi = function(v)
|
_isi = function(v)
|
||||||
return ffi.istype(ivec3_t, v)
|
return ffi.istype(ivec3_t, v)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
|
--- Serialization ---
|
||||||
|
_get_require = our_get_require,
|
||||||
|
|
||||||
|
_serialize = function(v)
|
||||||
|
return (v:_isi() and "_iv" or "_v").."("..v.x..","..v.y..","..v.z..")"
|
||||||
|
end,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1235,7 +1235,7 @@ int32_t sv_saveandmakesnapshot(FILE *fil, int8_t spot, int8_t recdiffsp, int8_t
|
||||||
#ifdef LUNATIC
|
#ifdef LUNATIC
|
||||||
if (!g_savedOK)
|
if (!g_savedOK)
|
||||||
{
|
{
|
||||||
OSD_Printf("sv_saveandmakesnapshot: failed serializing Lunatic gamevar %s.\n",
|
OSD_Printf("sv_saveandmakesnapshot: failed serializing Lunatic gamevar \"%s\".\n",
|
||||||
g_failedVarname);
|
g_failedVarname);
|
||||||
g_failedVarname = NULL;
|
g_failedVarname = NULL;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in a new issue