mesh.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. #include "mesh.h"
  2. #include "renderer.h"
  3. #include "resource.h"
  4. #include "Scanner.h"
  5. #include "parser.h"
  6. //=====================================================================================================================================
  7. // Load =
  8. //=====================================================================================================================================
  9. bool mesh_t::Load( const char* filename )
  10. {
  11. Scanner scanner;
  12. if( !scanner.loadFile( filename ) ) return false;
  13. const Scanner::Token* token;
  14. //** MATERIAL **
  15. token = &scanner.getNextToken();
  16. if( token->code != Scanner::TC_STRING )
  17. {
  18. PARSE_ERR_EXPECTED( "string" );
  19. return false;
  20. }
  21. material_name = token->value.string;
  22. //** DP_MATERIAL **
  23. /*token = &scanner.getNextToken();
  24. if( token->code != Scanner::TC_STRING )
  25. {
  26. PARSE_ERR_EXPECTED( "string" );
  27. return false;
  28. }
  29. dp_material_name = token->value.string;*/
  30. //** VERTS **
  31. // verts num
  32. token = &scanner.getNextToken();
  33. if( token->code != Scanner::TC_NUMBER || token->type != Scanner::DT_INT )
  34. {
  35. PARSE_ERR_EXPECTED( "integer" );
  36. return false;
  37. }
  38. vert_coords.resize( token->value.int_ );
  39. // read the verts
  40. for( uint i=0; i<vert_coords.size(); i++ )
  41. {
  42. if( !ParseArrOfNumbers<float>( scanner, false, true, 3, &vert_coords[i][0] ) ) return false;
  43. }
  44. //** FACES **
  45. // faces num
  46. token = &scanner.getNextToken();
  47. if( token->code != Scanner::TC_NUMBER || token->type != Scanner::DT_INT )
  48. {
  49. PARSE_ERR_EXPECTED( "integer" );
  50. return false;
  51. }
  52. tris.resize( token->value.int_ );
  53. // read the faces
  54. for( uint i=0; i<tris.size(); i++ )
  55. {
  56. if( !ParseArrOfNumbers<uint>( scanner, false, true, 3, tris[i].vert_ids ) ) return false;
  57. }
  58. //** UVS **
  59. // UVs num
  60. token = &scanner.getNextToken();
  61. if( token->code != Scanner::TC_NUMBER || token->type != Scanner::DT_INT )
  62. {
  63. PARSE_ERR_EXPECTED( "integer" );
  64. return false;
  65. }
  66. tex_coords.resize( token->value.int_ );
  67. // read the tex_coords
  68. for( uint i=0; i<tex_coords.size(); i++ )
  69. {
  70. if( !ParseArrOfNumbers( scanner, false, true, 2, &tex_coords[i][0] ) ) return false;
  71. }
  72. //** VERTEX WEIGHTS **
  73. token = &scanner.getNextToken();
  74. if( token->code != Scanner::TC_NUMBER || token->type != Scanner::DT_INT )
  75. {
  76. PARSE_ERR_EXPECTED( "integer" );
  77. return false;
  78. }
  79. vert_weights.resize( token->value.int_ );
  80. for( uint i=0; i<vert_weights.size(); i++ )
  81. {
  82. // get the bone connections num
  83. token = &scanner.getNextToken();
  84. if( token->code != Scanner::TC_NUMBER || token->type != Scanner::DT_INT )
  85. {
  86. PARSE_ERR_EXPECTED( "integer" );
  87. return false;
  88. }
  89. // we treat as error if one vert doesnt have a bone
  90. if( token->value.int_ < 1 )
  91. {
  92. ERROR( "Vert \"" << i << "\" doesnt have at least one bone" );
  93. return false;
  94. }
  95. // and here is another possible error
  96. if( token->value.int_ > vertex_weight_t::MAX_BONES_PER_VERT )
  97. {
  98. ERROR( "Cannot have more than " << vertex_weight_t::MAX_BONES_PER_VERT << " bones per vertex" );
  99. return false;
  100. }
  101. vert_weights[i].bones_num = token->value.int_;
  102. // for all the weights of the current vertes
  103. for( uint j=0; j<vert_weights[i].bones_num; j++ )
  104. {
  105. // read bone id
  106. token = &scanner.getNextToken();
  107. if( token->code != Scanner::TC_NUMBER || token->type != Scanner::DT_INT )
  108. {
  109. PARSE_ERR_EXPECTED( "integer" );
  110. return false;
  111. }
  112. vert_weights[i].bone_ids[j] = token->value.int_;
  113. // read the weight of that bone
  114. token = &scanner.getNextToken();
  115. if( token->code != Scanner::TC_NUMBER || token->type != Scanner::DT_FLOAT )
  116. {
  117. PARSE_ERR_EXPECTED( "float" );
  118. return false;
  119. }
  120. vert_weights[i].weights[j] = token->value.float_;
  121. }
  122. }
  123. // Sanity checks
  124. if( vert_coords.size()<1 || tris.size()<1 )
  125. {
  126. ERROR( "Vert coords and tris must be filled \"" << filename << "\"" );
  127. return false;
  128. }
  129. if( tex_coords.size()!=0 && tex_coords.size()!=vert_coords.size() )
  130. {
  131. ERROR( "Tex coords num must be zero or equal to vertex coords num \"" << filename << "\"" );
  132. return false;
  133. }
  134. if( vert_weights.size()!=0 && vert_weights.size()!=vert_coords.size() )
  135. {
  136. ERROR( "Vert weights num must be zero or equal to vertex coords num \"" << filename << "\"" );
  137. return false;
  138. }
  139. CreateAllNormals();
  140. if( tex_coords.size() > 0 ) CreateVertTangents();
  141. CreateVertIndeces();
  142. CreateVBOs();
  143. CalcBSphere();
  144. return true;
  145. }
  146. //=====================================================================================================================================
  147. // Unload =
  148. //=====================================================================================================================================
  149. void mesh_t::Unload()
  150. {
  151. // ToDo: add when finalized
  152. }
  153. //=====================================================================================================================================
  154. // CreateFaceNormals =
  155. //=====================================================================================================================================
  156. void mesh_t::CreateVertIndeces()
  157. {
  158. DEBUG_ERR( vert_indeces.size() > 0 );
  159. vert_indeces.resize( tris.size() * 3 );
  160. for( uint i=0; i<tris.size(); i++ )
  161. {
  162. vert_indeces[i*3+0] = tris[i].vert_ids[0];
  163. vert_indeces[i*3+1] = tris[i].vert_ids[1];
  164. vert_indeces[i*3+2] = tris[i].vert_ids[2];
  165. }
  166. }
  167. //=====================================================================================================================================
  168. // CreateFaceNormals =
  169. //=====================================================================================================================================
  170. void mesh_t::CreateFaceNormals()
  171. {
  172. for( uint i=0; i<tris.size(); i++ )
  173. {
  174. triangle_t& tri = tris[i];
  175. const vec3_t& v0 = vert_coords[ tri.vert_ids[0] ];
  176. const vec3_t& v1 = vert_coords[ tri.vert_ids[1] ];
  177. const vec3_t& v2 = vert_coords[ tri.vert_ids[2] ];
  178. tri.normal = ( v1 - v0 ).Cross( v2 - v0 );
  179. tri.normal.Normalize();
  180. }
  181. }
  182. //=====================================================================================================================================
  183. // CreateVertNormals =
  184. //=====================================================================================================================================
  185. void mesh_t::CreateVertNormals()
  186. {
  187. vert_normals.resize( vert_coords.size() ); // alloc
  188. for( uint i=0; i<vert_coords.size(); i++ )
  189. vert_normals[i] = vec3_t( 0.0, 0.0, 0.0 );
  190. for( uint i=0; i<tris.size(); i++ )
  191. {
  192. const triangle_t& tri = tris[i];
  193. vert_normals[ tri.vert_ids[0] ] += tri.normal;
  194. vert_normals[ tri.vert_ids[1] ] += tri.normal;
  195. vert_normals[ tri.vert_ids[2] ] += tri.normal;
  196. }
  197. for( uint i=0; i<vert_normals.size(); i++ )
  198. vert_normals[i].Normalize();
  199. }
  200. //=====================================================================================================================================
  201. // CreateVertTangents =
  202. //=====================================================================================================================================
  203. void mesh_t::CreateVertTangents()
  204. {
  205. vert_tangents.resize( vert_coords.size() ); // alloc
  206. vec_t<vec3_t> bitagents( vert_coords.size() );
  207. for( uint i=0; i<vert_tangents.size(); i++ )
  208. {
  209. vert_tangents[i] = vec4_t( 0.0 );
  210. bitagents[i] = vec3_t( 0.0 );
  211. }
  212. for( uint i=0; i<tris.size(); i++ )
  213. {
  214. const triangle_t& tri = tris[i];
  215. const int i0 = tri.vert_ids[0];
  216. const int i1 = tri.vert_ids[1];
  217. const int i2 = tri.vert_ids[2];
  218. const vec3_t& v0 = vert_coords[ i0 ];
  219. const vec3_t& v1 = vert_coords[ i1 ];
  220. const vec3_t& v2 = vert_coords[ i2 ];
  221. vec3_t edge01 = v1 - v0;
  222. vec3_t edge02 = v2 - v0;
  223. vec2_t uvedge01 = tex_coords[i1] - tex_coords[i0];
  224. vec2_t uvedge02 = tex_coords[i2] - tex_coords[i0];
  225. float det = (uvedge01.y * uvedge02.x) - (uvedge01.x * uvedge02.y);
  226. DEBUG_ERR( IsZero(det) );
  227. det = 1.0f / det;
  228. vec3_t t = ( edge02 * uvedge01.y - edge01 * uvedge02.y ) * det;
  229. vec3_t b = ( edge02 * uvedge01.x - edge01 * uvedge02.x ) * det;
  230. t.Normalize();
  231. b.Normalize();
  232. vert_tangents[i0] += vec4_t(t, 1.0);
  233. vert_tangents[i1] += vec4_t(t, 1.0);
  234. vert_tangents[i2] += vec4_t(t, 1.0);
  235. bitagents[i0] += b;
  236. bitagents[i1] += b;
  237. bitagents[i2] += b;
  238. }
  239. for( uint i=0; i<vert_tangents.size(); i++ )
  240. {
  241. vec3_t t = vec3_t(vert_tangents[i]);
  242. const vec3_t& n = vert_normals[i];
  243. vec3_t& b = bitagents[i];
  244. //t = t - n * n.Dot(t);
  245. t.Normalize();
  246. b.Normalize();
  247. float w = ( (n.Cross(t)).Dot( b ) < 0.0) ? 1.0 : -1.0;
  248. vert_tangents[i] = vec4_t( t, w );
  249. }
  250. bitagents.clear();
  251. }
  252. //=====================================================================================================================================
  253. // CreateVBOs =
  254. //=====================================================================================================================================
  255. void mesh_t::CreateVBOs()
  256. {
  257. vbos.vert_indeces.Create( GL_ELEMENT_ARRAY_BUFFER, vert_indeces.GetSizeInBytes(), &vert_indeces[0], GL_STATIC_DRAW );
  258. vbos.vert_coords.Create( GL_ARRAY_BUFFER, vert_coords.GetSizeInBytes(), &vert_coords[0], GL_STATIC_DRAW );
  259. vbos.vert_normals.Create( GL_ARRAY_BUFFER, vert_normals.GetSizeInBytes(), &vert_normals[0], GL_STATIC_DRAW );
  260. if( vert_tangents.size() > 1 )
  261. vbos.vert_tangents.Create( GL_ARRAY_BUFFER, vert_tangents.GetSizeInBytes(), &vert_tangents[0], GL_STATIC_DRAW );
  262. if( tex_coords.size() > 1 )
  263. vbos.tex_coords.Create( GL_ARRAY_BUFFER, tex_coords.GetSizeInBytes(), &tex_coords[0], GL_STATIC_DRAW );
  264. if( vert_weights.size() > 1 )
  265. vbos.vert_weights.Create( GL_ARRAY_BUFFER, vert_weights.GetSizeInBytes(), &vert_weights[0], GL_STATIC_DRAW );
  266. }
  267. //=====================================================================================================================================
  268. // CalcBSphere =
  269. //=====================================================================================================================================
  270. void mesh_t::CalcBSphere()
  271. {
  272. bsphere.Set( &vert_coords[0], 0, vert_coords.size() );
  273. }