I have got the code from engine. but only describe how to get the vertex position, and I want to know how to get the vertex normals from vertexBuffer object. The image bellow are the console.log of vertexBuffer object.
and I wonder why var offsetPF = offsetP / 4;
need to /4
. I saw the comment at other code that because of float
. so what the relationship between the runtime data of vertexBuffer.format.elements
and the var dataF = new Float32Array(this.mesh.vertexBuffer.storage)
's dataF?
if (!this.mesh.boneAabb) {
this.mesh.boneAabb = [];
this.mesh.boneUsed = [];
var elems = this.mesh.vertexBuffer.format.elements;
var numVerts = this.mesh.vertexBuffer.numVertices;
var vertSize = this.mesh.vertexBuffer.format.size;
var index;
var offsetP, offsetI, offsetW;
var j, k;
for(i=0; i<elems.length; i++) {
if (elems[i].name===pc.SEMANTIC_POSITION) {
offsetP = elems[i].offset;
} else if (elems[i].name===pc.SEMANTIC_BLENDINDICES) {
offsetI = elems[i].offset;
} else if (elems[i].name===pc.SEMANTIC_BLENDWEIGHT) {
offsetW = elems[i].offset;
}
}
var data8 = new Uint8Array(this.mesh.vertexBuffer.storage);
var dataF = new Float32Array(this.mesh.vertexBuffer.storage);
var offsetPF = offsetP / 4;
var offsetWF = offsetW / 4;
var vertSizeF = vertSize / 4;
var bMax, bMin;
var x, y, z;
var boneMin = [];
var boneMax = [];
var boneUsed = this.mesh.boneUsed;
for(i=0; i<numBones; i++) {
boneMin[i] = new pc.Vec3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);
boneMax[i] = new pc.Vec3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);
}
for(j=0; j<numVerts; j++) {
for(k=0; k<4; k++) {
if (dataF[j * vertSizeF + offsetWF + k] > 0) {
index = data8[j * vertSize + offsetI + k];
// Vertex j is affected by bone index
x = dataF[j * vertSizeF + offsetPF];
y = dataF[j * vertSizeF + offsetPF + 1];
z = dataF[j * vertSizeF + offsetPF + 2];
bMax = boneMax[index];
bMin = boneMin[index];
if (bMin.x > x) bMin.x = x;
if (bMin.y > y) bMin.y = y;
if (bMin.z > z) bMin.z = z;
if (bMax.x < x) bMax.x = x;
if (bMax.y < y) bMax.y = y;
if (bMax.z < z) bMax.z = z;
boneUsed[index] = true;
}
}
}
var aabb;
for(i=0; i<numBones; i++) {
aabb = new pc.BoundingBox();
aabb.setMinMax(boneMin[i], boneMax[i]);
this.mesh.boneAabb.push(aabb);
}
}