各位大佬,想请教一个关于Assembler绘制多边形的问题。我写入5个顶点数据,但是只能绘制一个四边形。代码在下面,请不吝赐教,非常感谢!
继承sprite,修改this._assembler指向自定义的Assembler,
import { Sprite, Vec2, _decorator } from "cc";
import { CustomSpriteAssembler } from "./CustomSpriteAssembler";
const { ccclass, property } = _decorator
@ccclass("CustomSprite")
class CustomSprite extends Sprite {
protected _flushAssembler() {
const assembler = CustomSpriteAssembler;
if (this._assembler !== assembler) {
this._assembler = assembler;
}
if (!this._renderData) {
if (this._assembler && this._assembler.createData) {
this._renderData = this._assembler.createData(this);
this._renderData!.material = this.material;
}
}
}
update() {
let point = [new Vec2(100, 0), new Vec2(200, 0), new Vec2(100, 100), new Vec2(0, 100), new Vec2(0, 0)];
this._assembler && this._assembler.update(this, point);
}
}
export { CustomSprite };
改写Assembler,结构是参考了motion-streak-2d-assembler.ts的写法。如下,
import { Color, IAssembler, Vec2 } from "cc";
import { CustomSprite } from "./CustomSprite";
export const CustomSpriteAssembler: IAssembler = {
createData(sprite: CustomSprite) {
const renderData = sprite.requestRenderData();
return renderData;
},
update(comp: CustomSprite, points: Vec2[]) {
const renderData = comp.renderData;
renderData.dataLength = points.length;
const data = comp.renderData.data;
let vertexCount = 0;
for (let i = 0; i < points.length; i++) {
data[vertexCount].x = points[i].x;
data[vertexCount].y = points[i].y;
data[vertexCount].u = (i === 4 || i === 3) ? 0 : (i === 0 || i === 2) ? 0.5 : 1;
data[vertexCount].v = (i === 2 || i == 3) ? 0 : 1;
data[vertexCount].color.r = comp.color.r;
data[vertexCount].color.g = comp.color.g;
data[vertexCount].color.b = comp.color.b;
data[vertexCount].color.a = comp.color.a;
vertexCount++;
}
renderData.vertexCount = vertexCount;
renderData.indicesCount = (vertexCount - 2) * 3;
},
updateRenderData() {
},
fillBuffers(comp: CustomSprite, renderer: any) {
if (comp === null) {
return;
}
const renderData = comp.renderData;
const dataList = renderData.data;
const vertexCount = renderData.vertexCount;
const indicesCount = renderData.indicesCount;
let buffer = renderer.acquireBufferBatch()!;
let vertexOffset = buffer.byteOffset >> 2;
let indicesOffset = buffer.indicesOffset;
let vertexId = buffer.vertexOffset;
const bufferUnchanged = buffer.request();
if (!bufferUnchanged) {
buffer = renderer.currBufferBatch!;
vertexOffset = 0;
indicesOffset = 0;
vertexId = 0;
}
const vBuf = buffer.vData!;
const iBuf = buffer.iData!;
for (let i = 0; i < vertexCount; i++) {
const vert = dataList[i];
vBuf[vertexOffset++] = vert.x;
vBuf[vertexOffset++] = vert.y;
vBuf[vertexOffset++] = vert.z;
vBuf[vertexOffset++] = vert.u;
vBuf[vertexOffset++] = vert.v;
Color.toArray(vBuf, vert.color, vertexOffset);
vertexOffset += 4;
}
//这里只有三个三角形,为了简单就直接写了
let start = vertexId;
iBuf[indicesOffset++] = start;
iBuf[indicesOffset++] = start + 3;
iBuf[indicesOffset++] = start + 2;
iBuf[indicesOffset++] = start;
iBuf[indicesOffset++] = start + 2;
iBuf[indicesOffset++] = start + 1;
iBuf[indicesOffset++] = start;
iBuf[indicesOffset++] = start + 4;
iBuf[indicesOffset++] = start + 3;
},
};


