+ picoIndex_t* data;
+ picoIndex_t* last;
+
+ aseFace_t* faces;
+};
+
+size_t aseUniqueIndices_size( aseUniqueIndices_t* self ){
+ return self->last - self->data;
+}
+
+void aseUniqueIndices_reserve( aseUniqueIndices_t* self, picoIndex_t size ){
+ self->data = self->last = (picoIndex_t*)_pico_calloc( size, sizeof( picoIndex_t ) );
+}
+
+void aseUniqueIndices_clear( aseUniqueIndices_t* self ){
+ _pico_free( self->data );
+}
+
+void aseUniqueIndices_pushBack( aseUniqueIndices_t* self, picoIndex_t index ){
+ *self->last++ = index;
+}
+
+picoIndex_t aseFaces_getVertexIndex( aseFace_t* faces, picoIndex_t index ){
+ return faces[index / 3].indices[index % 3];
+}
+
+picoIndex_t aseFaces_getTexCoordIndex( aseFace_t* faces, picoIndex_t index ){
+ return faces[index / 3].indices[( index % 3 ) + 3];
+}
+
+picoIndex_t aseFaces_getColorIndex( aseFace_t* faces, picoIndex_t index ){
+ return faces[index / 3].indices[( index % 3 ) + 6];
+}
+
+int aseUniqueIndex_equal( aseFace_t* faces, picoIndex_t index, picoIndex_t other ){
+ return aseFaces_getVertexIndex( faces, index ) == aseFaces_getVertexIndex( faces, other )
+ && aseFaces_getTexCoordIndex( faces, index ) == aseFaces_getTexCoordIndex( faces, other )
+ && aseFaces_getColorIndex( faces, index ) == aseFaces_getColorIndex( faces, other );
+}
+
+picoIndex_t aseUniqueIndices_insertUniqueVertex( aseUniqueIndices_t* self, picoIndex_t index ){
+ picoIndexIter_t i = self->data;
+ for (; i != self->last; ++i )
+ {
+ picoIndex_t other = (picoIndex_t)( i - self->data );
+ if ( aseUniqueIndex_equal( self->faces, index, other ) ) {
+ return other;
+ }
+ }
+
+ aseUniqueIndices_pushBack( self, index );
+ return (picoIndex_t)( aseUniqueIndices_size( self ) - 1 );
+}
+
+static void _ase_submit_triangles_unshared( picoModel_t* model, aseMaterial_t* materials, aseVertex_t* vertices, aseTexCoord_t* texcoords, aseColor_t* colors, aseFace_t* faces, int numFaces, int meshHasNormals ){
+ aseFacesIter_t i = faces, end = faces + numFaces;
+
+ aseUniqueIndices_t indices;
+ aseUniqueIndices_t remap;
+ aseUniqueIndices_reserve( &indices, numFaces * 3 );
+ aseUniqueIndices_reserve( &remap, numFaces * 3 );
+ indices.faces = faces;
+
+ for (; i != end; ++i )