Compare commits

..

No commits in common. "d0b7935f12986297989ee1f597eeaabbfb70a75c" and "647819dec64d94b909177e226a1e7221680a19c3" have entirely different histories.

6 changed files with 28 additions and 191 deletions

View File

@ -38,32 +38,13 @@ abstract class Behavior<
*/ */
abstract parameter?: P; abstract parameter?: P;
/**
*
* @param individual
* @param group
* @param model
* @param t
*/
public beforeEffect(individual: Individual, group: Group, model: Model, t: number): void {};
/** /**
* *
* @param individual * @param individual
* @param group * @param group
* @param model
* @param t * @param t
*/ */
public effect(individual: Individual, group: Group, model: Model, t: number): void {}; abstract effect(individual: Individual, group: Group, model: Model, t: number): void;
/**
*
* @param individual
* @param group
* @param model
* @param t
*/
public afterEffect(individual: Individual, group: Group, model: Model, t: number): void {};
} }

View File

@ -7,21 +7,6 @@ import type { ObjectID } from "./Renderer";
*/ */
class CtrlObject extends LabelObject { class CtrlObject extends LabelObject {
/**
*
*/
public color: number[] = [.5, .5, .5];
/**
*
*/
public display: boolean = true;
/**
*
*/
public update: boolean = true;
/** /**
* *
*/ */
@ -40,13 +25,6 @@ class CtrlObject extends LabelObject {
this.model = model; this.model = model;
this.id = id; this.id = id;
} }
/**
*
*/
public delete() {
this.model.deleteObject([this]);
}
} }
export default CtrlObject; export default CtrlObject;

View File

@ -37,11 +37,9 @@ class Group extends CtrlObject {
public add(individual: Individual[] | Individual): this { public add(individual: Individual[] | Individual): this {
if (Array.isArray(individual)) { if (Array.isArray(individual)) {
for (let i = 0; i < individual.length; i++) { for (let i = 0; i < individual.length; i++) {
individual[i].group = this;
this.individuals.add(individual[i]); this.individuals.add(individual[i]);
} }
} else { } else {
individual.group = this;
this.individuals.add(individual); this.individuals.add(individual);
} }
return this; return this;
@ -114,32 +112,13 @@ class Group extends CtrlObject {
* *
* @param * @param
*/ */
public runner(t: number, effectType: "beforeEffect" | "effect" | "afterEffect" ): void { public runner(t: number): void {
this.individuals.forEach((individual) => { this.individuals.forEach((individual) => {
for(let j = 0; j < this.behaviors.length; j++) { for(let j = 0; j < this.behaviors.length; j++) {
this.behaviors[j][effectType](individual, this, this.model, t); this.behaviors[j].effect(individual, this, this.model, t);
} }
}); });
} }
/**
*
*/
public exportPositionData(): Float32Array {
let index = 0;
let dataBuffer = new Float32Array(this.individuals.size * 3);
this.individuals.forEach((individual) => {
dataBuffer[index ++] = individual.position[0];
dataBuffer[index ++] = individual.position[1];
dataBuffer[index ++] = individual.position[2];
});
return dataBuffer;
}
/**
*
*/
public size: number = 60;
} }
export default Group; export default Group;

View File

@ -1,17 +1,13 @@
import { Individual } from "./Individual"; import { Individual } from "./Individual";
import { Group } from "./Group"; import { Group } from "./Group";
import { Range } from "./Range";
import { Emitter, EventType, EventMixin } from "./Emitter"; import { Emitter, EventType, EventMixin } from "./Emitter";
import { CtrlObject } from "./CtrlObject"; import { CtrlObject } from "./CtrlObject";
import { ObjectID, AbstractRenderer } from "./Renderer"; import { ObjectID } from "./Renderer";
type ModelEvent = { type ModelEvent = {
groupAdd: Group; addGroup: Group;
rangeAdd: Range; deleteGroup: Group[];
objectAdd: CtrlObject;
objectDelete: CtrlObject[];
objectChange: CtrlObject[];
}; };
/** /**
@ -35,127 +31,43 @@ class Model extends Emitter<ModelEvent> {
/** /**
* *
*/ */
public addGroup(): Group { public addGroup(): void {
console.log(`Model: Creat group with id ${this.idIndex}`); console.log(`Model: Creat group with id ${this.idIndex}`);
let group = new Group(this, this.nextId); let group = new Group(this, this.nextId);
this.objectPool.push(group); this.objectPool.push(group);
this.emit("groupAdd", group); this.emit("addGroup", group);
this.emit("objectAdd", group);
this.emit("objectChange", this.objectPool);
return group;
} }
/** /**
* *
*/ */
public addRange(): Range { public deleteGroup(groups: Group[] | ObjectID[]): void {
console.log(`Model: Creat range with id ${this.idIndex}`); let deletedGroups: Group[] = [];
let range = new Range(this, this.nextId); this.objectPool = this.objectPool.filter((object) => {
this.objectPool.push(range); if (!(object instanceof Group)) return true;
this.emit("rangeAdd", range); let deletedGroup: Group | undefined;
this.emit("objectAdd", range);
this.emit("objectChange", this.objectPool);
return range;
}
/** for (let i = 0; i < groups.length; i++) {
* if (groups[i] instanceof Group) {
*/ if (groups[i] === object) {
public deleteObject(object: CtrlObject[] | ObjectID[]): CtrlObject[] { deletedGroup = object;
let deletedObject: CtrlObject[] = [];
this.objectPool = this.objectPool.filter((currentObject) => {
let needDeleted: boolean = false;
for (let i = 0; i < object.length; i++) {
if (object[i] instanceof CtrlObject) {
if (object[i] === currentObject) {
needDeleted = true;
} }
} else { } else {
if (object[i] == currentObject.id) { if (groups[i] === object.id) {
needDeleted = true; deletedGroup = object;
} }
} }
} }
if (needDeleted) { if (deletedGroup) {
deletedObject.push(currentObject); deletedGroups.push(deletedGroup);
return false; return false;
} else { } else {
return true; return true;
} }
}); });
if (deletedObject.length) { this.emit("deleteGroup", deletedGroups);
console.log(`Model: Delete object ${deletedObject.map((object) => object.id).join(", ")}`);
this.emit("objectDelete", deletedObject);
this.emit("objectChange", this.objectPool);
}
return deletedObject;
}
/**
*
*/
public renderer: AbstractRenderer = undefined as any;
/**
*
* @param renderer
*/
public bindRenderer(renderer: AbstractRenderer): this {
this.renderer = renderer;
return this;
}
/**
*
*/
public update(t: number) {
// 清除全部渲染状态
this.renderer.clean();
// 第一轮更新
for (let i = 0; i < this.objectPool.length; i++) {
let object = this.objectPool[i];
if (object instanceof Group && object.update) {
object.runner(t, "beforeEffect");
}
}
// 第二轮更新
for (let i = 0; i < this.objectPool.length; i++) {
let object = this.objectPool[i];
if (object instanceof Group && object.update) {
object.runner(t, "effect");
}
}
// 第三轮更新
for (let i = 0; i < this.objectPool.length; i++) {
let object = this.objectPool[i];
if (object instanceof Group && object.update) {
object.runner(t, "afterEffect");
}
}
// 渲染
for (let i = 0; i < this.objectPool.length; i++) {
let object = this.objectPool[i];
if (object.display && object instanceof Group) {
this.renderer.points(object.id, object.exportPositionData(), {
color: object.color,
size: object.size
} as any);
}
if (object.display && object instanceof Range) {
this.renderer.cube(object.id, object.position, {
color: object.color,
radius: object.radius
} as any);
}
}
} }
} }

View File

@ -10,11 +10,6 @@ class Range extends CtrlObject {
*/ */
public position: number[] = []; public position: number[] = [];
/**
*
*/
public radius: number[] = [1, 1, 1];
} }
export default Range; export default Range;

View File

@ -24,23 +24,15 @@ class Laboratory extends Component {
const canvas = document.createElement("canvas"); const canvas = document.createElement("canvas");
const renderer = new ClassicRenderer(canvas, { className: "canvas" }); const renderer = new ClassicRenderer(canvas, { className: "canvas" });
this.canvasContRef.current.appendChild(renderer.canvas.dom); this.canvasContRef.current.appendChild(renderer.canvas.dom);
renderer.onLoad(); renderer.onLoad();
let model = new Model().bindRenderer(renderer); let model = new Model();
let group = model.addGroup(); model.addGroup();
let range = model.addRange(); model.addGroup();
range.color = [.1, .5, .9];
group.new(100);
group.color = [.8, .1, .6];
group.individuals.forEach((individual) => {
individual.position[0] = (Math.random() - .5) * 2;
individual.position[1] = (Math.random() - .5) * 2;
individual.position[2] = (Math.random() - .5) * 2;
})
model.update(0);
// 测试渲染器 // 测试渲染器
if (false) { if (true) {
renderer.points("0"); renderer.points("0");
renderer.points("1", new Array(100 * 3).fill(0).map(() => (Math.random() - .5) * 2)); renderer.points("1", new Array(100 * 3).fill(0).map(() => (Math.random() - .5) * 2));
renderer.points("2", new Array(100 * 3).fill(0).map(() => (Math.random() - .5) * 2), { renderer.points("2", new Array(100 * 3).fill(0).map(() => (Math.random() - .5) * 2), {