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 = []
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
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
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)
def __init__(self, reader: BinaryStream): super().__init__() self.Cooked = reader.readBool() self.Value = reader.readFloat()
def __init__(self, reader: BinaryStream) -> None: if reader.readBool(): self.CultureInvariantString = reader.readFString()
def __init__(self, reader: BinaryStream): self.bInitialized = reader.readBool() self.bOverrideDensities = reader.readBool() self.LocalUVDensities = [ reader.readFloat() for _ in range(TEXSTREAM_MAX_NUM_UVCHANNELS) ]