test_custom_writable.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from panda3d.core import TypeRegistry, TypedWritable
  2. from panda3d.core import DatagramBuffer, BamReader, BamWriter
  3. import sys
  4. class CustomObject(TypedWritable):
  5. def __init__(self):
  6. self.field = 0
  7. def get_class_type():
  8. registry = TypeRegistry.ptr()
  9. handle = registry.register_dynamic_type("CustomObject")
  10. registry.record_derivation(handle, TypedWritable)
  11. return handle
  12. def write_datagram(self, writer, dg):
  13. dg.add_uint8(self.field)
  14. def fillin(self, scan, reader):
  15. self.field = scan.get_uint8()
  16. @staticmethod
  17. def make_from_bam(scan, reader):
  18. obj = CustomObject()
  19. obj.fillin(scan, reader)
  20. return obj
  21. BamReader.register_factory(CustomObject.get_class_type(), CustomObject.make_from_bam)
  22. def test_typed_writable_subclass():
  23. obj = CustomObject()
  24. obj.field = 123
  25. base_rc = sys.getrefcount(obj)
  26. assert obj.get_type() == CustomObject.get_class_type()
  27. assert obj.type == CustomObject.get_class_type()
  28. buf = DatagramBuffer()
  29. writer = BamWriter(buf)
  30. writer.init()
  31. writer.write_object(obj)
  32. del writer
  33. reader = BamReader(buf)
  34. reader.init()
  35. obj = reader.read_object()
  36. assert sys.getrefcount(obj) == base_rc + 1
  37. reader.resolve()
  38. del reader
  39. assert sys.getrefcount(obj) == base_rc
  40. assert obj.field == 123