import { types } from "mobx-state-tree";
|
|
import NormalizationMixin from "../mixins/Normalization";
|
import RegionsMixin from "../mixins/Regions";
|
import Registry from "../core/Registry";
|
import { AreaMixin } from "../mixins/AreaMixin";
|
import { onlyProps, VideoRegion } from "./VideoRegion";
|
import { interpolateProp } from "../utils/props";
|
|
const Model = types
|
.model("VideoRectangleRegionModel", {
|
type: "videorectangleregion",
|
})
|
.volatile(() => ({
|
props: ["x", "y", "width", "height", "rotation"],
|
}))
|
.views((self) => ({
|
getShape(frame) {
|
let prev;
|
let next;
|
|
for (const item of self.sequence) {
|
if (item.frame === frame) {
|
return onlyProps(self.props, item);
|
}
|
|
if (item.frame > frame) {
|
next = item;
|
break;
|
}
|
prev = item;
|
}
|
|
if (!prev) return null;
|
if (!next) return onlyProps(self.props, prev);
|
|
return Object.fromEntries(self.props.map((prop) => [prop, interpolateProp(prev, next, frame, prop)]));
|
},
|
|
getVisibility() {
|
return true;
|
},
|
}))
|
.actions((self) => ({
|
updateShape(data, frame) {
|
const newItem = {
|
...data,
|
frame,
|
enabled: true,
|
};
|
|
const kp = self.closestKeypoint(frame);
|
const index = self.sequence.findIndex((item) => item.frame >= frame);
|
|
if (index < 0) {
|
self.sequence = [...self.sequence, newItem];
|
} else {
|
const keypoint = {
|
...(self.sequence[index] ?? {}),
|
...data,
|
enabled: kp?.enabled ?? true,
|
frame,
|
};
|
|
self.sequence = [
|
...self.sequence.slice(0, index),
|
keypoint,
|
...self.sequence.slice(index + (self.sequence[index].frame === frame)),
|
];
|
}
|
},
|
}));
|
|
const VideoRectangleRegionModel = types.compose(
|
"VideoRectangleRegionModel",
|
RegionsMixin,
|
VideoRegion,
|
AreaMixin,
|
NormalizationMixin,
|
Model,
|
);
|
|
Registry.addRegionType(VideoRectangleRegionModel, "video");
|
|
export { VideoRectangleRegionModel };
|