mirror of
https://github.com/imezx/Warp.git
synced 2026-06-02 12:18:32 +00:00
feat: add float32 precision option for vector2 & vector3 type
This commit is contained in:
parent
847b76921a
commit
677a13dcc1
2 changed files with 108 additions and 31 deletions
|
|
@ -35,6 +35,8 @@ Define strict data schemas for optimized serialization and type safety.
|
||||||
"buffer",
|
"buffer",
|
||||||
"vector2", -- f16 x/y
|
"vector2", -- f16 x/y
|
||||||
"vector3", -- f16 x/y/z
|
"vector3", -- f16 x/y/z
|
||||||
|
"vector2f32", -- f32 x/y
|
||||||
|
"vector3f32", -- f32 x/y/z
|
||||||
"vector2int16", -- i16 x/y
|
"vector2int16", -- i16 x/y
|
||||||
"vector3int16", -- i16 x/y/z
|
"vector3int16", -- i16 x/y/z
|
||||||
"cframe", -- f32 position + compressed rotation (f16)
|
"cframe", -- f32 position + compressed rotation (f16)
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,11 @@ local T_BUFFER = 0xDC
|
||||||
local T_BOOL_ARR = 0xDD
|
local T_BOOL_ARR = 0xDD
|
||||||
|
|
||||||
local T_VEC3 = 0xE0
|
local T_VEC3 = 0xE0
|
||||||
|
local T_VEC3F32 = 0xE1
|
||||||
|
local T_VEC3I16 = 0xF1
|
||||||
local T_VEC2 = 0xE2
|
local T_VEC2 = 0xE2
|
||||||
|
local T_VEC2F32 = 0xE3
|
||||||
|
local T_VEC2I16 = 0xF4
|
||||||
local T_CFRAME = 0xE4
|
local T_CFRAME = 0xE4
|
||||||
local T_COLOR3 = 0xE6
|
local T_COLOR3 = 0xE6
|
||||||
local T_COLOR3_F = 0xE7
|
local T_COLOR3_F = 0xE7
|
||||||
|
|
@ -65,8 +69,6 @@ local T_NUMBERRANGE = 0xEF
|
||||||
local T_RAY = 0xF0
|
local T_RAY = 0xF0
|
||||||
local T_COLSEQ = 0xF2
|
local T_COLSEQ = 0xF2
|
||||||
local T_NUMSEQ = 0xF3
|
local T_NUMSEQ = 0xF3
|
||||||
local T_VEC3I16 = 0xF1
|
|
||||||
local T_VEC2I16 = 0xF4
|
|
||||||
local T_TWEENINFO = 0xF5
|
local T_TWEENINFO = 0xF5
|
||||||
local T_PHYSPROP = 0xF6
|
local T_PHYSPROP = 0xF6
|
||||||
local T_FONT = 0xF7
|
local T_FONT = 0xF7
|
||||||
|
|
@ -732,6 +734,14 @@ local function packVector3(w: Writer, v: Vector3)
|
||||||
rawF16(w, v.Z)
|
rawF16(w, v.Z)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function packVector3F32(w: Writer, v: Vector3)
|
||||||
|
ensureSpace(w, 13)
|
||||||
|
rawU8(w, T_VEC3F32)
|
||||||
|
rawF32(w, v.X)
|
||||||
|
rawF32(w, v.Y)
|
||||||
|
rawF32(w, v.Z)
|
||||||
|
end
|
||||||
|
|
||||||
local function packVector2(w: Writer, v: Vector2)
|
local function packVector2(w: Writer, v: Vector2)
|
||||||
ensureSpace(w, 5)
|
ensureSpace(w, 5)
|
||||||
rawU8(w, T_VEC2)
|
rawU8(w, T_VEC2)
|
||||||
|
|
@ -739,6 +749,13 @@ local function packVector2(w: Writer, v: Vector2)
|
||||||
rawF16(w, v.Y)
|
rawF16(w, v.Y)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function packVector2F32(w: Writer, v: Vector2)
|
||||||
|
ensureSpace(w, 9)
|
||||||
|
rawU8(w, T_VEC2F32)
|
||||||
|
rawF32(w, v.X)
|
||||||
|
rawF32(w, v.Y)
|
||||||
|
end
|
||||||
|
|
||||||
local function packCFrame(w: Writer, cf: CFrame)
|
local function packCFrame(w: Writer, cf: CFrame)
|
||||||
local pos = cf.Position
|
local pos = cf.Position
|
||||||
local qi, q0, q1, q2 = compressCFrameRotation(cf)
|
local qi, q0, q1, q2 = compressCFrameRotation(cf)
|
||||||
|
|
@ -796,10 +813,33 @@ PACK_DISPATCH["Vector3"] = function(w: Writer, v: any)
|
||||||
packVector3(w, v)
|
packVector3(w, v)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
PACK_DISPATCH["Vector3F32"] = function(w: Writer, v: any)
|
||||||
|
packVector3F32(w, v)
|
||||||
|
end
|
||||||
|
|
||||||
|
PACK_DISPATCH["Vector3int16"] = function(w: Writer, v: any)
|
||||||
|
ensureSpace(w, 7)
|
||||||
|
rawU8(w, T_VEC3I16)
|
||||||
|
rawI16(w, v.X)
|
||||||
|
rawI16(w, v.Y)
|
||||||
|
rawI16(w, v.Z)
|
||||||
|
end
|
||||||
|
|
||||||
PACK_DISPATCH["Vector2"] = function(w: Writer, v: any)
|
PACK_DISPATCH["Vector2"] = function(w: Writer, v: any)
|
||||||
packVector2(w, v)
|
packVector2(w, v)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
PACK_DISPATCH["Vector2F32"] = function(w: Writer, v: any)
|
||||||
|
packVector2F32(w, v)
|
||||||
|
end
|
||||||
|
|
||||||
|
PACK_DISPATCH["Vector2int16"] = function(w: Writer, v: any)
|
||||||
|
ensureSpace(w, 5)
|
||||||
|
rawU8(w, T_VEC2I16)
|
||||||
|
rawI16(w, v.X)
|
||||||
|
rawI16(w, v.Y)
|
||||||
|
end
|
||||||
|
|
||||||
PACK_DISPATCH["CFrame"] = function(w: Writer, v: any)
|
PACK_DISPATCH["CFrame"] = function(w: Writer, v: any)
|
||||||
packCFrame(w, v)
|
packCFrame(w, v)
|
||||||
end
|
end
|
||||||
|
|
@ -924,21 +964,6 @@ PACK_DISPATCH["buffer"] = function(w: Writer, v: any)
|
||||||
w.cursor += len
|
w.cursor += len
|
||||||
end
|
end
|
||||||
|
|
||||||
PACK_DISPATCH["Vector3int16"] = function(w: Writer, v: any)
|
|
||||||
ensureSpace(w, 7)
|
|
||||||
rawU8(w, T_VEC3I16)
|
|
||||||
rawI16(w, v.X)
|
|
||||||
rawI16(w, v.Y)
|
|
||||||
rawI16(w, v.Z)
|
|
||||||
end
|
|
||||||
|
|
||||||
PACK_DISPATCH["Vector2int16"] = function(w: Writer, v: any)
|
|
||||||
ensureSpace(w, 5)
|
|
||||||
rawU8(w, T_VEC2I16)
|
|
||||||
rawI16(w, v.X)
|
|
||||||
rawI16(w, v.Y)
|
|
||||||
end
|
|
||||||
|
|
||||||
PACK_DISPATCH["TweenInfo"] = function(w: Writer, v: any)
|
PACK_DISPATCH["TweenInfo"] = function(w: Writer, v: any)
|
||||||
ensureSpace(w, 16) -- tag(1) + f32(4) + u8(1) + u8(1) + i32(4) + u8(1) + f32(4)
|
ensureSpace(w, 16) -- tag(1) + f32(4) + u8(1) + u8(1) + i32(4) + u8(1) + f32(4)
|
||||||
rawU8(w, T_TWEENINFO)
|
rawU8(w, T_TWEENINFO)
|
||||||
|
|
@ -1066,15 +1091,6 @@ UNPACK[T_F64 + 1] = function(buf: buffer, pos: number, _: { any }?, _: number):
|
||||||
return buffer.readf64(buf, pos), pos + 8
|
return buffer.readf64(buf, pos), pos + 8
|
||||||
end
|
end
|
||||||
|
|
||||||
UNPACK[T_VEC3I16 + 1] = function(buf: buffer, pos: number, _: { any }?, _: number): (any, number)
|
|
||||||
return Vector3int16.new(buffer.readi16(buf, pos), buffer.readi16(buf, pos + 2), buffer.readi16(buf, pos + 4)),
|
|
||||||
pos + 6
|
|
||||||
end
|
|
||||||
|
|
||||||
UNPACK[T_VEC2I16 + 1] = function(buf: buffer, pos: number, _: { any }?, _: number): (any, number)
|
|
||||||
return Vector2int16.new(buffer.readi16(buf, pos), buffer.readi16(buf, pos + 2)), pos + 4
|
|
||||||
end
|
|
||||||
|
|
||||||
UNPACK[T_TWEENINFO + 1] = function(buf: buffer, pos: number, _: { any }?, _: number): (any, number)
|
UNPACK[T_TWEENINFO + 1] = function(buf: buffer, pos: number, _: { any }?, _: number): (any, number)
|
||||||
return TweenInfo.new(
|
return TweenInfo.new(
|
||||||
buffer.readf32(buf, pos),
|
buffer.readf32(buf, pos),
|
||||||
|
|
@ -1288,6 +1304,20 @@ UNPACK[T_VEC3 + 1] = function(buf: buffer, pos: number, _: { any }?, _: number):
|
||||||
return Vector3.new(x, y, z), pos + 6
|
return Vector3.new(x, y, z), pos + 6
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Vector3 float32
|
||||||
|
UNPACK[T_VEC3F32 + 1] = function(buf: buffer, pos: number, _: { any }?, _: number): (any, number)
|
||||||
|
local x = buffer.readf32(buf, pos)
|
||||||
|
local y = buffer.readf32(buf, pos + 4)
|
||||||
|
local z = buffer.readf32(buf, pos + 8)
|
||||||
|
return Vector3.new(x, y, z), pos + 12
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Vector3int16
|
||||||
|
UNPACK[T_VEC3I16 + 1] = function(buf: buffer, pos: number, _: { any }?, _: number): (any, number)
|
||||||
|
return Vector3int16.new(buffer.readi16(buf, pos), buffer.readi16(buf, pos + 2), buffer.readi16(buf, pos + 4)),
|
||||||
|
pos + 6
|
||||||
|
end
|
||||||
|
|
||||||
-- Vector2
|
-- Vector2
|
||||||
UNPACK[T_VEC2 + 1] = function(buf: buffer, pos: number, _: { any }?, _: number): (any, number)
|
UNPACK[T_VEC2 + 1] = function(buf: buffer, pos: number, _: { any }?, _: number): (any, number)
|
||||||
local x = readF16(buf, pos)
|
local x = readF16(buf, pos)
|
||||||
|
|
@ -1295,6 +1325,18 @@ UNPACK[T_VEC2 + 1] = function(buf: buffer, pos: number, _: { any }?, _: number):
|
||||||
return Vector2.new(x, y), pos + 4
|
return Vector2.new(x, y), pos + 4
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Vector2 float32
|
||||||
|
UNPACK[T_VEC2F32 + 1] = function(buf: buffer, pos: number, _: { any }?, _: number): (any, number)
|
||||||
|
local x = buffer.readf32(buf, pos)
|
||||||
|
local y = buffer.readf32(buf, pos + 4)
|
||||||
|
return Vector2.new(x, y), pos + 8
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Vector2int16
|
||||||
|
UNPACK[T_VEC2I16 + 1] = function(buf: buffer, pos: number, _: { any }?, _: number): (any, number)
|
||||||
|
return Vector2int16.new(buffer.readi16(buf, pos), buffer.readi16(buf, pos + 2)), pos + 4
|
||||||
|
end
|
||||||
|
|
||||||
-- CFrame
|
-- CFrame
|
||||||
UNPACK[T_CFRAME + 1] = function(buf: buffer, pos: number, _: { any }?, _: number): (any, number)
|
UNPACK[T_CFRAME + 1] = function(buf: buffer, pos: number, _: { any }?, _: number): (any, number)
|
||||||
local px = buffer.readf32(buf, pos)
|
local px = buffer.readf32(buf, pos)
|
||||||
|
|
@ -1469,7 +1511,11 @@ Schema.f32 = { type = "f32" }
|
||||||
Schema.f64 = { type = "f64" }
|
Schema.f64 = { type = "f64" }
|
||||||
Schema.boolean = { type = "boolean" }
|
Schema.boolean = { type = "boolean" }
|
||||||
Schema.vector3 = { type = "vector3" }
|
Schema.vector3 = { type = "vector3" }
|
||||||
|
Schema.vector3f32 = { type = "vector3f32" }
|
||||||
|
Schema.vector3int16 = { type = "vector3int16" }
|
||||||
Schema.vector2 = { type = "vector2" }
|
Schema.vector2 = { type = "vector2" }
|
||||||
|
Schema.vector2f32 = { type = "vector2f32" }
|
||||||
|
Schema.vector2int16 = { type = "vector2int16" }
|
||||||
Schema.cframe = { type = "cframe" }
|
Schema.cframe = { type = "cframe" }
|
||||||
Schema.color3 = { type = "color3" }
|
Schema.color3 = { type = "color3" }
|
||||||
Schema.color3f16 = { type = "color3f16" }
|
Schema.color3f16 = { type = "color3f16" }
|
||||||
|
|
@ -1484,8 +1530,6 @@ Schema.colorsequence = { type = "colorsequence" }
|
||||||
Schema.numbersequence = { type = "numbersequence" }
|
Schema.numbersequence = { type = "numbersequence" }
|
||||||
Schema.brickcolor = { type = "brickcolor" }
|
Schema.brickcolor = { type = "brickcolor" }
|
||||||
Schema.buffer = { type = "buffer" }
|
Schema.buffer = { type = "buffer" }
|
||||||
Schema.vector3int16 = { type = "vector3int16" }
|
|
||||||
Schema.vector2int16 = { type = "vector2int16" }
|
|
||||||
Schema.tweeninfo = { type = "tweeninfo" }
|
Schema.tweeninfo = { type = "tweeninfo" }
|
||||||
Schema.physicalproperties = { type = "physicalproperties" }
|
Schema.physicalproperties = { type = "physicalproperties" }
|
||||||
Schema.font = { type = "font" }
|
Schema.font = { type = "font" }
|
||||||
|
|
@ -1544,7 +1588,11 @@ local SCHEMA_FIXED_SIZES: { [string]: number } = {
|
||||||
f64 = 8,
|
f64 = 8,
|
||||||
boolean = 1,
|
boolean = 1,
|
||||||
vector3 = 6,
|
vector3 = 6,
|
||||||
|
vector3f32 = 12,
|
||||||
|
vector3int16 = 6,
|
||||||
vector2 = 4,
|
vector2 = 4,
|
||||||
|
vector2f32 = 8,
|
||||||
|
vector2int16 = 4,
|
||||||
cframe = 19,
|
cframe = 19,
|
||||||
color3 = 3,
|
color3 = 3,
|
||||||
color3f16 = 6,
|
color3f16 = 6,
|
||||||
|
|
@ -1554,8 +1602,6 @@ local SCHEMA_FIXED_SIZES: { [string]: number } = {
|
||||||
numberrange = 8,
|
numberrange = 8,
|
||||||
ray = 24,
|
ray = 24,
|
||||||
brickcolor = 2,
|
brickcolor = 2,
|
||||||
vector3int16 = 6,
|
|
||||||
vector2int16 = 4,
|
|
||||||
tweeninfo = 15,
|
tweeninfo = 15,
|
||||||
physicalproperties = 20,
|
physicalproperties = 20,
|
||||||
datetime = 8,
|
datetime = 8,
|
||||||
|
|
@ -1637,7 +1683,6 @@ local function compilePacker(s: SchemaType): (Writer, any) -> ()
|
||||||
rawString(w, v, len)
|
rawString(w, v, len)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if schema_type == "vector3" then
|
if schema_type == "vector3" then
|
||||||
return function(w: Writer, v: any)
|
return function(w: Writer, v: any)
|
||||||
ensureSpace(w, 6)
|
ensureSpace(w, 6)
|
||||||
|
|
@ -1646,6 +1691,14 @@ local function compilePacker(s: SchemaType): (Writer, any) -> ()
|
||||||
rawF16(w, v.Z)
|
rawF16(w, v.Z)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if schema_type == "vector3f32" then
|
||||||
|
return function(w: Writer, v: any)
|
||||||
|
ensureSpace(w, 12)
|
||||||
|
rawF32(w, v.X)
|
||||||
|
rawF32(w, v.Y)
|
||||||
|
rawF32(w, v.Z)
|
||||||
|
end
|
||||||
|
end
|
||||||
if schema_type == "vector2" then
|
if schema_type == "vector2" then
|
||||||
return function(w: Writer, v: any)
|
return function(w: Writer, v: any)
|
||||||
ensureSpace(w, 4)
|
ensureSpace(w, 4)
|
||||||
|
|
@ -1653,6 +1706,13 @@ local function compilePacker(s: SchemaType): (Writer, any) -> ()
|
||||||
rawF16(w, v.Y)
|
rawF16(w, v.Y)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if schema_type == "vector2f32" then
|
||||||
|
return function(w: Writer, v: any)
|
||||||
|
ensureSpace(w, 8)
|
||||||
|
rawF32(w, v.X)
|
||||||
|
rawF32(w, v.Y)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if schema_type == "cframe" then
|
if schema_type == "cframe" then
|
||||||
return function(w: Writer, v: any)
|
return function(w: Writer, v: any)
|
||||||
|
|
@ -2084,6 +2144,14 @@ local function compileReader(s: SchemaType): (buffer, number, { any }?) -> (any,
|
||||||
return Vector3.new(x, y, z), c + 6
|
return Vector3.new(x, y, z), c + 6
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if schema_type == "vector3f32" then
|
||||||
|
return function(b: buffer, c: number)
|
||||||
|
local x = buffer.readf32(b, c)
|
||||||
|
local y = buffer.readf32(b, c + 4)
|
||||||
|
local z = buffer.readf32(b, c + 8)
|
||||||
|
return Vector3.new(x, y, z), c + 12
|
||||||
|
end
|
||||||
|
end
|
||||||
if schema_type == "vector2" then
|
if schema_type == "vector2" then
|
||||||
return function(b: buffer, c: number)
|
return function(b: buffer, c: number)
|
||||||
local x = readF16(b, c)
|
local x = readF16(b, c)
|
||||||
|
|
@ -2091,6 +2159,13 @@ local function compileReader(s: SchemaType): (buffer, number, { any }?) -> (any,
|
||||||
return Vector2.new(x, y), c + 4
|
return Vector2.new(x, y), c + 4
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if schema_type == "vector2f32" then
|
||||||
|
return function(b: buffer, c: number)
|
||||||
|
local x = buffer.readf32(b, c)
|
||||||
|
local y = buffer.readf32(b, c + 4)
|
||||||
|
return Vector2.new(x, y), c + 8
|
||||||
|
end
|
||||||
|
end
|
||||||
if schema_type == "color3" then
|
if schema_type == "color3" then
|
||||||
return function(b: buffer, c: number)
|
return function(b: buffer, c: number)
|
||||||
local r = buffer.readu8(b, c)
|
local r = buffer.readu8(b, c)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue