def read_object(self, expected_type_reader=None, type_params=None, expected_type=None): type_id = self.read_7bit_encoded_int() if type_id == 0: # null object return None try: type_reader = self.type_readers[type_id - 1] except IndexError: raise ReaderError("type id out of range: {} > {}".format( type_id, len(self.type_readers))) if expected_type_reader is not None: try: if expected_type_reader.is_generic_type and expected_type_reader.target_type is None: expected_type = generic_reader_type( expected_type_reader, type_params) elif expected_type_reader.is_enum_type: expected_type = generic_reader_type( EnumReader, [expected_type_reader.target_type]) else: expected_type = expected_type_reader.target_type except AttributeError: raise ReaderError("bad expected_type_reader: '{}'".format( expected_type_reader)) if expected_type is not None: if type_reader.target_type != expected_type: raise ReaderError("Unexpected type: '{}' != '{}'".format( type_reader.target_type, expected_type)) return type_reader.read()
def read(self): if self.file_platform == PLATFORM_WINDOWS: name = self.stream.read_string() cubemap = self.stream.read_object(Texture2DReader) size = self.stream.read_vector3() geometry = self.stream.read_object( ShaderInstancedIndexedPrimitivesReader, [VertexPositionNormalTextureInstanceReader, MatrixReader]) actor_type = self.stream.read_object(ActorTypeReader) no_silhouette = self.stream.read_boolean() return ArtObjectPC(name, cubemap, size, geometry, actor_type, no_silhouette) else: name = self.stream.read_string() cubemap_path = self.stream.read_string() size = self.stream.read_vector3() geometry = self.stream.read_object( ShaderInstancedIndexedPrimitivesReader, [VertexPositionNormalTextureInstanceReader, MatrixReader]) actor_type = self.stream.read_object(ActorTypeReader) no_silhouette = self.stream.read_boolean() laser_outlets = self.stream.read_object( ReflectiveReader, [generic_reader_type(SetReader, [FaceOrientationReader])]) return ArtObject(name, cubemap_path, size, geometry, actor_type, no_silhouette, laser_outlets)
def read_object(self, expected_type_reader=None, type_params=None, expected_type=None): type_id = self.read_7bit_encoded_int() if type_id == 0: # null object return None try: type_reader = self.type_readers[type_id - 1] except IndexError: raise ReaderError("type id out of range: {} > {}".format( type_id, len(self.type_readers))) if expected_type_reader is not None: try: if expected_type_reader.is_generic_type and expected_type_reader.target_type is None: expected_type = generic_reader_type( expected_type_reader, type_params) elif expected_type_reader.is_enum_type: expected_type = generic_reader_type( EnumReader, [expected_type_reader.target_type]) else: expected_type = expected_type_reader.target_type except AttributeError: raise ReaderError("bad expected_type_reader: '{}'".format( expected_type_reader)) if expected_type is not None: if expected_type != 'System.Object': if type_reader.target_type != expected_type: # check parent type readers for cls in type_reader.__class__.__mro__: if hasattr(cls, 'target_type'): if cls.target_type == expected_type: break else: raise ReaderError( "Unexpected type: '{}' != '{}'".format( type_reader.target_type, expected_type)) return type_reader.read()
def read_object(self, expected_type_reader=None, type_params=None, expected_type=None): type_id = self.read_7bit_encoded_int() if type_id == 0: # null object return None try: type_reader = self.type_readers[type_id - 1] except IndexError: raise ReaderError("type id out of range: {} > {}".format(type_id, len(self.type_readers))) if expected_type_reader is not None: try: if expected_type_reader.is_generic_type and expected_type_reader.target_type is None: expected_type = generic_reader_type(expected_type_reader, type_params) elif expected_type_reader.is_enum_type: expected_type = generic_reader_type(EnumReader, [expected_type_reader.target_type]) else: expected_type = expected_type_reader.target_type except AttributeError: raise ReaderError("bad expected_type_reader: '{}'".format(expected_type_reader)) if expected_type is not None: if type_reader.target_type != expected_type: raise ReaderError("Unexpected type: '{}' != '{}'".format(type_reader.target_type, expected_type)) return type_reader.read()
def read(self): if self.file_platform == PLATFORM_WINDOWS: name = self.stream.read_string() cubemap = self.stream.read_object(Texture2DReader) size = self.stream.read_vector3() geometry = self.stream.read_object(ShaderInstancedIndexedPrimitivesReader, [VertexPositionNormalTextureInstanceReader, MatrixReader]) actor_type = self.stream.read_object(ActorTypeReader) no_silhouette = self.stream.read_boolean() return ArtObjectPC(name, cubemap, size, geometry, actor_type, no_silhouette) else: name = self.stream.read_string() cubemap_path = self.stream.read_string() size = self.stream.read_vector3() geometry = self.stream.read_object(ShaderInstancedIndexedPrimitivesReader, [VertexPositionNormalTextureInstanceReader, MatrixReader]) actor_type = self.stream.read_object(ActorTypeReader) no_silhouette = self.stream.read_boolean() laser_outlets = self.stream.read_object(ReflectiveReader, [generic_reader_type(SetReader, [FaceOrientationReader])]) return ArtObject(name, cubemap_path, size, geometry, actor_type, no_silhouette, laser_outlets)