Home | nevrax.com |
|
How to deal with 3d data
Overall view3d data files in NeL are managed in a specific way. NeL doesn't import proprietary 3d file format like .3ds. NeL only deal with NeL binary files. NeL doesn't describe the NeL binary file format, it gives interface to import and export it. Those files are generated by serializing some classes. Building those data is easy. With the serial's version system, data can change and stay compatible with the futur version of NeL. To get some NeL binary 3d files, you can:
Build a simple meshOk, First you will need to build a simple mesh. A mesh is a class that handle one 3d object. It contains the vertices, the primitives, and pointers on materials. The mesh class is NL3D::CMesh. The class NL3D::CMesh::CMeshBuild is used to build this mesh. Just fill it with appropriate values:
// Let's assume that those namespaces are used: NL3D, NLMISC // My building struct CMesh::CMeshBuild buildStruct; // Filling the struct.. ... // Create a CMesh CMesh myMesh; // Build the mesh myMesh.build (buildStruct); // Create a mesh for export CShapeStream streamableMesh (&myMesh) // Ok, ready to export You have normals, colors and uvs per vertex per triangle. Once you have filled all those values, call NL3D::CMesh::build() on the mesh. NL3D::CMesh::build() will optimize your corners by merging the same one. To simplify the serialization of a shape, use the class NL3D::CShapeStream construct with your shape pointer and serialize it. This class will serial a valid .shape file with header and polymorphic serialization of the shape, materials and textures. Here is the code of NL3D::CShapeStream::serial():
void CShapeStream::serial(NLMISC::IStream &f) throw(NLMISC::EStream) { // First, serial an header or checking if it is correct f.serialCheck ((uint32)'PAHS'); // Then, serial the shape f.serialPolyPtr (_Shape); // Ok, it's done } Your mesh is ready to export. It's coming.. Now you have build your data, you must know how to serial a NeL class. Let's assume that you want to read a landscape zone from a file:
// Let's assume that those namespaces are used: NL3D, NLMISC // Your object to load into CZone zone; // Create an input file stream CIFile fileIn; // Open your file for writing if (fileIn.open ("myZoneFile.zone")) { // Catch some error try { // Read your object zone.serial (fileIn); } catch (CException& except) { // Handle errors. File truncated, bad version, etc... } } Then how to write a shape in a file ? Easy too..
// Let's assume that those namespaces are used: NL3D, NLMISC // Your shape to write CShapeStream shape; // Create an output file stream COFile fileOut; // Open your file for writing if (fileOut.open ("myExportedFile.shape")) { // Catch some error try { // Write your object shape.serial (fileOut); } catch (CException& except) { // Handle error. Disk full, etc... } }
|