====== Shape specifications ======
===== A Shape in the code =====
Following notes are only a draft and work in progress!
--- //[[user:siela1915|Sit Melai]] 2016/12/05 19:37//
==== How a shape is optimally created ====
To fill a shape, you have to fill the CMesh::CMeshBuild (structure explained below). Then you can call build on a CMesh object with your CMesh::CMeshBuild object as parameter. The CMesh object generated from this can be written into a file by opening a COFile stream and calling the serial method on the CMesh with your stream as paremeter.
==== How it is serialized in the code (using serial()) ====
CShapeStream::serial(NLMISC::IStream &f) // called by NLMISC::IStream.serial(CShapeStream)
f.serialCheck( NELID( "PAHS" ) ) // NELID converts the string to a uint32
f.serialPolyPtr( _Shape ) // _Shape is a property of the CShapeStream object
// both functions above can be found in stream.h
serialCheck(const T &value) // in stream.h
read and compare to value
or
write value
serialPolyPtr(T* &ptr) // in stream.h
create IStreamable pointer p from ptr
serialIStreamable(p) // in stream.h
static_cast p back to type T and assign to ptr
IStream::serialIStreamable(IStreamable* &ptr) // in stream.cpp
if reading
serial a uint64
result is 0 -> set ptr to NULL and end
else
Check if object already created or read
if not
serial a string className
set ptr to CClassRegistry::create(className) dynamic_cast to IStreamable*
if ptr is null
throw error
else
check ptr is valid object with CClassREgistry::checkObject
Insert into the _IdMap
ptr->serial(*this) // Should call IStreamable::serial which is equal to class of this::serial(IStream &f)
==== How CMeshBuild struct looks like ====
CMesh::CMeshBuild structure (mesh.h)
sint32 VertexFlags
uint8 NumCoords[CVertexBuffer::MaxStage] // how many coordinates each uvw uses (2 or 3)
uint8 UVRouting[CVertexBuffer::MaxStage] // uv routing table, each uv channel can be routed to any vertex uv
std::vector Vertices
std::vector SkinWeights // same size as Vertices, NULL if no skinning (Palette Skinning Vertices array?)
std::vector BonesNames // each matrix id in SkinWeights must have a corresponding entry in bone name entry
std::vector Faces
std::vector BlendShapes
std::vector VertLink // Link between VB and max vertex index, will be filled by build
NLMISC::CSmartPtr MeshVertexProgram // MeshVertexProgram to be copied to meshGeom
std::vector Interfaces // Mesh Interface System for MRM building
std::vector InterfaceLinks // Same size as Vertices, or Mesh Interface system disabled
NLMISC::CBitSet InterfaceVertexFlag // each bit indicates if vertex belongs to an interface
CMeshBuild() // build a CMesh
NLMISC::CVector (vector.h)
float x
float y
float z
CVector(x, y, z)
// all mathematic standard operations and more
NL3D_MESH_SKINNING_MAX_MATRIX = 4 (mesh.h)
CMesh::CSkinWeight (mesh.h) // if you don't use all matrix set 0 on weights you don't use
uint32 MatrixId[NL3D_MESH_SKINNING_MAX_MATRIX] // which matrix of skeleton shape this vertexuses
float Weights[NL3D_MESH_SKINNING_MAX_MATRIX] // sum of all entries should be 1
CMesh::CFace (mesh.h)
NLMISC::CCorner Corner[3]
sint32 MaterialId
sint32 SmoothGroup
CMesh::CCorner (mesh.h)
sint32 Vertex // id of the vertex
NLMISC::CVector Normal
NLMISC::CUVW Uvws[CVertexBuffer::MaxStage]
NLMISC::CRGBA Color
NLMISC::CRGBA Specular
NLMISC::CUVW (uv.h)
float u
float v
float w
CUVW(u, v, w)
// all mathematic standard operations and more
NLMISC::CRGBA (rgba.h)
uint8 R
uint8 G
uint8 B
uint8 A
CRGBA(R, G, B, A = 255)
NL3D::CBlendShape (mesh_morpher.h)
std::string Name
std::vector deltaPos
std::vector deltaNorm
std::vector deltaTgSpace
std::vector deltaUV
std::vector deltaCol
std::vector VertRefs // Array of vertices references
NLMISC::CUV
NLMISC::RGBAF
CMesh::CVertLink (mesh.h)
uint32 nFace
uint32 nCorner
uint32 VertVB
CVertLink(nFace, nCorner, VertVB)
CMesh::CInterface (mesh.h)
std::vector Vertices // polygon of interface between 2 meshs
CMesh::CInterfaceVertex (mesh.h)
CVector Pos
CVector Normal
CMesh::CInterfaceLink (mesh.h)
sint InterfaceId // id of the interface this vertex is welded to
uint InterfaceVertexId // id of the vertex this vertex is welded to
==== The .shape format ====
You want to make your own importer/exporter for .shape files? Take a look at the structure of the .shape format.
Not finished yet, missing some parts that can be parsed as PolyPtr! WIP!
--- //[[user:siela1915|Sit Melai]] 2016/12/11 16:48//
Check [[en:nel_files|Nel Files Documentation]] for how to serialize each class:
Base class for start is **CShapeStream**.
You need all classes that are called from this class, and following classes (or child classes) for PolyPtr:
* **ITexture**
* **IMeshVertexProgram** (CMeshVPWindTree, CMeshVPPerPixelLight)
* **IShape** (CMesh, CMeshBase, CMeshMRM, CMeshMRMSkinned, CMeshMultiLod)
{{tag>Tag_a_ajouter}}