Add parse to obj function & Bind clip recoder & loader event #51
@ -174,11 +174,13 @@ class Status extends Emitter<IStatusEvent> {
|
|||||||
this.emit("objectChange");
|
this.emit("objectChange");
|
||||||
this.emit("labelChange");
|
this.emit("labelChange");
|
||||||
this.emit("behaviorChange");
|
this.emit("behaviorChange");
|
||||||
|
this.emit("clipChange");
|
||||||
|
|
||||||
// 清除焦点对象
|
// 清除焦点对象
|
||||||
this.setBehaviorObject();
|
this.setBehaviorObject();
|
||||||
this.setFocusObject(new Set());
|
this.setFocusObject(new Set());
|
||||||
this.setLabelObject();
|
this.setLabelObject();
|
||||||
|
this.setClipObject();
|
||||||
|
|
||||||
// 映射
|
// 映射
|
||||||
this.emit("fileLoad");
|
this.emit("fileLoad");
|
||||||
@ -196,11 +198,13 @@ class Status extends Emitter<IStatusEvent> {
|
|||||||
this.on("objectChange", handelFileChange);
|
this.on("objectChange", handelFileChange);
|
||||||
this.on("behaviorChange", handelFileChange);
|
this.on("behaviorChange", handelFileChange);
|
||||||
this.on("labelChange", handelFileChange);
|
this.on("labelChange", handelFileChange);
|
||||||
|
this.on("clipChange", handelFileChange);
|
||||||
this.on("individualChange", handelFileChange);
|
this.on("individualChange", handelFileChange);
|
||||||
this.on("groupAttrChange", handelFileChange);
|
this.on("groupAttrChange", handelFileChange);
|
||||||
this.on("rangeAttrChange", handelFileChange);
|
this.on("rangeAttrChange", handelFileChange);
|
||||||
this.on("labelAttrChange", handelFileChange);
|
this.on("labelAttrChange", handelFileChange);
|
||||||
this.on("behaviorAttrChange", handelFileChange);
|
this.on("behaviorAttrChange", handelFileChange);
|
||||||
|
this.on("clipAttrChange", handelFileChange);
|
||||||
this.on("fileChange", () => this.archive.emit("fileChange"));
|
this.on("fileChange", () => this.archive.emit("fileChange"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ interface IDrawCommand {
|
|||||||
type: "points" | "cube";
|
type: "points" | "cube";
|
||||||
id: string;
|
id: string;
|
||||||
data?: Float32Array;
|
data?: Float32Array;
|
||||||
|
mapId?: number[];
|
||||||
position?: number[];
|
position?: number[];
|
||||||
radius?: number[];
|
radius?: number[];
|
||||||
parameter?: IAnyObject;
|
parameter?: IAnyObject;
|
||||||
@ -143,7 +144,7 @@ class Clip {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
public isArrayEqual(a1?: number[], a2?: number[]): boolean {
|
public isArrayEqual(a1?: Array<number | string>, a2?: Array<number | string>): boolean {
|
||||||
|
|
||||||
if ((a1 && !a2) || (!a1 && a2)) {
|
if ((a1 && !a2) || (!a1 && a2)) {
|
||||||
return false;
|
return false;
|
||||||
@ -179,6 +180,26 @@ class Clip {
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ID 映射
|
||||||
|
*/
|
||||||
|
private sorterIdMapper: Map<string, number> = new Map();
|
||||||
|
private sorterIdMapperNextId: number = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取映射ID
|
||||||
|
*/
|
||||||
|
private getMapperId = (id: string): number => {
|
||||||
|
let mapperId = this.sorterIdMapper.get(id);
|
||||||
|
if (mapperId === undefined) {
|
||||||
|
mapperId = this.sorterIdMapperNextId ++;
|
||||||
|
this.sorterIdMapper.set(id, mapperId);
|
||||||
|
return mapperId;
|
||||||
|
} else {
|
||||||
|
return mapperId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 录制一帧
|
* 录制一帧
|
||||||
*/
|
*/
|
||||||
@ -196,10 +217,11 @@ class Clip {
|
|||||||
const lastCommand = this.getCommandFromLastFrame("points", object.id);
|
const lastCommand = this.getCommandFromLastFrame("points", object.id);
|
||||||
|
|
||||||
// 记录
|
// 记录
|
||||||
|
const dataBuffer = object.exportPositionId(this.getMapperId);
|
||||||
const recodeData: IDrawCommand = {
|
const recodeData: IDrawCommand = {
|
||||||
type: "points",
|
type: "points",
|
||||||
id: object.id,
|
id: object.id,
|
||||||
data: object.exportPositionData()
|
data: dataBuffer[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
// 对比校验
|
// 对比校验
|
||||||
@ -209,6 +231,12 @@ class Clip {
|
|||||||
recodeData.parameter = this.cloneRenderParameter(object.renderParameter);
|
recodeData.parameter = this.cloneRenderParameter(object.renderParameter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.isArrayEqual(dataBuffer[1], lastCommand?.mapId)) {
|
||||||
|
recodeData.mapId = lastCommand?.mapId;
|
||||||
|
} else {
|
||||||
|
recodeData.mapId = dataBuffer[1];
|
||||||
|
}
|
||||||
|
|
||||||
commands.push(recodeData);
|
commands.push(recodeData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -290,6 +318,9 @@ class Clip {
|
|||||||
command.data = (lastCommand?.data === commands[j].data) ?
|
command.data = (lastCommand?.data === commands[j].data) ?
|
||||||
this.LastFrameData as any : Array.from(commands[j].data ?? []);
|
this.LastFrameData as any : Array.from(commands[j].data ?? []);
|
||||||
|
|
||||||
|
command.mapId = (lastCommand?.mapId === commands[j].mapId) ?
|
||||||
|
this.LastFrameData as any : commands[j].mapId;
|
||||||
|
|
||||||
command.position = (lastCommand?.position === commands[j].position) ?
|
command.position = (lastCommand?.position === commands[j].position) ?
|
||||||
this.LastFrameData as any : commands[j].position?.concat([]);
|
this.LastFrameData as any : commands[j].position?.concat([]);
|
||||||
|
|
||||||
@ -336,12 +367,13 @@ class Clip {
|
|||||||
this.getCommandFromLastFrame(command.type, command.id, resFrame[resFrame.length - 1]) :
|
this.getCommandFromLastFrame(command.type, command.id, resFrame[resFrame.length - 1]) :
|
||||||
undefined;
|
undefined;
|
||||||
|
|
||||||
console.log(lastCommand);
|
|
||||||
|
|
||||||
// 记录
|
// 记录
|
||||||
command.data = (this.LastFrameData as any === commands[j].data) ?
|
command.data = (this.LastFrameData as any === commands[j].data) ?
|
||||||
lastCommand?.data : new Float32Array(commands[j].data ?? []);
|
lastCommand?.data : new Float32Array(commands[j].data ?? []);
|
||||||
|
|
||||||
|
command.mapId = (this.LastFrameData as any === commands[j].mapId) ?
|
||||||
|
lastCommand?.mapId : commands[j].mapId;
|
||||||
|
|
||||||
command.position = (this.LastFrameData as any === commands[j].position) ?
|
command.position = (this.LastFrameData as any === commands[j].position) ?
|
||||||
lastCommand?.position : commands[j].position;
|
lastCommand?.position : commands[j].position;
|
||||||
|
|
||||||
|
@ -428,6 +428,22 @@ class Group extends CtrlObject<IArchiveGroup> {
|
|||||||
return dataBuffer;
|
return dataBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出个体id列表
|
||||||
|
*/
|
||||||
|
public exportPositionId(idMapper: (id: string) => number ): [Float32Array, number[]] {
|
||||||
|
let bi = 0; let ii = 0;
|
||||||
|
let dataBuffer = new Float32Array(this.individuals.size * 3);
|
||||||
|
let idBUffer: number[] = new Array(this.individuals.size).fill("");
|
||||||
|
this.individuals.forEach((individual) => {
|
||||||
|
idBUffer[ii ++] = idMapper(individual.id);
|
||||||
|
dataBuffer[bi ++] = individual.position[0];
|
||||||
|
dataBuffer[bi ++] = individual.position[1];
|
||||||
|
dataBuffer[bi ++] = individual.position[2];
|
||||||
|
});
|
||||||
|
return [dataBuffer, idBUffer];
|
||||||
|
}
|
||||||
|
|
||||||
public override toArchive(): IArchiveCtrlObject & IArchiveGroup {
|
public override toArchive(): IArchiveCtrlObject & IArchiveGroup {
|
||||||
return {
|
return {
|
||||||
...super.toArchive(),
|
...super.toArchive(),
|
||||||
|
Loading…
Reference in New Issue
Block a user