Skip to content

Commit

Permalink
Unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
donmccurdy committed Dec 30, 2023
1 parent 4a60ca2 commit 3a07d17
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 5 deletions.
9 changes: 6 additions & 3 deletions packages/functions/src/prune.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ export function prune(_options: PruneOptions = PRUNE_DEFAULTS): Transform {
const material = prim.getMaterial();
if (!material) continue;

const required = listRequiredSemantics(document, material);
const required = listRequiredSemantics(document, prim, material);
const unused = listUnusedSemantics(prim, required);
pruneAttributes(prim, unused);
prim.listTargets().forEach((target) => pruneAttributes(target, unused));
Expand Down Expand Up @@ -346,6 +346,7 @@ function listUnusedSemantics(prim: Primitive | PrimitiveTarget, required: Set<st
*/
function listRequiredSemantics(
document: Document,
prim: Primitive,
material: Material | ExtensionProperty,
semantics = new Set<string>(),
): Set<string> {
Expand Down Expand Up @@ -375,13 +376,15 @@ function listRequiredSemantics(
}

if (child instanceof ExtensionProperty) {
listRequiredSemantics(document, child, semantics);
listRequiredSemantics(document, prim, child, semantics);
}

// TODO(#748): Does KHR_materials_anisotropy imply required vertex attributes?
}

if (material instanceof Material && !material.getExtension('KHR_materials_unlit')) {
const isLit = material instanceof Material && !material.getExtension('KHR_materials_unlit');
const isPoints = prim.getMode() === Primitive.Mode.POINTS;
if (isLit && !isPoints) {
semantics.add('NORMAL');
}

Expand Down
38 changes: 36 additions & 2 deletions packages/functions/test/prune.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import test from 'ava';
import { Accessor, Document, PropertyType } from '@gltf-transform/core';
import { prune } from '@gltf-transform/functions';
import { Accessor, Document, Primitive, PropertyType } from '@gltf-transform/core';
import { KHRMaterialsUnlit } from '@gltf-transform/extensions';
import { prune, unlit } from '@gltf-transform/functions';

Check warning on line 4 in packages/functions/test/prune.test.ts

View workflow job for this annotation

GitHub Actions / node (v18)

'unlit' is defined but never used

Check warning on line 4 in packages/functions/test/prune.test.ts

View workflow job for this annotation

GitHub Actions / node (v20)

'unlit' is defined but never used
import { logger } from '@gltf-transform/test-utils';
import ndarray from 'ndarray';
import { savePixels } from 'ndarray-pixels';
Expand Down Expand Up @@ -223,6 +224,39 @@ test('attributes - texcoords', async (t) => {
t.is(material.getNormalTextureInfo().getTexCoord(), 1, 'material.normalTexture.texCoord → 1');
});

test('attributes - normals', async (t) => {
const document = new Document().setLogger(logger);

const unlitExtension = document.createExtension<KHRMaterialsUnlit>(KHRMaterialsUnlit);
const material = document.createMaterial();
const materialUnlit = document.createMaterial().setExtension('KHR_materials_unlit', unlitExtension.createUnlit());

const attribute = document.createAccessor().setArray(new Float32Array(12));
const primTriangles = document
.createPrimitive()
.setMaterial(material)
.setAttribute('POSITION', attribute)
.setAttribute('NORMAL', attribute)
.setMode(Primitive.Mode.TRIANGLES);
const primPoints = primTriangles.clone().setMode(Primitive.Mode.POINTS);
const primUnlit = primTriangles.clone().setMaterial(materialUnlit);
const mesh = document.createMesh().addPrimitive(primTriangles).addPrimitive(primPoints).addPrimitive(primUnlit);
const node = document.createNode().setMesh(mesh);
document.createScene().addChild(node);

await document.transform(prune({ keepAttributes: true, propertyTypes: [PropertyType.ACCESSOR] }));

t.deepEqual(primTriangles.listSemantics(), ['POSITION', 'NORMAL'], 'triangles, keepAttributes=true');
t.deepEqual(primPoints.listSemantics(), ['POSITION', 'NORMAL'], 'points, keepAttributes=true');
t.deepEqual(primUnlit.listSemantics(), ['POSITION', 'NORMAL'], 'unlit, keepAttributes=true');

await document.transform(prune({ keepAttributes: false, propertyTypes: [PropertyType.ACCESSOR] }));

t.deepEqual(primTriangles.listSemantics(), ['POSITION', 'NORMAL'], 'triangles, keepAttributes=false');
t.deepEqual(primPoints.listSemantics(), ['POSITION'], 'points, keepAttributes=false');
t.deepEqual(primUnlit.listSemantics(), ['POSITION'], 'unlit, keepAttributes=false');
});

test('indices', async (t) => {
const document = new Document().setLogger(logger);

Expand Down

0 comments on commit 3a07d17

Please sign in to comment.