jCAE - Amibe OEMM
P. Cignoni, C. Montani, C. Rocchini and R. Scopigno described in their paper External Memory Management and Simplification of Huge Meshes a data structure for out-of-core processing of huge meshes (also called Octree based External Memory Mesh, or OEMM). We implemented these ideas into Amibe. An overview of our OEMM file format is given below, more informations can be found into Amibe API.
Main Data Structure
OEMM has been developed as a prototype in order to test out-of-core algorithms. Its file format has not been designed to be robust, we modify it when needed. It is not portable and varies a lot between versions, but hopefully this will be fixed soon.
An OEMM is an octree-based mesh. Its main data structure is stored in a binary file (named oemm by default) created by serializing and concatenating several Java objects. This file format is not discussed here, see org.jcae.mesh.oemm.Storage.readOEMMStructure(String) source code to learn how to read this file.
Octant Data Structure
Fortunately octants are stored in a non-native format, which is described now. Non-leaf nodes contain up to 8 children, numbered from 0 to 7. Data files for children are stored in subdirectories named after their respective child number, which means that an octant found by traversing 6-0-1-4-3 children (in this order) is stored under 6/0/1/4/3/ directory.
A leaf node contains triangles and vertices. Data files have a common prefix, which is local leaf number (from 0 to 7). There are 3 different files, their suffix being:
- 3D coordinates of vertices (in double format)
- Adjacent leaves. The main OEMM data structure contains an array of leaf nodes, called org.jcae.mesh.oemm.OEMM.leaves. Each leaf node knows its neighborhood through its org.jcae.mesh.oemm.OEMM.Node.adjLeaves member, which is a list of indices referring to elements from leaves array. Each vertex encodes the list of neighboring leaf nodes connected to this vertex via an edge; the number of such adjacent leaves is stored as a byte value (by construction there is less than 256 leaf neighbors), and local indices (referring to element from adjLeaves, starting to 0) of these adjacent leaves are stored as byte values.
- Triangles: an entry consists of leaf indices (referring to elements from leaves array, starting to 0) for its 3 vertices, local indices of these vertices in their respective octant (starting to 0), and a group number