Simplify Node.js usage example. (#157)

* Fix 'node' global name in node.js example.

* Include GitHub URL with npm package.json.

* Simplify Node.js usage example.

* Correct attribute stride.

* Correct numVertexCoord -> numItems.

* Fix typo on attr constant.

* Simplify loop iteration.
This commit is contained in:
Don McCurdy 2017-08-01 17:25:55 -07:00 committed by Ondrej Stava
parent 7c8cd74271
commit f2f4efbc20
3 changed files with 38 additions and 78 deletions

View File

@ -63,7 +63,7 @@ $ npm install draco3d
~~~~~ bash ~~~~~ bash
$ cp node_modules/draco3d/draco_nodejs_example.js . $ cp node_modules/draco3d/draco_nodejs_example.js .
$ cp node_modules/draco3d/bunny.drc . $ cp node_modules/draco3d/bunny.drc .
$ nodejs draco_nodejs_example.js $ node draco_nodejs_example.js
~~~~~ ~~~~~
The code loads the [Bunny] model, it will first decode to a mesh The code loads the [Bunny] model, it will first decode to a mesh

View File

@ -15,6 +15,7 @@
'use_strict'; 'use_strict';
const fs = require('fs'); const fs = require('fs');
const assert = require('assert');
const draco3d = require('./draco3d'); const draco3d = require('./draco3d');
const decoderModule = draco3d.createDecoderModule({}); const decoderModule = draco3d.createDecoderModule({});
const encoderModule = draco3d.createEncoderModule({}); const encoderModule = draco3d.createEncoderModule({});
@ -26,7 +27,7 @@ fs.readFile('./bunny.drc', function(err, data) {
console.log("Decoding file of size " + data.byteLength + " .."); console.log("Decoding file of size " + data.byteLength + " ..");
// Decode mesh // Decode mesh
const decoder = new decoderModule.Decoder(); const decoder = new decoderModule.Decoder();
let decodedGeometry = decodeDracoData(data, decoder); const decodedGeometry = decodeDracoData(data, decoder);
// Encode mesh // Encode mesh
encodeMeshToFile(decodedGeometry, decoder); encodeMeshToFile(decodedGeometry, decoder);
@ -65,10 +66,10 @@ function encodeMeshToFile(mesh, decoder) {
const numFaces = mesh.num_faces(); const numFaces = mesh.num_faces();
const numIndices = numFaces * 3; const numIndices = numFaces * 3;
const numPoints = mesh.num_points(); const numPoints = mesh.num_points();
const numVertexCoord = numPoints * 3; const indices = new Uint32Array(numIndices);
console.log("Number of faces " + numFaces); console.log("Number of faces " + numFaces);
console.log("Number of vertices " + numPoints); console.log("Number of vertices " + numPoints);
let indices = new Uint32Array(numIndices);
// Add Faces to mesh // Add Faces to mesh
const ia = new decoderModule.DracoInt32Array(); const ia = new decoderModule.DracoInt32Array();
@ -82,81 +83,36 @@ function encodeMeshToFile(mesh, decoder) {
decoderModule.destroy(ia); decoderModule.destroy(ia);
meshBuilder.AddFacesToMesh(newMesh, numFaces, indices); meshBuilder.AddFacesToMesh(newMesh, numFaces, indices);
// Add position data to mesh. const attrs = {POSITION: 3, NORMAL: 3, COLOR: 3, TEX_COORD: 2};
const posAttId = decoder.GetAttributeId(mesh, decoderModule.POSITION);
if (posAttId === -1) { Object.keys(attrs).forEach((attr) => {
console.log("No position attribute found."); const stride = attrs[attr];
encoderModule.destroy(newMesh); const numValues = numPoints * stride;
encoderModule.destroy(encoder); const decoderAttr = decoderModule[attr];
const encoderAttr = encoderModule[attr];
const attrId = decoder.GetAttributeId(mesh, decoderAttr);
if (attrId < 0) {
return; return;
} }
const posAttribute = decoder.GetAttribute(mesh, posAttId);
const posAttributeData = new decoderModule.DracoFloat32Array();
decoder.GetAttributeFloatForAllPoints(
mesh, posAttribute, posAttributeData);
let vertices = new Float32Array(numVertexCoord);
for (let i = 0; i < numVertexCoord; i += 3) {
vertices[i] = posAttributeData.GetValue(i);
vertices[i + 1] = posAttributeData.GetValue(i + 1);
vertices[i + 2] = posAttributeData.GetValue(i + 2);
}
decoderModule.destroy(posAttributeData);
meshBuilder.AddFloatAttributeToMesh(newMesh, encoderModule.POSITION,
numPoints, 3, vertices);
const normalAttId = decoder.GetAttributeId(mesh, decoderModule.NORMAL); console.log("Adding %s attribute", attr);
if (normalAttId > -1) {
console.log("Adding normal attribute."); const attribute = decoder.GetAttribute(mesh, attrId);
const norAttribute = decoder.GetAttribute(mesh, normalAttId); const attributeData = new decoderModule.DracoFloat32Array();
const norAttributeData = new decoderModule.DracoFloat32Array(); decoder.GetAttributeFloatForAllPoints(mesh, attribute, attributeData);
decoder.GetAttributeFloatForAllPoints(mesh, norAttribute,
norAttributeData); assert(numValues === attributeData.size(), 'Wrong attribute size.');
const normals = new Float32Array(numVertexCoord);
for (let i = 0; i < numVertexCoord; i += 3) { const attributeDataArray = new Float32Array(numValues);
normals[i] = norAttributeData.GetValue(i); for (let i = 0; i < numValues; ++i) {
normals[i + 1] = norAttributeData.GetValue(i + 1); attributeDataArray[i] = attributeData.GetValue(i);
normals[i + 2] = norAttributeData.GetValue(i + 2);
}
decoderModule.destroy(norAttributeData);
meshBuilder.AddFloatAttributeToMesh(newMesh, encoderModule.NORMAL,
numPoints, 3, normals);
} }
const texAttId = decoder.GetAttributeId(mesh, decoderModule.TEX_COORD); decoderModule.destroy(attributeData);
if (texAttId > -1) { meshBuilder.AddFloatAttributeToMesh(newMesh, encoderAttr, numPoints,
const texAttribute = decoder.GetAttribute(mesh, texAttId); stride, attributeDataArray);
const texAttributeData = new decoderModule.DracoFloat32Array(); });
decoder.GetAttributeFloatForAllPoints(mesh, texAttribute,
texAttributeData);
assertEquals(numVertexCoord, texAttributeData.size());
const texcoords = new Float32Array(numVertexCoord);
for (let i = 0; i < numVertexCoord; i += 3) {
texcoords[i] = texAttributeData.GetValue(i);
texcoords[i + 1] = texAttributeData.GetValue(i + 1);
texcoords[i + 2] = texAttributeData.GetValue(i + 2);
}
decoderModule.destroy(texAttributeData);
meshBuilder.AddFloatAttributeToMesh(newMesh, encoderModule.TEX_COORD,
numPoints, 3, normals);
}
const colorAttId = decoder.GetAttributeId(mesh, decoderModule.COLOR);
if (colorAttId > -1) {
const colAttribute = decoder.GetAttribute(mesh, colorAttId);
const colAttributeData = new decoderModule.DracoFloat32Array();
decoder.GetAttributeFloatForAllPoints(mesh, colAttribute,
colAttributeData);
assertEquals(numVertexCoord, colAttributeData.size());
const colors = new Float32Array(numVertexCoord);
for (let i = 0; i < numVertexCoord; i += 3) {
colors[i] = colAttributeData.GetValue(i);
colors[i + 1] = colAttributeData.GetValue(i + 1);
colors[i + 2] = colAttributeData.GetValue(i + 2);
}
decoderModule.destroy(colAttributeData);
meshBuilder.AddFloatAttributeToMesh(newMesh, encoderModule.COLOR,
numPoints, 3, normals);
}
let encodedData = new encoderModule.DracoInt8Array(); let encodedData = new encoderModule.DracoInt8Array();
// Set encoding options. // Set encoding options.
@ -176,8 +132,8 @@ function encodeMeshToFile(mesh, decoder) {
console.log("Error: Encoding failed."); console.log("Error: Encoding failed.");
} }
// Copy encoded data to buffer. // Copy encoded data to buffer.
let outputBuffer = new ArrayBuffer(encodedLen); const outputBuffer = new ArrayBuffer(encodedLen);
let outputData = new Int8Array(outputBuffer); const outputData = new Int8Array(outputBuffer);
for (let i = 0; i < encodedLen; ++i) { for (let i = 0; i < encodedLen; ++i) {
outputData[i] = encodedData.GetValue(i); outputData[i] = encodedData.GetValue(i);
} }

View File

@ -13,5 +13,9 @@
"point cloud" "point cloud"
], ],
"author": "Google Draco Team", "author": "Google Draco Team",
"license": "Apache-2.0" "license": "Apache-2.0",
"repository": {
"type": "git",
"url": "git+https://github.com/google/draco.git"
}
} }