diff --git a/rbproto/python/shot_pb2.py b/rbproto/python/shot_pb2.py index a216881..ed7cac0 100644 --- a/rbproto/python/shot_pb2.py +++ b/rbproto/python/shot_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\nshot.proto\x12\x0fserialized_shot"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection"\xfc\x01\n\rCollisionInfo\x12\x0e\n\x06source\x18\x01 \x01(\r\x12M\n\x10\x62\x61ll_identifiers\x18\x02 \x03(\x0b\x32\x33.serialized_shot.CollisionInfo.BallIdentifiersEntry\x12\x17\n\x0fwall_identifier\x18\x03 \x01(\r\x12\x13\n\x0b\x66rame_index\x18\x04 \x01(\r\x12\x0e\n\x06static\x18\x05 \x01(\x08\x1aN\n\x14\x42\x61llIdentifiersEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.serialized_shot.Point:\x02\x38\x01"\xcc\x02\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x12\x32\n\nstart_info\x18\x07 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfo\x12\x30\n\x08\x65nd_info\x18\x08 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfoB\x13\n\x11\x64\x65tection_history"R\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path"\xf4\x01\n\x12KeyBallIdentifiers\x12\x10\n\x08\x63ue_ball\x18\x01 \x01(\r\x12\x13\n\x0bobject_ball\x18\x02 \x01(\r\x12\x13\n\x0btarget_ball\x18\x03 \x01(\r\x12\x18\n\x10\x63ontact_sequence\x18\x04 \x03(\r\x12\x18\n\x0b\x63ue_ball_id\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x0eobject_ball_id\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0etarget_ball_id\x18\x07 \x01(\rH\x02\x88\x01\x01\x42\x0e\n\x0c_cue_ball_idB\x11\n\x0f_object_ball_idB\x11\n\x0f_target_ball_id"\xa8\x01\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32".serialized_shot.IdentifierHistory\x12\x36\n\tkey_balls\x18\x04 \x01(\x0b\x32#.serialized_shot.KeyBallIdentifiers\x12\x13\n\x0bstart_index\x18\x05 \x01(\r\x12\x11\n\tend_index\x18\x06 \x01(\rb\x06proto3' + b'\n\nshot.proto\x12\x0fserialized_shot"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection"\xfc\x01\n\rCollisionInfo\x12\x0e\n\x06source\x18\x01 \x01(\r\x12M\n\x10\x62\x61ll_identifiers\x18\x02 \x03(\x0b\x32\x33.serialized_shot.CollisionInfo.BallIdentifiersEntry\x12\x17\n\x0fwall_identifier\x18\x03 \x01(\r\x12\x13\n\x0b\x66rame_index\x18\x04 \x01(\r\x12\x0e\n\x06static\x18\x05 \x01(\x08\x1aN\n\x14\x42\x61llIdentifiersEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.serialized_shot.Point:\x02\x38\x01"\xcc\x02\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x12\x32\n\nstart_info\x18\x07 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfo\x12\x30\n\x08\x65nd_info\x18\x08 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfoB\x13\n\x11\x64\x65tection_history"I\n\x0c\x43olorCluster\x12\x11\n\tlightness\x18\x01 \x01(\x02\x12\t\n\x01\x61\x18\x02 \x01(\x02\x12\t\n\x01\x62\x18\x03 \x01(\x02\x12\x10\n\x08\x66raction\x18\x04 \x01(\x02"B\n\x0fTrajectoryColor\x12/\n\x08\x63lusters\x18\x01 \x03(\x0b\x32\x1d.serialized_shot.ColorCluster"\x8e\x01\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path\x12:\n\x10trajectory_color\x18\x03 \x01(\x0b\x32 .serialized_shot.TrajectoryColor"\xf4\x01\n\x12KeyBallIdentifiers\x12\x10\n\x08\x63ue_ball\x18\x01 \x01(\r\x12\x13\n\x0bobject_ball\x18\x02 \x01(\r\x12\x13\n\x0btarget_ball\x18\x03 \x01(\r\x12\x18\n\x10\x63ontact_sequence\x18\x04 \x03(\r\x12\x18\n\x0b\x63ue_ball_id\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x0eobject_ball_id\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0etarget_ball_id\x18\x07 \x01(\rH\x02\x88\x01\x01\x42\x0e\n\x0c_cue_ball_idB\x11\n\x0f_object_ball_idB\x11\n\x0f_target_ball_id"\xa8\x01\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32".serialized_shot.IdentifierHistory\x12\x36\n\tkey_balls\x18\x04 \x01(\x0b\x32#.serialized_shot.KeyBallIdentifiers\x12\x13\n\x0bstart_index\x18\x05 \x01(\r\x12\x11\n\tend_index\x18\x06 \x01(\rb\x06proto3' ) _globals = globals() @@ -41,10 +41,14 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._serialized_end = 745 _globals["_PATH"]._serialized_start = 748 _globals["_PATH"]._serialized_end = 1080 - _globals["_IDENTIFIERHISTORY"]._serialized_start = 1082 - _globals["_IDENTIFIERHISTORY"]._serialized_end = 1164 - _globals["_KEYBALLIDENTIFIERS"]._serialized_start = 1167 - _globals["_KEYBALLIDENTIFIERS"]._serialized_end = 1411 - _globals["_SHOT"]._serialized_start = 1414 - _globals["_SHOT"]._serialized_end = 1582 + _globals["_COLORCLUSTER"]._serialized_start = 1082 + _globals["_COLORCLUSTER"]._serialized_end = 1155 + _globals["_TRAJECTORYCOLOR"]._serialized_start = 1157 + _globals["_TRAJECTORYCOLOR"]._serialized_end = 1223 + _globals["_IDENTIFIERHISTORY"]._serialized_start = 1226 + _globals["_IDENTIFIERHISTORY"]._serialized_end = 1368 + _globals["_KEYBALLIDENTIFIERS"]._serialized_start = 1371 + _globals["_KEYBALLIDENTIFIERS"]._serialized_end = 1615 + _globals["_SHOT"]._serialized_start = 1618 + _globals["_SHOT"]._serialized_end = 1786 # @@protoc_insertion_point(module_scope) diff --git a/rbproto/python/shot_pb2.pyi b/rbproto/python/shot_pb2.pyi index f149ece..41202e1 100644 --- a/rbproto/python/shot_pb2.pyi +++ b/rbproto/python/shot_pb2.pyi @@ -160,16 +160,45 @@ class Path(_message.Message): end_info: _Optional[_Union[CollisionInfo, _Mapping]] = ..., ) -> None: ... +class ColorCluster(_message.Message): + __slots__ = ["lightness", "a", "b", "fraction"] + LIGHTNESS_FIELD_NUMBER: _ClassVar[int] + A_FIELD_NUMBER: _ClassVar[int] + B_FIELD_NUMBER: _ClassVar[int] + FRACTION_FIELD_NUMBER: _ClassVar[int] + lightness: float + a: float + b: float + fraction: float + def __init__( + self, + lightness: _Optional[float] = ..., + a: _Optional[float] = ..., + b: _Optional[float] = ..., + fraction: _Optional[float] = ..., + ) -> None: ... + +class TrajectoryColor(_message.Message): + __slots__ = ["clusters"] + CLUSTERS_FIELD_NUMBER: _ClassVar[int] + clusters: _containers.RepeatedCompositeFieldContainer[ColorCluster] + def __init__( + self, clusters: _Optional[_Iterable[_Union[ColorCluster, _Mapping]]] = ... + ) -> None: ... + class IdentifierHistory(_message.Message): - __slots__ = ["ball_identifier", "paths"] + __slots__ = ["ball_identifier", "paths", "trajectory_color"] BALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int] PATHS_FIELD_NUMBER: _ClassVar[int] + TRAJECTORY_COLOR_FIELD_NUMBER: _ClassVar[int] ball_identifier: int paths: _containers.RepeatedCompositeFieldContainer[Path] + trajectory_color: TrajectoryColor def __init__( self, ball_identifier: _Optional[int] = ..., paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ..., + trajectory_color: _Optional[_Union[TrajectoryColor, _Mapping]] = ..., ) -> None: ... class KeyBallIdentifiers(_message.Message): diff --git a/rbproto/shot.proto b/rbproto/shot.proto index a4746c0..7e17a76 100644 --- a/rbproto/shot.proto +++ b/rbproto/shot.proto @@ -50,9 +50,21 @@ message Path { CollisionInfo end_info = 8; } +message ColorCluster { + // LAB in OpenCV's 0-255 uint8 scale (see railbird LABCV2Color). + float lightness = 1; + float a = 2; + float b = 3; + // Share of this ball's accumulated color pixels in this cluster (0-1). + float fraction = 4; +} + +message TrajectoryColor { repeated ColorCluster clusters = 1; } + message IdentifierHistory { uint32 ball_identifier = 1; repeated Path paths = 2; + TrajectoryColor trajectory_color = 3; } message KeyBallIdentifiers { uint32 cue_ball = 1; diff --git a/rbproto/ts/shot.ts b/rbproto/ts/shot.ts index de70d5f..031ef45 100644 --- a/rbproto/ts/shot.ts +++ b/rbproto/ts/shot.ts @@ -740,9 +740,158 @@ function _decodePath(bb: ByteBuffer): Path { return message; } +export interface ColorCluster { + lightness?: number; + a?: number; + b?: number; + fraction?: number; +} + +export function encodeColorCluster(message: ColorCluster): Uint8Array { + let bb = popByteBuffer(); + _encodeColorCluster(message, bb); + return toUint8Array(bb); +} + +function _encodeColorCluster(message: ColorCluster, bb: ByteBuffer): void { + // optional float lightness = 1; + let $lightness = message.lightness; + if ($lightness !== undefined) { + writeVarint32(bb, 13); + writeFloat(bb, $lightness); + } + + // optional float a = 2; + let $a = message.a; + if ($a !== undefined) { + writeVarint32(bb, 21); + writeFloat(bb, $a); + } + + // optional float b = 3; + let $b = message.b; + if ($b !== undefined) { + writeVarint32(bb, 29); + writeFloat(bb, $b); + } + + // optional float fraction = 4; + let $fraction = message.fraction; + if ($fraction !== undefined) { + writeVarint32(bb, 37); + writeFloat(bb, $fraction); + } +} + +export function decodeColorCluster(binary: Uint8Array): ColorCluster { + return _decodeColorCluster(wrapByteBuffer(binary)); +} + +function _decodeColorCluster(bb: ByteBuffer): ColorCluster { + let message: ColorCluster = {} as any; + + end_of_message: while (!isAtEnd(bb)) { + let tag = readVarint32(bb); + + switch (tag >>> 3) { + case 0: + break end_of_message; + + // optional float lightness = 1; + case 1: { + message.lightness = readFloat(bb); + break; + } + + // optional float a = 2; + case 2: { + message.a = readFloat(bb); + break; + } + + // optional float b = 3; + case 3: { + message.b = readFloat(bb); + break; + } + + // optional float fraction = 4; + case 4: { + message.fraction = readFloat(bb); + break; + } + + default: + skipUnknownField(bb, tag & 7); + } + } + + return message; +} + +export interface TrajectoryColor { + clusters?: ColorCluster[]; +} + +export function encodeTrajectoryColor(message: TrajectoryColor): Uint8Array { + let bb = popByteBuffer(); + _encodeTrajectoryColor(message, bb); + return toUint8Array(bb); +} + +function _encodeTrajectoryColor( + message: TrajectoryColor, + bb: ByteBuffer, +): void { + // repeated ColorCluster clusters = 1; + let array$clusters = message.clusters; + if (array$clusters !== undefined) { + for (let value of array$clusters) { + writeVarint32(bb, 10); + let nested = popByteBuffer(); + _encodeColorCluster(value, nested); + writeVarint32(bb, nested.limit); + writeByteBuffer(bb, nested); + pushByteBuffer(nested); + } + } +} + +export function decodeTrajectoryColor(binary: Uint8Array): TrajectoryColor { + return _decodeTrajectoryColor(wrapByteBuffer(binary)); +} + +function _decodeTrajectoryColor(bb: ByteBuffer): TrajectoryColor { + let message: TrajectoryColor = {} as any; + + end_of_message: while (!isAtEnd(bb)) { + let tag = readVarint32(bb); + + switch (tag >>> 3) { + case 0: + break end_of_message; + + // repeated ColorCluster clusters = 1; + case 1: { + let limit = pushTemporaryLength(bb); + let values = message.clusters || (message.clusters = []); + values.push(_decodeColorCluster(bb)); + bb.limit = limit; + break; + } + + default: + skipUnknownField(bb, tag & 7); + } + } + + return message; +} + export interface IdentifierHistory { ball_identifier?: number; paths?: Path[]; + trajectory_color?: TrajectoryColor; } export function encodeIdentifierHistory( @@ -776,6 +925,17 @@ function _encodeIdentifierHistory( pushByteBuffer(nested); } } + + // optional TrajectoryColor trajectory_color = 3; + let $trajectory_color = message.trajectory_color; + if ($trajectory_color !== undefined) { + writeVarint32(bb, 26); + let nested = popByteBuffer(); + _encodeTrajectoryColor($trajectory_color, nested); + writeVarint32(bb, nested.limit); + writeByteBuffer(bb, nested); + pushByteBuffer(nested); + } } export function decodeIdentifierHistory(binary: Uint8Array): IdentifierHistory { @@ -807,6 +967,14 @@ function _decodeIdentifierHistory(bb: ByteBuffer): IdentifierHistory { break; } + // optional TrajectoryColor trajectory_color = 3; + case 3: { + let limit = pushTemporaryLength(bb); + message.trajectory_color = _decodeTrajectoryColor(bb); + bb.limit = limit; + break; + } + default: skipUnknownField(bb, tag & 7); }