almost there with this one, LZMA and LZ4 don't work

This commit is contained in:
989onan
2024-12-14 18:21:32 -05:00
parent c83f14f88b
commit 758cf0e760
11 changed files with 1356 additions and 165 deletions
+56
View File
@@ -0,0 +1,56 @@
import ctypes
import typing
import struct
from io import BytesIO
def ReadCSharp_str(data: BytesIO) -> str:
charamount = read7bitEncoded_int(data)
print(charamount)
return data.read(charamount).decode('utf-8', errors="replace")
def WriteCSharp_str(data: BytesIO, string: str) -> str:
write7bitEncoded_int(len(string))
return data.write(string.encode("utf-8", errors="replace"))
def read7bitEncoded_ulong(data: BytesIO) -> int:
num: int = int(0)
num2: int = 0
flag: bool = True
while (flag):
b: int = int(struct.unpack('<B', data.read(1))[0])
flag = ((b & 128) > 0)
num |= ((b & 127) << num2)
num2 += 7
if not flag:
break
return num
def read7bitEncoded_int(data: BytesIO) -> int:
num: int= int(0)
num2:int = int(0)
while (num2 != 35):
b: int = int(struct.unpack('<B', data.read(1))[0])
num |= int(b & 127) << num2
num2 += 7
if ((b & 128) == 0):
return num
return -1
def write7bitEncoded_ulong(data: BytesIO, integer: int) -> None:
while integer > int(0):
b: int = ctypes.c_ubyte(integer & int(127))
integer >>= 7
if integer > int(0):
b |= 128
data.write(b)
if integer <= int(0):
return
def write7bitEncoded_int(data: BytesIO, value: int) -> None:
num: int = int(value)
while(num >= int(128)):
data.write(int(num | int(128)))
num >>= 7
data.Write(int(num))
+472
View File
@@ -0,0 +1,472 @@
from __future__ import annotations
import lz4.block
from . import resonite_types
from . import common
import ctypes
import typing
import struct
from io import BytesIO
KeyframeInterpolation: dict[str, int] = {
"Hold": 1,
"Linear": 2,
"Tangent": 3,
"CubicBezier": 4
}
class KeyFrame():
time: resonite_types.float = 0
interpolation: resonite_types.int = 0
value: resonite_types.ResoType
left_tan: resonite_types.ResoType
right_tan: resonite_types.ResoType
def __getattr__(self, name: str):
if name == "interpolation":
interp: int = 0
if (self.__dict__["left_tan"] != None and self.__dict__["right_tan"] != None):
interp = 3
return resonite_types.int(interp)
return self.__dict__[name]
def __setattr__(self, name, value):
self.__dict__[name] = value
def __init__(self):
pass
def RequiresTangents(self) -> bool:
if KeyframeInterpolation[self.interpolation.x] == "Tangent" or KeyframeInterpolation[self.interpolation.x] == "CubicBezier":
return True
return False
class ResoTrack(resonite_types.ResoType):
_node: resonite_types.string
_property: resonite_types.string
Owner: AnimX
FrameType: type[resonite_types.ResoType]
keyframes: list[KeyFrame] = []
def __init__(self,FrameType):
self.FrameType = FrameType
def write(self, data: BytesIO):
self._node.write(data)
self._property.write(data)
common.write7bitEncoded_ulong(data, len(self.keyframes))
def read(self, data:BytesIO):
self._node.read(data)
self._property.read(data)
track_amount: int = int(common.read7bitEncoded_ulong(data))
for i in range(0, track_amount):
self.keyframes.append(KeyFrame())
def removeKeyframe(self, time: float | int) -> bool:
"""Takes a time and removes one with the same time"""
if (time < 0):
raise IndexError("Keyframe time cannot be lower than 0. Value: " + str(time))
if(type(time) == float):
num: int = -1
for num2 in range(0,len(self.keyframes)):
if (self.keyframes[num2].time.x == float(time)):
num = num2
if num == -1:
return False
self.keyframes.remove(self.keyframes[num])
return True
else:
if (int(time) >= len(self.keyframes)):
raise IndexError("Keyframe time cannot be bigger than the amount of keyframes. Value: " + str(time))
self.keyframes.remove(self.keyframes[int(time)])
def replaceKeyframe(self, keyframe: KeyFrame) -> bool:
"""Takes a keyframe and replaces one with the same time"""
if (keyframe.time.x < 0):
raise IndexError("Keyframe time cannot be lower than 0. Value: " + str(keyframe.time.x))
num: int = 0
if (keyframe.time.x == self.keyframes[self.GetKeyframeIndex(keyframe.time.x)].time.x):
num = len(self.keyframes)
else:
return False
self.keyframes[num] = keyframe
return True
def addKeyframe(self, keyframe: KeyFrame) -> int:
if (keyframe.time.x < 0):
raise IndexError("Keyframe time cannot be lower than 0. Value: " + str(keyframe.time.x))
num: int
if (len(self.keyframes) == 0):
num = 0
elif (keyframe.time.x >= self.keyframes[-1].time.x):
num = len(self.keyframes)
else:
num = self.GetKeyframeIndex(keyframe.time.x) + 1
self.keyframes.insert(num, keyframe)
return num
def GetKeyframeIndex(self, time:float | int)-> int:
if(type(time) == float):
if (len(self.keyframes) > 0):
num: int = 0
if (self.keyframes[-1].time < float(time)):
num = len(self.keyframes)
while (num < len(self.keyframes) and self.keyframes[num].time < time):
num += 1
return num - 1
return -1
else:
return int(time)
class RawTrack(ResoTrack):
interval: resonite_types.float = 0
def __getattr__(self, name: str):
if name == "interval":
return self.Owner.interval.x
return self.__dict__[name]
def __init__(self, FrameType):
super().__init__(FrameType)
def write(self, data: BytesIO):
super().write(data)
self.interval.write(data)
for key in self.keyframes:
key.value.write(data)
def read(self, data:BytesIO):
super().read(data)
self.interval.read(data)
for key in self.keyframes:
key.value.read(data)
def addKeyframe(self, keyframe: KeyFrame) -> int:
num: int = super().addKeyframe(keyframe)
for i in range(0,len(self.keyframes)):
self.keyframes[i].time = i
return num
def removeKeyframe(self, time: float | int) -> bool:
success: bool = super().removeKeyframe(int(time))
for i in range(0,len(self.keyframes)):
self.keyframes[i].time = i
return success
class DiscreteTrack(ResoTrack):
def __init__(self, FrameType):
super().__init__(FrameType)
def write(self, data: BytesIO):
super().write(data)
def read(self, data:BytesIO):
super().read(data)
def addKeyframe(self, keyframe: KeyFrame) -> int:
num: int = super().addKeyframe(keyframe)
return num
def removeKeyframe(self, time: float | int) -> bool:
success: bool = super().removeKeyframe(time)
return success
class CurveTrack(ResoTrack):
interpolations: bool = False
tangents: bool = False
sharedinterpolation: resonite_types.int = -1
def __getattr__(self, name: str):
if name == "interpolations":
for key in self.keyframes:
if key.interpolation.x != self.sharedinterpolation.x:
return True
elif name == "tangents":
for key in self.keyframes:
if key.interpolation.x == 3 or key.interpolation.x == 4:
return True
return self.__dict__[name]
def __init__(self, FrameType):
super().__init__(FrameType)
def write(self, data: BytesIO):
super().write(data)
resonite_types.byte((1 if self.interpolations else 0) | (2 if self.tangents else 0)).write(data)
if(self.interpolations):
for key in self.keyframes:
key.interpolation.write(data)
else:
self.sharedinterpolation.write(data)
for key in self.keyframes:
key.value.write(data)
key.time.write(data)
if(self.tangents):
for key in self.keyframes:
key.left_tan.write(data)
key.right_tan.write(data)
def read(self, data:BytesIO):
super().read(data)
flags: int = struct.unpack("<B",data.read(1))
self.interpolations = flags & 1
self.tangents = flags & 2
if(self.interpolations):
for key in self.keyframes:
key.interpolation.read(data)
else:
self.sharedinterpolation.read(data)
for key in self.keyframes:
key.value.read(data)
key.time.read(data)
if(self.tangents):
for key in self.keyframes:
key.left_tan.read(data)
key.right_tan.read(data)
class BezierTrack(ResoTrack):
"""PLACE HOLDER CLASS, DO NOT USE"""
def __init__(self, FrameType):
super().__init__(FrameType)
"""PLACE HOLDER METHOD, DO NOT USE"""
#raise Exception("BezierTrack track type is unsupported in resonite's code")
def write(self, data: BytesIO):
"""PLACE HOLDER METHOD, DO NOT USE"""
raise Exception("BezierTrack track type is unsupported in resonite's code")
def read(self, data:BytesIO):
"""PLACE HOLDER METHOD, DO NOT USE"""
raise Exception("BezierTrack track type is unsupported in resonite's code")
def removeKeyframe(self, keyframe: KeyFrame) -> bool:
"""PLACE HOLDER METHOD, DO NOT USE"""
raise Exception("BezierTrack track type is unsupported in resonite's code")
def replaceKeyframe(self, keyframe: KeyFrame) -> bool:
"""PLACE HOLDER METHOD, DO NOT USE"""
raise Exception("BezierTrack track type is unsupported in resonite's code")
def addKeyframe(self, keyframe: KeyFrame) -> int:
"""PLACE HOLDER METHOD, DO NOT USE"""
raise Exception("BezierTrack track type is unsupported in resonite's code")
def GetKeyframeIndex(self, time:float)-> int:
"""PLACE HOLDER METHOD, DO NOT USE"""
raise Exception("BezierTrack track type is unsupported in resonite's code")
#This is weird, but thank you python - @989onan
TrackTypes: list[type[ResoTrack]] = [
RawTrack,
DiscreteTrack,
CurveTrack,
BezierTrack
]
#TODO: add all types here
#wooooo - @989onan
elementTypes: list[type[resonite_types.ResoType]] = [
resonite_types.bool,
resonite_types.bool2,
resonite_types.bool3,
resonite_types.bool4,
resonite_types.byte,
resonite_types.ushort,
resonite_types.uint,
resonite_types.ulong,
resonite_types.sbyte,
resonite_types.short,
resonite_types.int,
resonite_types.long,
resonite_types.int2,
resonite_types.int3,
resonite_types.int4,
resonite_types.uint2,
resonite_types.uint3,
resonite_types.uint4,
resonite_types.long2,
resonite_types.long3,
resonite_types.long4,
resonite_types.float,
resonite_types.float2,
resonite_types.float3,
resonite_types.float4,
resonite_types.floatQ,
resonite_types.float2x2,
resonite_types.float3x3,
resonite_types.float4x4,
resonite_types.double,
resonite_types.double2,
resonite_types.double3,
resonite_types.double4,
resonite_types.doubleQ,
resonite_types.double2x2,
resonite_types.double3x3,
resonite_types.double4x4,
resonite_types.color,
resonite_types.color32,
resonite_types.string
]
most_recent_AnimX_vers: int = 1
class AnimX():
"""
To use Raw Track properly, please set interval (seconds between frames) after reading/creating.\n
Represents data to be written to or read from an AnimX file.
"""
file_version: resonite_types.int = resonite_types.int()
track_amount: resonite_types.int = resonite_types.int()
global_duration: resonite_types.float = resonite_types.float()
name: resonite_types.string = resonite_types.string()
tracks: list[ResoTrack] = []
interval: resonite_types.float = resonite_types.float(1/25) #default value
def __init__(self):
pass
def read(self, file: str) -> bool:
"""
Takes an absolute file path and reads a binary animx file with it, and populates this class object with the data.
"""
with open(file, 'rb') as filecontents:
data: BytesIO = BytesIO(filecontents.read())
magic_word = common.ReadCSharp_str(data)
if magic_word != 'AnimX':
print("AnimX != "+magic_word)
return False
self.file_version.read(data)
if self.file_version.x > 1:
raise Exception("AnimX version is higher than the supported one")
self.track_amount.x = common.read7bitEncoded_ulong(data)
self.global_duration.read(data)
print(self.track_amount.x)
self.name.read(data)
match (struct.unpack('<B', data.read(1))[0]):
case 0:
pass
case 1:
from lz4.frame import decompress #why do you have to be a wheel? - @989onan
data = BytesIO(decompress(data.read()))
case 2:
import lzma#HALLLOOOYAH HALLOYAH!! - @989onan
filters = [{"id": "", "preset": lzma.PRESET_DEFAULT}]
data = BytesIO(lzma.decompress(data.read(), filters=filters))
case _:
raise Exception("Invalid encoding")
for i in range(0,self.track_amount.x):
trackType2: int = 0
num4: int = 0
if (self.file_version == 0):
b: ctypes.c_ubyte = ctypes.c_ubyte(struct.unpack('<B', data.read(1))[0])
num3: int = int(b & 1)
trackType: int = 0
if (num3 != 0):
if (num3 != 1):
raise Exception("[InvalidDataException]: Invalid track type data: " + str(b))
trackType = 2
else:
trackType = 0
trackType2 = trackType
num4 = b >> 1
else:
trackType2 = int(struct.unpack('<B', data.read(1))[0])
num4 = int(struct.unpack('<B', data.read(1))[0])
animationTrack: ResoTrack = AnimX.GetTrackType(trackType2, elementTypes[num4], data)
animationTrack.Owner = self
self.tracks.append(animationTrack)
return True
def write(self, file: str) -> bool:
"""
Takes an absolute file path and writes a binary animx file into it's contents, replacing them using this class's data.
"""
with open(file, 'rb') as filecontents:
data: BytesIO = BytesIO(filecontents)
common.WriteCSharp_str(data, 'AnimX')
self.file_version.x = most_recent_AnimX_vers #we wanna write an up to date file version type.
self.file_version.write(data)
self.track_amount.x = len(self.tracks)
common.write7bitEncoded_ulong(self.track_amount.x)
self.global_duration.write(data)
self.name.write(data)
data.write(struct.pack('<B', 0)) #default encoding, so we don't have to use lzma.
for i in range(0,self.track_amount.x):
data.write(struct.pack('<B', TrackTypes.index(type(self.tracks[i])))[0])
data.write(struct.pack('<B', elementTypes.index(self.tracks[i].FrameType)))
self.tracks[i].write(data)
return True
@classmethod
def GetTrackType(cls, trackType2: int, value_type: int, data: BytesIO) -> ResoTrack:
TrackType: type[ResoTrack] = TrackTypes[trackType2]
Track: ResoTrack = TrackType[elementTypes[value_type]](elementTypes[value_type])
Track.read(data)
return Track
+655
View File
@@ -0,0 +1,655 @@
import ctypes
import typing
from io import BytesIO
import struct
from . import common
class ResoType():
def __init__(self):
pass
def write(self, data: BytesIO):
pass
def read(cls, data: BytesIO):
pass
#These below are collection of the basic resonite typing made from C#. This is in order to store data in a sane way and decode/encode it.
class color(ResoType):
r: float = 0
g: float = 0
b: float = 0
a: float = 0
def __init__(self):
pass
def write(self, data: BytesIO):
data.write(struct.pack("<ffff", self.r, self.g, self.b, self.a))
def read(self,data):
self.r, self.g, self.b, self.a = struct.unpack("<ffff", data.read(4*4))[0]
class color32(ResoType):
r: int = 0
g: int = 0
b: int = 0
a: int = 0
def __init__(self):
pass
def write(self, data: BytesIO):
data.write(struct.pack("<BBBB", self.r, self.g, self.b, self.a))
def read(self,data):
self.r, self.g, self.b, self.a = struct.unpack("<BBBB", data.read(4))[0]
class string(ResoType):
x: str
def __str__(self) -> str:
return self.x
def __init__(self,value=""):
self.x = value
def write(self, data: BytesIO):
common.WriteCSharp_str(data,self.x)
def read(self,data):
self.x = common.ReadCSharp_str(data)
class byte(ResoType):
x: int = 0
def __int__(self):
return self.x
def __init__(self):
pass
def write(self, data: BytesIO):
data.write(struct.pack("<B", self.x))
def read(self,data):
self.x = struct.unpack("<B", data.read(1))[0]
class sbyte(ResoType):
x: int = 0
def __int__(self):
return self.x
def __init__(self,value=0):
self.x = value
def write(self, data: BytesIO):
data.write(struct.pack("<b", self.x))
def read(self,data):
self.x = struct.unpack("<b", data.read(1))[0]
class ushort(ResoType):
x: int = 0
def __int__(self):
return self.x
def __init__(self,value=0):
self.x = value
def write(self, data: BytesIO):
data.write(struct.pack("<H", self.x))
def read(self,data):
self.x = struct.unpack("<H", data.read(2))[0]
class short(ResoType):
x: int = 0
def __int__(self):
return self.x
def __init__(self):
pass
def write(self, data: BytesIO):
data.write(struct.pack("<h", self.x))
def read(self,data):
self.x = struct.unpack("<h", data.read(2))[0]
class bool(ResoType):
x: bool = False
def __bool__(self) -> bool:
return self.x
def __init__(self,value=False):
self.x = value
def write(self, data: BytesIO):
data.write(struct.pack("?", self.x))
def read(self,data):
self.x = struct.unpack("?", data.read(1))[0]
class bool2(bool):
y: bool = False
def __init__(self):
pass
def read(self,data: BytesIO):
byte: ctypes.c_ubyte = ctypes.c_ubyte(struct.unpack("<B",data.read(1))[0])
self.x = (byte & 1) > 0
self.y = (byte & 2) > 0
def createflags(self) -> ctypes.c_byte:
flags: ctypes.c_ubyte = ctypes.c_ubyte(0)
flags |= (1 if self.x else 0)
flags |= (2 if self.y else 0)
return flags
def write(self, data: BytesIO):
data.write(struct.pack("<B", self.createflags()))
class bool3(bool2):
z: bool = False
def __init__(self):
pass
def read(self,data):
byte: ctypes.c_ubyte = ctypes.c_ubyte(struct.unpack("<B",data.read(1))[0])
self.x = (byte & 1) > 0
self.y = (byte & 2) > 0
self.z = (byte & 4) > 0
def createflags(self) -> ctypes.c_byte:
flags: ctypes.c_ubyte = ctypes.c_ubyte(0)
flags |= (1 if self.x else 0)
flags |= (2 if self.y else 0)
flags |= (3 if self.z else 0)
return flags
def write(self, data: BytesIO):
data.write(struct.pack("<B", self.createflags()))
class bool4(bool3):
w: bool = False
def __init__(self):
pass
def read(self,data: BytesIO):
byte: ctypes.c_ubyte = ctypes.c_ubyte(struct.unpack("<B",data.read(1))[0])
self.x = (byte & 1) > 0
self.y = (byte & 2) > 0
self.z = (byte & 4) > 0
self.w = (byte & 8) > 0
def createflags(self) -> ctypes.c_ubyte:
flags: ctypes.c_ubyte = ctypes.c_ubyte(0)
flags |= (1 if self.x else 0)
flags |= (2 if self.y else 0)
flags |= (4 if self.z else 0)
flags |= (8 if self.w else 0)
return flags
def write(self, data: BytesIO):
data.write(struct.pack("<B", self.createflags()))
class int(ResoType):
x: int = 0
def __int__(self):
return self.x
def __init__(self,value=0):
self.x = value
def read(self,data: BytesIO):
self.x = struct.unpack("<i", data.read(4))[0]
def write(self, data: BytesIO):
data.write(struct.pack("<i", self.x))
class int2(int):
y: int = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().write(data)
self.y = struct.unpack("<i", data.read(4))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<i", self.y))
class int3(int2):
z: int = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().write(data)
self.z = struct.unpack("<i", data.read(4))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<i", self.z))
class int4(int3):
w: int = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().write(data)
self.w = struct.unpack("<i", data.read(4))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<i", self.w))
class uint(ResoType):
x: int = 0
def __int__(self):
return self.x
def __init__(self,value=0):
self.x = value
def read(self,data: BytesIO):
self.x = struct.unpack("<I", data.read(4))[0]
def write(self, data: BytesIO):
data.write(struct.pack("<I", self.x))
class uint2(uint):
y: int = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().write(data)
self.y = struct.unpack("<I", data.read(4))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<I", self.y))
class uint3(uint2):
z: int = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().write(data)
self.z = struct.unpack("<I", data.read(4))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<I", self.z))
class uint4(uint3):
w: int = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().write(data)
self.w = struct.unpack("<I", data.read(4))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<I", self.w))
class ulong(ResoType):
x: int = 0
def __int__(self):
return self.x
def __init__(self,value=0):
self.x = value
def read(self,data: BytesIO):
self.x = struct.unpack("<Q", data.read(8))[0]
def write(self, data: BytesIO):
data.write(struct.pack("<Q", self.x))
class long(ResoType):
x: int = 0
def __init__(self):
pass
def read(self,data: BytesIO):
self.x = struct.unpack("<q", data.read(8))[0]
def write(self, data: BytesIO):
data.write(struct.pack("<q", self.x))
class long2(long):
y: int = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().read(data)
self.y = struct.unpack("<q", data.read(8))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<q", self.y))
class long3(long2):
z: int = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().read(data)
self.z = struct.unpack("<q", data.read(8))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<q", self.z))
class long4(long3):
w: int = 0
def __init__(self):
pass
def __init__(self):
pass
def read(self,data: BytesIO):
super().read(data)
self.w = struct.unpack("<q", data.read(8))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<q", self.w))
class double(ResoType):
x: float = 0
def __float__(self):
return self.x
def __init__(self,value=0):
self.x = value
def read(self,data: BytesIO):
self.x = struct.unpack("<d", data.read(8))[0]
def write(self, data: BytesIO):
data.write(struct.pack("<d", self.x))
class double2(double):
y: float = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().read(data)
self.y = struct.unpack("<d", data.read(8))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<d", self.y))
class double3(double2):
z: float = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().read(data)
self.z = struct.unpack("<d", data.read(8))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<d", self.z))
class double4(double3):
w: float = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().read(data)
self.w = struct.unpack("<d", data.read(8))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<d", self.w))
class double2x2(ResoType):
m00: float = 0
m01: float = 0
m10: float = 0
m11: float = 0
def __init__(self):
pass
def read(self,data: BytesIO):
self.m00,self.m01,self.m10,self.m11 = struct.unpack("<dddd", data.read(8*(2*2)))
def write(self, data: BytesIO):
data.write(struct.pack("<dddd", self.m00,self.m01, self.m10,self.m11))
class double3x3(double2x2):
m02: float = 0
m12: float = 0
m22: float = 0
def __init__(self):
pass
def read(self,data: BytesIO):
self.m00,self.m01,self.m02,self.m10,self.m11,self.m12,self.m20,self.m21,self.m22 = struct.unpack("<ddddddddd", data.read(8*(3*3)))
def write(self, data: BytesIO):
data.write(struct.pack("<ddddddddd", self.m00,self.m01,self.m02,self.m10,self.m11,self.m12,self.m20,self.m21,self.m22))
class double4x4(double3x3):
m03: float = 0
m13: float = 0
m23: float = 0
m33: float = 0
def __init__(self):
pass
def read(self,data: BytesIO):
self.m00,self.m01,self.m02,self.m03,self.m10,self.m11,self.m12,self.m13,self.m20,self.m21,self.m22,self.m23,self.m30,self.m31,self.m32,self.m33 = struct.unpack("<dddddddddddddddd", data.read(8*(4*4)))
def write(self, data: BytesIO):
data.write(struct.pack("<dddddddddddddddd", self.m00,self.m01,self.m02,self.m03,self.m10,self.m11,self.m12,self.m13,self.m20,self.m21,self.m22,self.m23,self.m30,self.m31,self.m32,self.m33))
class doubleQ(double4):
def __init__(self):
pass
def write(self, data: BytesIO):
super().write(data)
@classmethod
def read(cls, data: BytesIO):
super().read(data)
class float(ResoType):
x: float = 0
def __float__(self):
return self.x
def __init__(self, value=0):
self.x = value
def read(self,data: BytesIO):
self.x = struct.unpack("<f", data.read(4))[0]
def write(self, data: BytesIO):
data.write(struct.pack("<f", self.x))
class float2(float):
y: float = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().read(data)
self.y = struct.unpack("<f", data.read(4))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<f", self.y))
class float3(float2):
z: float = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().read(data)
self.z = struct.unpack("<f", data.read(4))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<f", self.z))
class float4(float3):
w: float = 0
def __init__(self):
pass
def read(self,data: BytesIO):
super().read(data)
self.w = struct.unpack("<f", data.read(4))[0]
def write(self, data: BytesIO):
super().write(data)
data.write(struct.pack("<f", self.w))
class float2x2(ResoType):
m00: float = 0
m01: float = 0
m10: float = 0
m11: float = 0
def __init__(self):
pass
def read(self,data: BytesIO):
self.m00,self.m01,self.m10,self.m11 = struct.unpack("<ffff", data.read(4*(2*2)))
def write(self, data: BytesIO):
data.write(struct.pack("<ffff", self.m00,self.m01, self.m10,self.m11))
class float3x3(float2x2):
m02: float = 0
m12: float = 0
m22: float = 0
def __init__(self):
pass
def read(self,data: BytesIO):
self.m00,self.m01,self.m02,self.m10,self.m11,self.m12,self.m20,self.m21,self.m22 = struct.unpack("<fffffffff", data.read(4*(3*3)))
def write(self, data: BytesIO):
data.write(struct.pack("<fffffffff", self.m00,self.m01,self.m02,self.m10,self.m11,self.m12,self.m20,self.m21,self.m22))
class float4x4(float3x3):
m03: float = 0
m13: float = 0
m23: float = 0
m33: float = 0
def __init__(self):
pass
def read(self,data: BytesIO):
self.m00,self.m01,self.m02,self.m03,self.m10,self.m11,self.m12,self.m13,self.m20,self.m21,self.m22,self.m23,self.m30,self.m31,self.m32,self.m33 = struct.unpack("<ffffffffffffffff", data.read(4*(4*4)))
def write(self, data: BytesIO):
data.write(struct.pack("<ffffffffffffffff", self.m00,self.m01,self.m02,self.m03,self.m10,self.m11,self.m12,self.m13,self.m20,self.m21,self.m22,self.m23,self.m30,self.m31,self.m32,self.m33))
class floatQ(float4):
def __init__(self):
pass
def write(self, data: BytesIO):
super().write(data)
@classmethod
def read(cls, data: BytesIO):
super().read(data)