# automatically generated by the FlatBuffers compiler, do not modify

# namespace: a

import flatbuffers
from flatbuffers.compat import import_numpy
np = import_numpy()

class Mat3(object):
    __slots__ = ['_tab']

    @classmethod
    def SizeOf(cls):
        return 36

    # Mat3
    def Init(self, buf, pos):
        self._tab = flatbuffers.table.Table(buf, pos)

    # Mat3
    def R(self, i):
        from a.Vec3 import Vec3

        obj = Vec3()
        obj.Init(self._tab.Bytes, self._tab.Pos + 0 + i * 12)
        return obj

    # Mat3
    def RLength(self):
        return 3

    # Mat3
    def RIsNone(self):
        return False


def CreateMat3(builder, r_v):
    builder.Prep(4, 36)
    for _idx0 in range(3 , 0, -1):
        builder.Prep(4, 12)
        for _idx1 in range(3 , 0, -1):
            builder.PrependFloat32(r_v[_idx0-1][_idx1-1])
    return builder.Offset()

import a.Vec3
try:
    from typing import List
except:
    pass

class Mat3T(object):

    # Mat3T
    def __init__(self):
        self.r = None  # type: List[a.Vec3.Vec3T]

    @classmethod
    def InitFromBuf(cls, buf, pos):
        mat3 = Mat3()
        mat3.Init(buf, pos)
        return cls.InitFromObj(mat3)

    @classmethod
    def InitFromPackedBuf(cls, buf, pos=0):
        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, pos)
        return cls.InitFromBuf(buf, pos+n)

    @classmethod
    def InitFromObj(cls, mat3):
        x = Mat3T()
        x._UnPack(mat3)
        return x

    # Mat3T
    def _UnPack(self, mat3):
        if mat3 is None:
            return
        if not mat3.RIsNone():
            self.r = []
            for i in range(mat3.RLength()):
                if mat3.R(i) is None:
                    self.r.append(None)
                else:
                    vec3_ = a.Vec3.Vec3T.InitFromObj(mat3.R(i))
                    self.r.append(vec3_)

    # Mat3T
    def Pack(self, builder):
        return CreateMat3(builder, self.r.v)
