Skip to content

Commit

Permalink
Opt ModelMesh code (galacean#739)
Browse files Browse the repository at this point in the history
* refactor: opt `ModelMesh` code
  • Loading branch information
GuoLei1990 authored Apr 20, 2022
1 parent 9dd8011 commit 9d72251
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 41 deletions.
37 changes: 21 additions & 16 deletions packages/core/src/graphic/Mesh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import { SubMesh } from "../graphic/SubMesh";
import { VertexBufferBinding } from "../graphic/VertexBufferBinding";
import { VertexElement } from "../graphic/VertexElement";
import { ShaderProgram } from "../shader/ShaderProgram";
import { UpdateFlag } from "../UpdateFlag";
import { UpdateFlagManager } from "../UpdateFlagManager";

/**
Expand Down Expand Up @@ -119,6 +118,27 @@ export abstract class Mesh extends RefObject {
return this._updateFlagManager.createFlag(BoolUpdateFlag);
}

/**
* @internal
*/
_clearVertexElements(): void {
this._vertexElements.length = 0;
const vertexElementMap = this._vertexElementMap;
for (const k in vertexElementMap) {
delete vertexElementMap[k];
}
}

/**
* @internal
*/
_addVertexElement(element: VertexElement): void {
const { semantic } = element;
this._vertexElementMap[semantic] = element;
this._vertexElements.push(element);
this._updateFlagManager.dispatch();
}

/**
* @internal
*/
Expand Down Expand Up @@ -175,19 +195,4 @@ export abstract class Mesh extends RefObject {
this._glIndexType = undefined;
}
}

private _clearVertexElements(): void {
this._vertexElements.length = 0;
const vertexElementMap = this._vertexElementMap;
for (const k in vertexElementMap) {
delete vertexElementMap[k];
}
}

private _addVertexElement(element: VertexElement): void {
const { semantic } = element;
this._vertexElementMap[semantic] = element;
this._vertexElements.push(element);
this._updateFlagManager.dispatch();
}
}
9 changes: 5 additions & 4 deletions packages/core/src/mesh/BlendShapeManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { VertexElement, VertexElementFormat } from "../graphic";
import { ListenerUpdateFlag } from "../ListenerUpdateFlag";
import { Texture2DArray, TextureFilterMode, TextureFormat } from "../texture";
import { BlendShape } from "./BlendShape";
import { ModelMesh } from "./ModelMesh";

/**
* @internal
Expand Down Expand Up @@ -117,19 +118,19 @@ export class BlendShapeManager {
/**
* @internal
*/
_updateVertexElements(vertexElements: VertexElement[], offset: number): number {
_updateVertexElements(modelMesh: ModelMesh, offset: number): number {
let elementCount = 0;
for (let i = 0, n = this._blendShapeCount; i < n; i++) {
vertexElements.push(new VertexElement(`POSITION_BS${i}`, offset, VertexElementFormat.Vector3, 0));
modelMesh._addVertexElement(new VertexElement(`POSITION_BS${i}`, offset, VertexElementFormat.Vector3, 0));
offset += 12;
elementCount += 3;
if (this._useBlendNormal) {
vertexElements.push(new VertexElement(`NORMAL_BS${i}`, offset, VertexElementFormat.Vector3, 0));
modelMesh._addVertexElement(new VertexElement(`NORMAL_BS${i}`, offset, VertexElementFormat.Vector3, 0));
offset += 12;
elementCount += 3;
}
if (this._useBlendTangent) {
vertexElements.push(new VertexElement(`TANGENT_BS${i}`, offset, VertexElementFormat.Vector3, 0));
modelMesh._addVertexElement(new VertexElement(`TANGENT_BS${i}`, offset, VertexElementFormat.Vector3, 0));
elementCount += 3;
}
}
Expand Down
39 changes: 18 additions & 21 deletions packages/core/src/mesh/ModelMesh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ export class ModelMesh extends Mesh {
private _vertexChangeFlag: number = 0;
private _indicesChangeFlag: boolean = false;
private _elementCount: number = 0;
private _vertexElementsCache: VertexElement[] = [];
private _lastUploadVertexCount: number = 0;

private _positions: Vector3[] = [];
Expand Down Expand Up @@ -455,9 +454,7 @@ export class ModelMesh extends Mesh {

// Vertex element change
if (vertexElementUpdate) {
const vertexElements = this._vertexElementsCache;
this._updateVertexElements(vertexElements, blendVertexElementChanged);
this._setVertexElements(vertexElements);
this._updateVertexElements(blendVertexElementChanged);
}

const { _vertexCount: vertexCount } = this;
Expand Down Expand Up @@ -531,81 +528,81 @@ export class ModelMesh extends Mesh {
this._accessible && this._releaseCache();
}

private _updateVertexElements(vertexElements: VertexElement[], blendVertexElementChanged: boolean): void {
vertexElements.length = 1;
vertexElements[0] = POSITION_VERTEX_ELEMENT;
private _updateVertexElements(blendVertexElementChanged: boolean): void {
this._clearVertexElements();
this._addVertexElement(POSITION_VERTEX_ELEMENT);

let offset = 12;
let elementCount = 3;
if (this._normals) {
vertexElements.push(new VertexElement("NORMAL", offset, VertexElementFormat.Vector3, 0));
this._addVertexElement(new VertexElement("NORMAL", offset, VertexElementFormat.Vector3, 0));
offset += 12;
elementCount += 3;
}
if (this._colors) {
vertexElements.push(new VertexElement("COLOR_0", offset, VertexElementFormat.Vector4, 0));
this._addVertexElement(new VertexElement("COLOR_0", offset, VertexElementFormat.Vector4, 0));
offset += 16;
elementCount += 4;
}
if (this._boneWeights) {
vertexElements.push(new VertexElement("WEIGHTS_0", offset, VertexElementFormat.Vector4, 0));
this._addVertexElement(new VertexElement("WEIGHTS_0", offset, VertexElementFormat.Vector4, 0));
offset += 16;
elementCount += 4;
}
if (this._boneIndices) {
vertexElements.push(new VertexElement("JOINTS_0", offset, VertexElementFormat.UByte4, 0));
this._addVertexElement(new VertexElement("JOINTS_0", offset, VertexElementFormat.UByte4, 0));
offset += 4;
elementCount += 1;
}
if (this._tangents) {
vertexElements.push(new VertexElement("TANGENT", offset, VertexElementFormat.Vector4, 0));
this._addVertexElement(new VertexElement("TANGENT", offset, VertexElementFormat.Vector4, 0));
offset += 16;
elementCount += 4;
}
if (this._uv) {
vertexElements.push(new VertexElement("TEXCOORD_0", offset, VertexElementFormat.Vector2, 0));
this._addVertexElement(new VertexElement("TEXCOORD_0", offset, VertexElementFormat.Vector2, 0));
offset += 8;
elementCount += 2;
}
if (this._uv1) {
vertexElements.push(new VertexElement("TEXCOORD_1", offset, VertexElementFormat.Vector2, 0));
this._addVertexElement(new VertexElement("TEXCOORD_1", offset, VertexElementFormat.Vector2, 0));
offset += 8;
elementCount += 2;
}
if (this._uv2) {
vertexElements.push(new VertexElement("TEXCOORD_2", offset, VertexElementFormat.Vector2, 0));
this._addVertexElement(new VertexElement("TEXCOORD_2", offset, VertexElementFormat.Vector2, 0));
offset += 8;
elementCount += 2;
}
if (this._uv3) {
vertexElements.push(new VertexElement("TEXCOORD_3", offset, VertexElementFormat.Vector2, 0));
this._addVertexElement(new VertexElement("TEXCOORD_3", offset, VertexElementFormat.Vector2, 0));
offset += 8;
elementCount += 2;
}
if (this._uv4) {
vertexElements.push(new VertexElement("TEXCOORD_4", offset, VertexElementFormat.Vector2, 0));
this._addVertexElement(new VertexElement("TEXCOORD_4", offset, VertexElementFormat.Vector2, 0));
offset += 8;
elementCount += 2;
}
if (this._uv5) {
vertexElements.push(new VertexElement("TEXCOORD_5", offset, VertexElementFormat.Vector2, 0));
this._addVertexElement(new VertexElement("TEXCOORD_5", offset, VertexElementFormat.Vector2, 0));
offset += 8;
elementCount += 2;
}
if (this._uv6) {
vertexElements.push(new VertexElement("TEXCOORD_6", offset, VertexElementFormat.Vector2, 0));
this._addVertexElement(new VertexElement("TEXCOORD_6", offset, VertexElementFormat.Vector2, 0));
offset += 8;
elementCount += 2;
}
if (this._uv7) {
vertexElements.push(new VertexElement("TEXCOORD_7", offset, VertexElementFormat.Vector2, 0));
this._addVertexElement(new VertexElement("TEXCOORD_7", offset, VertexElementFormat.Vector2, 0));
offset += 8;
elementCount += 2;
}
this._vertexSlotChanged = false;

if (blendVertexElementChanged) {
elementCount += this._blendShapeManager._updateVertexElements(vertexElements, offset);
elementCount += this._blendShapeManager._updateVertexElements(this, offset);
}

this._elementCount = elementCount;
Expand Down

0 comments on commit 9d72251

Please sign in to comment.