1 // Copyright (C) 2006-2012 Luke Hoschke
2 // This file is part of the "Irrlicht Engine".
3 // For conditions of distribution and use, see copyright notice in irrlicht.h
4 
5 // B3D Mesh loader
6 // File format designed by Mark Sibly for the Blitz3D engine and has been
7 // declared public domain
8 
9 #include "IrrCompileConfig.h"
10 
11 #ifndef __C_B3D_MESH_LOADER_H_INCLUDED__
12 #define __C_B3D_MESH_LOADER_H_INCLUDED__
13 
14 #include "IMeshLoader.h"
15 #include "ISceneManager.h"
16 #include "CSkinnedMesh.h"
17 #include "IReadFile.h"
18 
19 namespace irr
20 {
21 
22 namespace scene
23 {
24 
25 //! Meshloader for B3D format
26 class CB3DMeshFileLoader : public IMeshLoader
27 {
28 public:
29 
30 	//! Constructor
31 	CB3DMeshFileLoader(scene::ISceneManager* smgr);
32 
33 	//! returns true if the file maybe is able to be loaded by this class
34 	//! based on the file extension (e.g. ".bsp")
35 	virtual bool isALoadableFileExtension(const io::path& filename) const;
36 
37 	//! creates/loads an animated mesh from the file.
38 	//! \return Pointer to the created mesh. Returns 0 if loading failed.
39 	//! If you no longer need the mesh, you should call IAnimatedMesh::drop().
40 	//! See IReferenceCounted::drop() for more information.
41 	virtual IAnimatedMesh* createMesh(io::IReadFile* file);
42 
43 private:
44 
45 	struct SB3dChunkHeader
46 	{
47 		c8 name[4];
48 		s32 size;
49 	};
50 
51 	struct SB3dChunk
52 	{
SB3dChunkSB3dChunk53 		SB3dChunk(const SB3dChunkHeader& header, long sp)
54 			: length(header.size+8), startposition(sp)
55 		{
56 			name[0]=header.name[0];
57 			name[1]=header.name[1];
58 			name[2]=header.name[2];
59 			name[3]=header.name[3];
60 		}
61 
62 		c8 name[4];
63 		s32 length;
64 		long startposition;
65 	};
66 
67 	struct SB3dTexture
68 	{
69 		core::stringc TextureName;
70 		s32 Flags;
71 		s32 Blend;
72 		f32 Xpos;
73 		f32 Ypos;
74 		f32 Xscale;
75 		f32 Yscale;
76 		f32 Angle;
77 	};
78 
79 	struct SB3dMaterial
80 	{
SB3dMaterialSB3dMaterial81 		SB3dMaterial() : red(1.0f), green(1.0f),
82 			blue(1.0f), alpha(1.0f), shininess(0.0f), blend(1),
83 			fx(0)
84 		{
85 			for (u32 i=0; i<video::MATERIAL_MAX_TEXTURES; ++i)
86 				Textures[i]=0;
87 		}
88 		video::SMaterial Material;
89 		f32 red, green, blue, alpha;
90 		f32 shininess;
91 		s32 blend,fx;
92 		SB3dTexture *Textures[video::MATERIAL_MAX_TEXTURES];
93 	};
94 
95 	bool load();
96 	bool readChunkNODE(CSkinnedMesh::SJoint* InJoint);
97 	bool readChunkMESH(CSkinnedMesh::SJoint* InJoint);
98 	bool readChunkVRTS(CSkinnedMesh::SJoint* InJoint);
99 	bool readChunkTRIS(scene::SSkinMeshBuffer *MeshBuffer, u32 MeshBufferID, s32 Vertices_Start);
100 	bool readChunkBONE(CSkinnedMesh::SJoint* InJoint);
101 	bool readChunkKEYS(CSkinnedMesh::SJoint* InJoint);
102 	bool readChunkANIM();
103 	bool readChunkTEXS();
104 	bool readChunkBRUS();
105 
106 	void loadTextures(SB3dMaterial& material) const;
107 
108 	void readString(core::stringc& newstring);
109 	void readFloats(f32* vec, u32 count);
110 
111 	core::array<SB3dChunk> B3dStack;
112 
113 	core::array<SB3dMaterial> Materials;
114 	core::array<SB3dTexture> Textures;
115 
116 	core::array<s32> AnimatedVertices_VertexID;
117 
118 	core::array<s32> AnimatedVertices_BufferID;
119 
120 	core::array<video::S3DVertex2TCoords> BaseVertices;
121 
122 	ISceneManager*	SceneManager;
123 	CSkinnedMesh*	AnimatedMesh;
124 	io::IReadFile*	B3DFile;
125 
126 	//B3Ds have Vertex ID's local within the mesh I don't want this
127 	// Variable needs to be class member due to recursion in calls
128 	u32 VerticesStart;
129 
130 	bool NormalsInFile;
131 	bool HasVertexColors;
132 	bool ShowWarning;
133 };
134 
135 
136 } // end namespace scene
137 } // end namespace irr
138 
139 #endif // __C_B3D_MESH_LOADER_H_INCLUDED__
140 
141