def __init__(self, reader: BinaryStream):
        if reader.version < Versions.VER_UE4_SUPPORT_32BIT_STATIC_MESH_INDICES:
            self.indices16 = reader.readBulkTArray(reader.readUInt16)
            self.indices32 = []
        else:
            is32bit = reader.readBool()
            data = bytearray(reader.readBulkTArray(reader.readInt8))

            tr = BinaryStream(data)
            tr.game = reader.game
            tr.version = reader.version

            if reader.game >= GAME_UE4(25):
                reader.readBool()

            if len(data) == 0:
                self.indices16 = []
                self.indices32 = []
                return

            if is32bit:
                count = int(len(data) / 4)
                self.indices32 = [tr.readUInt32() for _ in range(count)]
                self.indices16 = []
            else:
                count = int(len(data) / 2)
                self.indices16 = [tr.readUInt16() for _ in range(count)]
                self.indices32 = []
    def __init__(self, reader: BinaryStream):
        StripFlags = FStripDataFlags(
            reader, Versions.VER_UE4_STATIC_SKELETAL_MESH_SERIALIZATION_FIX)
        self.NumTexCoords = reader.readInt32()
        self.Strides = reader.readInt32() if reader.game < GAME_UE4(19) else -1

        self.NumVertices = reader.readInt32()
        self.UseFullPrecisionUVs = reader.readBool()
        self.UseHighPrecisionTangentBasis = reader.readBool(
        ) if reader.game >= GAME_UE4(12) else False

        if not StripFlags.isDataStrippedForServer():
            if reader.game < GAME_UE4(19):
                self.UV = reader.readTArray_W_Arg(
                    FStaticMeshUVItem().read, reader,
                    self.UseHighPrecisionTangentBasis, self.NumTexCoords,
                    self.UseFullPrecisionUVs)
            else:
                # reader.readBulkTArray()
                itemSize = reader.readInt32()
                itemCount = reader.readInt32()

                if itemCount != self.NumVertices:
                    raise ParserException(
                        f"{itemCount=} != {self.NumVertices=}")

                pos = reader.tell()
                self.UV = [
                    FStaticMeshUVItem().construct(
                        FStaticMeshUVItem().serialize_tangents(
                            reader, self.UseHighPrecisionTangentBasis), [])
                    for _ in range(self.NumVertices)
                ]

                if reader.tell() - pos != itemSize * itemCount:
                    raise ParserException(
                        f"Read incorrect amount of tangent bytes, at {reader.tell()}, should be: {pos + itemSize * itemCount} behind: {pos + (itemSize * itemCount) - pos}"
                    )

                itemSize = reader.readInt32()
                itemCount = reader.readInt32()
                if itemCount != self.NumVertices * self.NumTexCoords:
                    raise ParserException(
                        f"{itemCount=} != NumVertices * NumTexCoords = {self.NumVertices * self.NumTexCoords}"
                    )

                pos = reader.tell()
                for i in range(self.NumVertices):
                    self.UV[i].UV = FStaticMeshUVItem().serialize_texcoords(
                        reader, self.NumTexCoords, self.UseFullPrecisionUVs)

                if reader.tell() - pos != itemSize * itemCount:
                    raise ParserException(
                        f"Read incorrect amount of Texture Coordinate bytes, at {reader.tell()}, should be: {pos + itemSize * itemCount} behind: {pos + (itemSize * itemCount) - pos}"
                    )
        else:
            self.UV = []
Example #3
0
 def __init__(self, reader: BinaryStream):
     self.MaterialIndex = reader.readInt32()
     self.FirstIndex = reader.readInt32()
     self.NumTriangles = reader.readInt32()
     self.MinVertexIndex = reader.readInt32()
     self.MaxVertexIndex = reader.readInt32()
     self.EnableCollision = reader.readBool()
     self.CastShadow = reader.readBool()
     self.ForceOpaque = reader.readBool() if FRenderingObjectVersion().get(reader) >= FRenderingObjectVersion.StaticMeshSectionForceOpaqueField else False
     self.VisibleInRayTracing = reader.readBool() if reader.game >= EUEVersion.GAME_UE4_26 else False
Example #4
0
    def __init__(self, reader: BinaryStream):
        self.stripFlags = FStripDataFlags(reader)
        self.sections = reader.readTArray_W_Arg(FStaticMeshSection, reader)
        self.maxDeviation = reader.readFloat()

        if reader.game < GAME_UE4(23):
            if not self.stripFlags.isDataStrippedForServer(
            ) and not self.stripFlags.isClassDataStripped(CDSF_MinLodData):
                self.serializeBuffer_legacy(reader)
            return

        self.is_lod_cooked_out = reader.readBool()
        self.inlined = reader.readBool()

        if not self.stripFlags.isDataStrippedForServer(
        ) and not self.is_lod_cooked_out:
            pos = reader.tellfake()
            if self.inlined:
                self.serializeBuffer(reader)
            else:
                bulk: FByteBulkData = FByteBulkData(
                    reader,
                    ubulk=reader.ubulk_stream,
                    bulkOffset=reader.PackageReader.PackageFileSummary.
                    BulkDataStartOffset)
                if bulk.Header.ElementCount > 0:
                    tr = BinaryStream(bulk.Data)
                    tr.game = reader.game
                    tr.version = reader.version
                    self.serializeBuffer(tr)

                reader.readUInt32()  # DepthOnlyNumTriangles
                reader.readUInt32()  # PackedData
                reader.seek(4 * 4 + 2 * 4 + 2 * 4 + 6 * (2 * 4), 1)
                """
                            StaticMeshVertexBuffer = 2x int32, 2x bool
                            PositionVertexBuffer = 2x int32
                            ColorVertexBuffer = 2x int32
                            IndexBuffer = int32 + bool
                            ReversedIndexBuffer
                            DepthOnlyIndexBuffer
                            ReversedDepthOnlyIndexBuffer
                            WireframeIndexBuffer
                            AdjacencyIndexBuffer
                """
        # FStaticMeshBuffersSize
        reader.readUInt32()  # SerializedBuffersSize
        reader.readUInt32()  # DepthOnlyIBSize
        reader.readUInt32()  # ReversedIBsSize
Example #5
0
 def __init__(self, reader: BinaryStream):
     super().__init__()
     if reader.game >= GAME_UE4(16):
         self.CompressedDistanceFieldVolume = reader.readTArray(
             reader.readByteToInt)
         self.Size = FIntVector(reader)
         self.LocalBoundingBox = FBox(reader)
         self.DistanceMinMax = FVector(reader)
         self.MeshWasClosed = reader.readBool()
         self.BuiltAsIfTwoSided = reader.readBool()
         self.MeshwasPlane = reader.readBool()
         self.DistanceFieldVolume = []
     else:
         self.DistanceFieldVolume = reader.readTArray(reader.readUInt16)
         self.Size = FIntVector(reader)
         self.LocalBoundingBox = FBox(reader)
         self.MeshWasClosed = reader.readBool()
         self.BuiltAsIfTwoSided = reader.readBool(
         ) if reader.version >= Versions.VER_UE4_RENAME_CROUCHMOVESCHARACTERDOWN else False
         self.MeshwasPlane = reader.readBool(
         ) if reader.version >= Versions.VER_UE4_DEPRECATE_UMG_STYLE_ASSETS else False
         self.CompressedDistanceFieldVolume = []
         self.DistanceMinMax = FVector2D().construct(0, 0)
Example #6
0
 def __init__(self, reader: BinaryStream):
     super().__init__()
     self.Cooked = reader.readBool()
     self.Value = reader.readFloat()
Example #7
0
 def __init__(self, reader: BinaryStream) -> None:
     if reader.readBool():
         self.CultureInvariantString = reader.readFString()
Example #8
0
 def __init__(self, reader: BinaryStream):
     self.bInitialized = reader.readBool()
     self.bOverrideDensities = reader.readBool()
     self.LocalUVDensities = [
         reader.readFloat() for _ in range(TEXSTREAM_MAX_NUM_UVCHANNELS)
     ]