From f0e391e72f043788399ee1429dfb13fb5b95a5b3 Mon Sep 17 00:00:00 2001 From: GuoLei Date: Fri, 22 Oct 2021 17:31:22 +0800 Subject: [PATCH] feat: add more uv channel and color (#548) --- packages/loader/src/gltf/GLTFUtil.ts | 19 +++++++- packages/loader/src/gltf/parser/MeshParser.ts | 45 ++++++++++++++++--- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/packages/loader/src/gltf/GLTFUtil.ts b/packages/loader/src/gltf/GLTFUtil.ts index b61dd97678..9501e0cf38 100644 --- a/packages/loader/src/gltf/GLTFUtil.ts +++ b/packages/loader/src/gltf/GLTFUtil.ts @@ -1,5 +1,5 @@ -import { Vector3, Vector4, Vector2 } from "@oasis-engine/math"; import { IndexFormat, TypedArray, VertexElement, VertexElementFormat } from "@oasis-engine/core"; +import { Color, Vector2, Vector3, Vector4 } from "@oasis-engine/math"; import { AccessorComponentType, AccessorType, IAccessor, IBufferView, IGLTF } from "./Schema"; /** @@ -33,6 +33,23 @@ export class GLTFUtil { return array; } + public static floatBufferToColorArray(buffer: Float32Array, isColor3: boolean): Color[] { + const bufferLen = buffer.length; + const colors = new Array(bufferLen / (isColor3 ? 3 : 4)); + + if (isColor3) { + for (let i = 0; i < bufferLen; i += 3) { + colors[i / 3] = new Color(buffer[i], buffer[i + 1], buffer[i + 2], 1.0); + } + } else { + for (let i = 0; i < bufferLen; i += 4) { + colors[i / 4] = new Color(buffer[i], buffer[i + 1], buffer[i + 2], buffer[i + 3]); + } + } + + return colors; + } + /** * Parse binary text for glb loader. */ diff --git a/packages/loader/src/gltf/parser/MeshParser.ts b/packages/loader/src/gltf/parser/MeshParser.ts index 1af62a7194..84d64fb709 100644 --- a/packages/loader/src/gltf/parser/MeshParser.ts +++ b/packages/loader/src/gltf/parser/MeshParser.ts @@ -2,7 +2,7 @@ import { BlendShape, Engine, EngineObject, ModelMesh, TypedArray } from "@oasis- import { Vector3 } from "@oasis-engine/math"; import { GLTFResource } from "../GLTFResource"; import { GLTFUtil } from "../GLTFUtil"; -import { IGLTF, IMesh, IMeshPrimitive } from "../Schema"; +import { AccessorType, IGLTF, IMesh, IMeshPrimitive } from "../Schema"; import { Parser } from "./Parser"; export class MeshParser extends Parser { @@ -112,7 +112,8 @@ export class MeshParser extends Parser { const { attributes, targets, indices, mode } = gltfPrimitive; let vertexCount: number; - const accessor = gltf.accessors[attributes["POSITION"]]; + const { accessors } = gltf; + const accessor = accessors[attributes["POSITION"]]; const positionBuffer = getVertexBufferData("POSITION"); const positions = GLTFUtil.floatBufferToVector3Array(positionBuffer); mesh.setPositions(positions); @@ -148,14 +149,46 @@ export class MeshParser extends Parser { const normals = GLTFUtil.floatBufferToVector3Array(bufferData); mesh.setNormals(normals); break; - case "TANGENT": - const tangents = GLTFUtil.floatBufferToVector4Array(bufferData); - mesh.setTangents(tangents); - break; case "TEXCOORD_0": const texturecoords = GLTFUtil.floatBufferToVector2Array(bufferData); mesh.setUVs(texturecoords, 0); break; + case "TEXCOORD_1": + const texturecoords1 = GLTFUtil.floatBufferToVector2Array(bufferData); + mesh.setUVs(texturecoords1, 1); + break; + case "TEXCOORD_2": + const texturecoords2 = GLTFUtil.floatBufferToVector2Array(bufferData); + mesh.setUVs(texturecoords2, 2); + break; + case "TEXCOORD_3": + const texturecoords3 = GLTFUtil.floatBufferToVector2Array(bufferData); + mesh.setUVs(texturecoords3, 3); + case "TEXCOORD_4": + const texturecoords4 = GLTFUtil.floatBufferToVector2Array(bufferData); + mesh.setUVs(texturecoords4, 4); + case "TEXCOORD_5": + const texturecoords5 = GLTFUtil.floatBufferToVector2Array(bufferData); + mesh.setUVs(texturecoords5, 5); + case "TEXCOORD_6": + const texturecoords6 = GLTFUtil.floatBufferToVector2Array(bufferData); + mesh.setUVs(texturecoords6, 6); + case "TEXCOORD_7": + const texturecoords7 = GLTFUtil.floatBufferToVector2Array(bufferData); + mesh.setUVs(texturecoords7, 7); + break; + case "COLOR_0": + const colors = GLTFUtil.floatBufferToColorArray( + bufferData, + accessors[attributes["COLOR_0"]].type === AccessorType.VEC3 + ); + mesh.setColors(colors); + break; + case "TANGENT": + const tangents = GLTFUtil.floatBufferToVector4Array(bufferData); + mesh.setTangents(tangents); + break; + case "JOINTS_0": const joints = GLTFUtil.floatBufferToVector4Array(bufferData); mesh.setBoneIndices(joints);