ParserVrml.cpp
Upload User: hcfgz168
Upload Date: 2011-09-11
Package Size: 116k
Code Size: 22k
Category:

OpenGL program

Development Platform:

WINDOWS

  1. //********************************************
  2. // ParserVrml.cpp
  3. // class CParserVrml
  4. //********************************************
  5. // pierre.alliez@cnet.francetelecom.fr
  6. // Created : 02/04/98
  7. // Modified : 02/04/98
  8. //********************************************
  9. #include "stdafx.h"
  10. #include "Base3d.h"
  11. #include "ParserVrml.h"
  12. //********************************************
  13. // Constructor
  14. //********************************************
  15. CParserVrml::CParserVrml()
  16. {
  17. m_pBuffer = NULL;
  18. m_pBufferWord[0] = '';
  19. m_pBufferLine[0] = '';
  20. m_IndexBuffer = 0;
  21. }
  22. //********************************************
  23. // Destructor
  24. //********************************************
  25. CParserVrml::~CParserVrml()
  26. {
  27. Free();
  28. }
  29. //********************************************
  30. // Destructor
  31. //********************************************
  32. void CParserVrml::Free(void)
  33. {
  34. if(m_pBuffer != NULL)
  35. delete [] m_pBuffer;
  36. m_IndexBuffer = 0;
  37. }
  38. //********************************************
  39. // Run
  40. //********************************************
  41. int CParserVrml::Run(char *filename,
  42.  CSceneGraph3d *pSceneGraph)
  43. {
  44. TRACE("n");
  45. TRACE("Start vrml parsern");
  46. TRACE("  file : %sn",filename);
  47. // Free
  48. TRACE("  free...");
  49. Free();
  50. TRACE("okn");
  51. // ReadFile
  52. if(!ReadFile(filename))
  53. return 0;
  54. // CheckVersion
  55. if(!CheckVersion())
  56. return 0;
  57. CountDef();
  58. CountMesh();
  59. while(OffsetToStringBeginLine("DEF"))
  60. ReadMesh(pSceneGraph);
  61. TRACE("End vrml parsern");
  62. TRACE("n");
  63. return 1;
  64. }
  65. //********************************************
  66. // ReadFile
  67. //********************************************
  68. int CParserVrml::ReadFile(char *filename)
  69. {
  70. m_FileName = filename;
  71. CFile file;
  72. CFileException ex;
  73. // Opening
  74. TRACE("  opening...");
  75. if(!file.Open(filename, CFile::modeRead | CFile::typeBinary,&ex))
  76. {
  77. #ifdef _DEBUG
  78.   afxDump << "File could not be opened " << ex.m_cause << "n";
  79. #endif
  80. TRACE("unable to open file for readingn");
  81. return 0;
  82. }
  83. TRACE("okn");
  84. // Size file
  85. m_SizeFile = file.GetLength();
  86. TRACE("  length : %d bytesn",m_SizeFile);
  87. // Alloc
  88. TRACE("  alloc...");
  89. m_pBuffer = new char[m_SizeFile];
  90. if(m_pBuffer == NULL)
  91. {
  92. TRACE("insuffisant memoryn");
  93. return 0;
  94. }
  95. TRACE("okn");
  96. // Reading
  97. TRACE("  reading...");
  98. TRY
  99. {
  100. file.Read(m_pBuffer,m_SizeFile);
  101. }
  102. CATCH(CFileException, e)
  103. {
  104. #ifdef _DEBUG
  105. afxDump << "Error during reading " << e->m_cause << "n";
  106. #endif
  107. TRACE("error during readingn");
  108. file.Close();
  109. return 0;
  110. }
  111. END_CATCH
  112. TRACE("okn");
  113. // Closing
  114. file.Close();
  115. return 1;
  116. }
  117. //********************************************
  118. // ReadLine
  119. // eol : 'n'
  120. // eos : ''
  121. //********************************************
  122. int CParserVrml::ReadLine()
  123. {
  124. m_pBufferLine[0] = '';
  125. int i=0;
  126. do
  127. m_pBufferLine[i++] = m_pBuffer[m_IndexBuffer++];
  128. while(m_pBuffer[m_IndexBuffer-1] != 'n' && 
  129.     i < MAX_LINE_VRML &&
  130. m_IndexBuffer < m_SizeFile);
  131. m_pBufferLine[i-1] = '';
  132. //TRACE("  line : %sn",m_pBufferLine);
  133. return 1;
  134. }
  135. //********************************************
  136. // ReadLine
  137. // eol : 'n'
  138. // eos : ''
  139. //********************************************
  140. int CParserVrml::ReadWord()
  141. {
  142. m_pBufferWord[0] = '';
  143. int i=0;
  144. // Jump to next valid character
  145. while((m_pBuffer[m_IndexBuffer] == 'n' || 
  146.      m_pBuffer[m_IndexBuffer] == 't' || 
  147.      m_pBuffer[m_IndexBuffer] == 'r' || 
  148.      m_pBuffer[m_IndexBuffer] == ' ') &&
  149.  m_IndexBuffer < m_SizeFile)
  150. m_IndexBuffer++;
  151. // Check eof
  152. if(m_IndexBuffer >= m_SizeFile)
  153. return 0;
  154. do
  155. m_pBufferWord[i++] = m_pBuffer[m_IndexBuffer++];
  156. while(m_pBuffer[m_IndexBuffer-1] != 'n' && 
  157.     m_pBuffer[m_IndexBuffer-1] != 't' && 
  158.     m_pBuffer[m_IndexBuffer-1] != 'r' && 
  159.     m_pBuffer[m_IndexBuffer-1] != ' ' && 
  160.     i < MAX_WORD_VRML &&
  161. m_IndexBuffer < m_SizeFile);
  162. m_pBufferWord[i-1] = '';
  163. //TRACE("  word : %sn",m_pBufferWord);
  164. return 1;
  165. }
  166. //********************************************
  167. // CheckVersion
  168. //********************************************
  169. int CParserVrml::CheckVersion()
  170. {
  171. ReadLine();
  172. TRACE("  check version (vrml 2.0)...");
  173. if(strstr(m_pBufferLine,"#VRML V2.0") != NULL)
  174. {
  175. TRACE("okn");
  176. return 1;
  177. }
  178. TRACE("invalidn");
  179. return 0;
  180. }
  181. //********************************************
  182. // CountDef
  183. //********************************************
  184. void CParserVrml::CountDef(void)
  185. {
  186. int tmp = m_IndexBuffer;
  187. int nb = 0;
  188. while(m_IndexBuffer < m_SizeFile)
  189. {
  190. ReadLine();
  191. if(strncmp(m_pBufferLine,"DEF",3) == 0)
  192. nb++;
  193. }
  194. TRACE("  %d objectsn",nb);
  195. m_IndexBuffer = tmp;
  196. }
  197. //********************************************
  198. // CountMesh
  199. //********************************************
  200. int CParserVrml::CountMesh(void)
  201. {
  202. int tmp = m_IndexBuffer;
  203. int nb = 0;
  204. while(m_IndexBuffer < m_SizeFile)
  205. {
  206. ReadLine();
  207. if(strstr(m_pBufferLine,"IndexedFaceSet") != NULL)
  208. nb++;
  209. }
  210. TRACE("  %d meshesn",nb);
  211. m_IndexBuffer = tmp;
  212. return nb;
  213. }
  214. //********************************************
  215. // OffsetToStringBeginLine
  216. //********************************************
  217. int CParserVrml::OffsetToStringBeginLine(char *string)
  218. {
  219. while(m_IndexBuffer < m_SizeFile)
  220. {
  221. ReadLine();
  222. if(strncmp(m_pBufferLine,string,strlen(string)) == 0)
  223. {
  224. m_IndexBuffer -= strlen(m_pBufferLine)+1;
  225. /*
  226. TRACE("  begin line : %c%c%c%c%c...n",m_pBuffer[m_IndexBuffer],
  227.                                      m_pBuffer[m_IndexBuffer+1],
  228.                                      m_pBuffer[m_IndexBuffer+2],
  229.                                      m_pBuffer[m_IndexBuffer+3],
  230.      m_pBuffer[m_IndexBuffer+4]);*/
  231. return 1;
  232. }
  233. }
  234. return 0;
  235. }
  236. //********************************************
  237. // OffsetToString
  238. //********************************************
  239. int CParserVrml::OffsetToString(char *string)
  240. {
  241. while(m_IndexBuffer < m_SizeFile)
  242. {
  243. ReadLine();
  244. char *adr = strstr(m_pBufferLine,string);
  245. if(strstr(m_pBufferLine,string) != NULL)
  246. {
  247. m_IndexBuffer = m_IndexBuffer - strlen(m_pBufferLine) - 1 + (adr-m_pBufferLine);
  248. ASSERT(m_IndexBuffer >= 0);
  249. /*
  250. TRACE("  offset to string : %c%c%c%c%c... IndexBuffer : %dn",m_pBuffer[m_IndexBuffer],
  251.                                              m_pBuffer[m_IndexBuffer+1], 
  252.                                            m_pBuffer[m_IndexBuffer+2],
  253.                                            m_pBuffer[m_IndexBuffer+3],
  254.            m_pBuffer[m_IndexBuffer+4],m_IndexBuffer);*/
  255. return 1;
  256. }
  257. }
  258. return 0;
  259. }
  260. //********************************************
  261. // OffsetToString
  262. //********************************************
  263. int CParserVrml::OffsetToStringBefore(char *string,
  264. char *before)
  265. {
  266. while(m_IndexBuffer < m_SizeFile)
  267. {
  268. ReadLine();
  269. char *adr = strstr(m_pBufferLine,string);
  270. if(strstr(m_pBufferLine,before) != NULL)
  271. return 0;
  272. if(strstr(m_pBufferLine,string) != NULL)
  273. {
  274. m_IndexBuffer = m_IndexBuffer - strlen(m_pBufferLine) - 1 + (adr-m_pBufferLine);
  275. ASSERT(m_IndexBuffer >= 0);
  276. /*
  277. TRACE("  offset to string : %c%c%c%c%c... IndexBuffer : %dn",m_pBuffer[m_IndexBuffer],
  278.                                              m_pBuffer[m_IndexBuffer+1], 
  279.                                            m_pBuffer[m_IndexBuffer+2],
  280.                                            m_pBuffer[m_IndexBuffer+3],
  281.            m_pBuffer[m_IndexBuffer+4],m_IndexBuffer);*/
  282. return 1;
  283. }
  284. }
  285. return 0;
  286. }
  287. //********************************************
  288. // CheckMesh
  289. //********************************************
  290. int CParserVrml::CheckMesh()
  291. {
  292. // Find a possible mesh
  293. TRACE("  check mesh...");
  294. OffsetToStringBeginLine("DEF");
  295. int tmp = m_IndexBuffer;
  296. ReadLine();
  297. if(strstr(m_pBufferLine,"DEF") != NULL && 
  298.    strstr(m_pBufferLine,"Transform") != NULL)
  299. {
  300. m_IndexBuffer = tmp;
  301. if(OffsetToString("Transform") &&
  302.    OffsetToString("Material") &&
  303.    OffsetToString("IndexedFaceSet"))
  304. {
  305. m_IndexBuffer = tmp;
  306. TRACE("okn");
  307. return 1;
  308. }
  309. }
  310. //m_IndexBuffer = tmp;
  311. TRACE("not a meshn");
  312. return 0;
  313. }
  314. //********************************************
  315. // ReadMesh
  316. //********************************************
  317. int CParserVrml::ReadMesh(CSceneGraph3d *pSceneGraph)
  318. {
  319. // Check
  320. if(!CheckMesh())
  321. return 0;
  322. int tmp = m_IndexBuffer;
  323. ReadLine();
  324. ASSERT(strstr(m_pBufferLine,"DEF") != NULL);
  325. ASSERT(strstr(m_pBufferLine,"Transform") != NULL);
  326. // DEF [name] Transform {
  327. if(sscanf(m_pBufferLine,"DEF %s Transform",m_pBufferWord) != 1)
  328. {
  329. TRACE("  invalid syntax (BufferLine : %s BufferWord : %sn",m_pBufferLine,m_pBufferWord);
  330. return 0;
  331. }
  332. TRACE("  start reading mesh %sn",m_pBufferWord);
  333. m_IndexBuffer = tmp;
  334. int IndexTexture = -1;
  335. // Transform
  336. //********************************************
  337. // Syntax :
  338. // Transform {
  339.   // translation -360.7 1370 3471
  340.   // rotation 0.3236 -0.3236 -0.8891 -1.688
  341.   // scale -49.36 -49.36 -49.36
  342.   // scaleOrientation -0.689 0.4766 -0.546 -0.6007
  343. OffsetToString("Transform");
  344. ReadLine(); // Transform
  345. CTransform transform;
  346. transform.Clear();
  347. // Translation
  348. tmp = m_IndexBuffer;
  349. ReadLine();
  350. if(strstr(m_pBufferLine,"translation") != NULL)
  351. {
  352. // Come back
  353. m_IndexBuffer = tmp;
  354. // Jump after "translation"
  355. ReadWord(); 
  356. float x,y,z;
  357. ReadWord();
  358. int success = sscanf(m_pBufferWord,"%f",&x);
  359. ReadWord();
  360. success &= sscanf(m_pBufferWord,"%f",&y);
  361. ReadWord();
  362. success &= sscanf(m_pBufferWord,"%f",&z);
  363. if(success)
  364. {
  365. transform.SetTranslation(CVector3d(x,y,z));
  366. TRACE("    translation : %g %g %gn",x,y,z);
  367. }
  368. ReadLine();
  369. tmp = m_IndexBuffer;
  370. ReadLine();
  371. }
  372. // Rotation
  373. if(strstr(m_pBufferLine,"rotation") != NULL)
  374. {
  375. // Come back
  376. m_IndexBuffer = tmp;
  377. // Jump after "rotation"
  378. ReadWord(); 
  379. float x,y,z,value;
  380. ReadWord();
  381. int success = sscanf(m_pBufferWord,"%f",&x);
  382. ReadWord();
  383. success &= sscanf(m_pBufferWord,"%f",&y);
  384. ReadWord();
  385. success &= sscanf(m_pBufferWord,"%f",&z);
  386. ReadWord();
  387. success &= sscanf(m_pBufferWord,"%f",&value);
  388. if(success)
  389. {
  390. transform.SetRotation(CVector3d(x,y,z));
  391. transform.SetValueRotation(value/3.1415926f*180.0f);
  392. TRACE("    rotation : %g %g %g %gn",x,y,z,value);
  393. }
  394. ReadLine();
  395. tmp = m_IndexBuffer;
  396. ReadLine();
  397. }
  398. // Scale
  399. if(strstr(m_pBufferLine,"scale") != NULL)
  400. {
  401. // Come back
  402. m_IndexBuffer = tmp;
  403. // Jump after "scale"
  404. ReadWord(); 
  405. float x,y,z;
  406. ReadWord();
  407. int success = sscanf(m_pBufferWord,"%f",&x);
  408. ReadWord();
  409. success &= sscanf(m_pBufferWord,"%f",&y);
  410. ReadWord();
  411. success &= sscanf(m_pBufferWord,"%f",&z);
  412. if(success)
  413. {
  414. transform.SetScale(CVector3d(x,y,z));
  415. TRACE("    scale : %g %g %gn",x,y,z);
  416. }
  417. ReadLine();
  418. tmp = m_IndexBuffer;
  419. ReadLine();
  420. }
  421. // ScaleOrientation
  422. if(strstr(m_pBufferLine,"scaleOrientation") != NULL)
  423. {
  424. // Come back
  425. m_IndexBuffer = tmp;
  426. // Jump after "scaleOrientation"
  427. ReadWord(); 
  428. float x,y,z,value;
  429. ReadWord();
  430. int success = sscanf(m_pBufferWord,"%f",&x);
  431. ReadWord();
  432. success &= sscanf(m_pBufferWord,"%f",&y);
  433. ReadWord();
  434. success &= sscanf(m_pBufferWord,"%f",&z);
  435. ReadWord();
  436. success &= sscanf(m_pBufferWord,"%f",&value);
  437. if(success)
  438. {
  439. //transform.SetScale(CVector3d(x,y,z));
  440. TRACE("    scaleOrientation : %g %g %g %gn",x,y,z,value);
  441. }
  442. ReadLine();
  443. }
  444. // Material
  445. //********************************************
  446. // appearance Appearance {
  447.   // material Material {
  448.   // diffuseColor 0.5686 0.1098 0.6941
  449. CMaterial material;
  450. if(OffsetToString("Material"))
  451. {
  452. ReadLine();
  453. tmp = m_IndexBuffer;
  454. // Diffuse color
  455. ReadLine(); 
  456. if(strstr(m_pBufferLine,"diffuseColor") != NULL)
  457. {
  458. // Come back
  459. m_IndexBuffer = tmp;
  460. // Jump
  461. ReadWord();
  462. float r,g,b;
  463. ReadWord();
  464. int success = sscanf(m_pBufferWord,"%f",&r);
  465. ReadWord();
  466. success &= sscanf(m_pBufferWord,"%f",&g);
  467. ReadWord();
  468. success &= sscanf(m_pBufferWord,"%f",&b);
  469. if(success)
  470. {
  471. material.SetDiffuse(r,g,b,1.0f);
  472. TRACE("    diffuseColor : %g %g %gn",r,g,b);
  473. }
  474. }
  475. }
  476. // Texture
  477. //********************************************
  478. int texture = 0;
  479. if(OffsetToStringBefore("texture ImageTexture","geometry"))
  480. {
  481. texture = 1;
  482. ReadLine();
  483. tmp = m_IndexBuffer;
  484. ReadLine(); 
  485. if(strstr(m_pBufferLine,"url") != NULL)
  486. {
  487. // Come back
  488. m_IndexBuffer = tmp;
  489. // Jump
  490. ReadWord();
  491. char string[MAX_PATH];
  492. ReadWord();
  493. int success = sscanf(m_pBufferWord,"%s",string);
  494. // Remove ""
  495. CString TextureName = string;
  496. TextureName = TextureName.Mid(1,TextureName.GetLength()-2);
  497. TRACE("    texture : %sn",TextureName);
  498. // Ask SceneGraph to add texture, if needed
  499. char *name = TextureName.GetBuffer(MAX_PATH);
  500. if(!pSceneGraph->HasTexture(name,&IndexTexture))
  501. {
  502. CTexture *pTexture = new CTexture;
  503. pTexture->ReadFile(name);
  504. IndexTexture = pSceneGraph->AddTexture(pTexture);
  505. }
  506. TextureName.ReleaseBuffer();
  507. }
  508. }
  509. else // come back
  510. m_IndexBuffer = tmp;
  511. // Mesh
  512. //********************************************
  513. int NbVertex,NbFace,NbTextureCoordinate;
  514. // Count size (do not offset in file)
  515. if(!SizeMesh(&NbVertex,&NbFace,texture,&NbTextureCoordinate))
  516. return 0;
  517. // Add mesh
  518. CMesh3d *pMesh = new CMesh3d;
  519. pSceneGraph->Add(pMesh);
  520. // Set Size (faster)
  521. pMesh->m_ArrayVertex.SetSize(NbVertex);
  522. pMesh->m_ArrayFace.SetSize(NbFace);
  523. if(texture)
  524. {
  525. pMesh->m_pTextureCoordinate = new float[NbTextureCoordinate*2]; // x y 
  526. pMesh->m_pTextureCoordinateIndex = new int[NbFace*3];           // triangular faces
  527. pMesh->m_IndexTexture = IndexTexture;
  528. }
  529. // Store mesh (offset in file)
  530. StoreMesh(&pMesh->m_ArrayVertex,&pMesh->m_ArrayFace,texture,
  531. pMesh->m_pTextureCoordinate,pMesh->m_pTextureCoordinateIndex);
  532. // Transform & material
  533. pMesh->SetTransform(transform);
  534. pMesh->SetMaterial(&material);
  535. TRACE("  end reading meshn");
  536. return 1;
  537. }
  538. //********************************************
  539. // SizeMesh
  540. //********************************************
  541. int CParserVrml::SizeMesh(int *pNbVertex,
  542. int *pNbFace,
  543. int HasTexture,
  544. int *pNbTextureCoordinate /* = NULL */)
  545. {
  546. TRACE("    size mesh...");
  547. int tmp = m_IndexBuffer;
  548. ASSERT(pNbVertex != NULL);
  549. ASSERT(pNbFace != NULL);
  550. if(!OffsetToString("IndexedFaceSet"))
  551. {
  552. TRACE("invalid meshn");
  553. return 0;
  554. }
  555. // Count points
  556. //***********************************************
  557. if(!OffsetToString("Coordinate { point ["))
  558. {
  559. TRACE("invalid meshn");
  560. return 0;
  561. }
  562. m_IndexBuffer += strlen("Coordinate { point [") + 1;
  563. // Cur : x y z,
  564. // End : x y z]
  565. int NbVertex = 0;
  566. int success;
  567. do
  568. {
  569. float x,y,z;
  570. ReadWord();
  571. success = sscanf(m_pBufferWord,"%f",&x);
  572. ReadWord();
  573. success &= sscanf(m_pBufferWord,"%f",&y);
  574. ReadWord();
  575. success &= sscanf(m_pBufferWord,"%f",&z);
  576. NbVertex += success;
  577. //TRACE("n (%g %g %g) ",x,y,z);
  578. }
  579. while(success);
  580. TRACE(" %d points,",NbVertex);
  581. if(NbVertex <= 0)
  582. return 0;
  583. // Count texture coordinates, if needed 
  584. //***********************************************
  585. int NbTextureCoordinate = 0;
  586. if(HasTexture)
  587. {
  588. if(!OffsetToString("TextureCoordinate { point ["))
  589. {
  590. TRACE("invalid texture coordinatesn");
  591. return 0;
  592. }
  593. m_IndexBuffer += strlen("TextureCoordinate { point [") + 1;
  594. // Cur : x y,
  595. // End : x y]
  596. int success;
  597. do
  598. {
  599. float x,y;
  600. ReadWord();
  601. success = sscanf(m_pBufferWord,"%f",&x);
  602. ReadWord();
  603. success &= sscanf(m_pBufferWord,"%f",&y);
  604. NbTextureCoordinate += success;
  605. //TRACE("n (%g %g %g) ",x,y,z);
  606. }
  607. while(success);
  608. TRACE(" %d texture coordinates,",NbTextureCoordinate);
  609. if(NbTextureCoordinate <= 0)
  610. return 0;
  611. }
  612. // Count faces, accept only triangles
  613. //***********************************************
  614. m_IndexBuffer = tmp;
  615. if(!OffsetToString("coordIndex ["))
  616. {
  617. TRACE("invalid meshn");
  618. return 0;
  619. }
  620. m_IndexBuffer += strlen("coordIndex [") + 1;
  621. // Cur : int, int, int, -1,
  622. // End : int, int, int, -1]
  623. int NbFace = 0;
  624. do
  625. {
  626. int v1,v2,v3;
  627. ReadWord();
  628. success  = sscanf(m_pBufferWord,"%d,",&v1);
  629. ReadWord();
  630. success &= sscanf(m_pBufferWord,"%d,",&v2);
  631. ReadWord();
  632. success &= sscanf(m_pBufferWord,"%d,",&v3);
  633. NbFace += success;
  634. ASSERT(v1 >= 0);
  635. ASSERT(v2 >= 0);
  636. ASSERT(v3 >= 0);
  637. int test;
  638. ReadWord();
  639. sscanf(m_pBufferWord,"%d",&test);
  640. if(strstr(m_pBufferWord,"]") != NULL)
  641. success = 0;
  642. }
  643. while(success);
  644. TRACE(" %d faces,",NbFace);
  645. if(NbFace <= 0)
  646. return 0;
  647. // Count texture coordinate index 
  648. //***********************************************
  649. if(HasTexture)
  650. {
  651. m_IndexBuffer = tmp;
  652. if(!OffsetToString("texCoordIndex ["))
  653. {
  654. TRACE("invalid texture coordinate indexn");
  655. return 0;
  656. }
  657. m_IndexBuffer += strlen("texCoordIndex [") + 1;
  658. // Cur : int, int, int, -1,
  659. // End : int, int, int, -1]
  660. int NbCoordIndex = 0;
  661. do
  662. {
  663. int v1,v2,v3;
  664. ReadWord();
  665. success  = sscanf(m_pBufferWord,"%d,",&v1);
  666. ReadWord();
  667. success &= sscanf(m_pBufferWord,"%d,",&v2);
  668. ReadWord();
  669. success &= sscanf(m_pBufferWord,"%d,",&v3);
  670. NbCoordIndex += success;
  671. ASSERT(v1 >= 0);
  672. ASSERT(v2 >= 0);
  673. ASSERT(v3 >= 0);
  674. int test;
  675. ReadWord();
  676. sscanf(m_pBufferWord,"%d",&test);
  677. if(strstr(m_pBufferWord,"]") != NULL)
  678. success = 0;
  679. }
  680. while(success);
  681. TRACE(" %d coordinate indexn",NbCoordIndex);
  682. if(NbFace != NbCoordIndex)
  683. {
  684. TRACE(" different values for coord index and facesn");
  685. return 0;
  686. }
  687. }
  688. // Store result
  689. *pNbVertex = NbVertex;
  690. *pNbFace = NbFace;
  691. if(HasTexture)
  692. *pNbTextureCoordinate = NbTextureCoordinate;
  693. m_IndexBuffer = tmp;
  694. return 1;
  695. }
  696. //********************************************
  697. // StoreMesh
  698. //********************************************
  699. int CParserVrml::StoreMesh(CArray3d<CVertex3d> *pArrayVertex,
  700.  CArray3d<CFace3d> *pArrayFace,
  701.  int HasTexture,
  702.  float *pTextureCoordinate,
  703.  int *pTextureCoordinateIndex)
  704. {
  705. TRACE("    store mesh...");
  706. int tmp = m_IndexBuffer;
  707. if(!OffsetToString("IndexedFaceSet"))
  708. {
  709. TRACE("invalid meshn");
  710. return 0;
  711. }
  712. // Store vertices
  713. //***********************************************
  714. if(!OffsetToString("Coordinate { point ["))
  715. {
  716. TRACE("invalid meshn");
  717. return 0;
  718. }
  719. m_IndexBuffer += strlen("Coordinate { point [") + 1;
  720. // Cur : x y z,
  721. // End : x y z]
  722. int success;
  723. int NbVertex = 0;
  724. do
  725. {
  726. float x,y,z;
  727. ReadWord();
  728. success = sscanf(m_pBufferWord,"%f",&x);
  729. ReadWord();
  730. success &= sscanf(m_pBufferWord,"%f",&y);
  731. ReadWord();
  732. success &= sscanf(m_pBufferWord,"%f",&z);
  733. if(success)
  734. pArrayVertex->SetAt(NbVertex++,new CVertex3d(x,y,z));
  735. //TRACE("n (%g %g %g) ",x,y,z);
  736. }
  737. while(success);
  738. TRACE(" added %d vertices,",NbVertex);
  739. // Store texture coordinates (if needed)
  740. //***********************************************
  741. if(HasTexture)
  742. {
  743. if(!OffsetToString("TextureCoordinate { point ["))
  744. {
  745. TRACE("invalid texture coordinaten");
  746. return 0;
  747. }
  748. m_IndexBuffer += strlen("TextureCoordinate { point [") + 1;
  749. // Cur : x y,
  750. // End : x y
  751. int success;
  752. int NbTextureCoordinate = 0;
  753. do
  754. {
  755. float x,y;
  756. ReadWord();
  757. success = sscanf(m_pBufferWord,"%f",&x);
  758. ReadWord();
  759. success &= sscanf(m_pBufferWord,"%f",&y);
  760. if(success)
  761. {
  762. pTextureCoordinate[2*NbTextureCoordinate] = x;
  763. pTextureCoordinate[2*NbTextureCoordinate+1] = y;
  764. NbTextureCoordinate++;
  765. }
  766. //TRACE("n (%g %g) ",x,y);
  767. }
  768. while(success);
  769. TRACE(" added %d texture coordinates,",NbTextureCoordinate);
  770. }
  771. // Store faces, accept only triangles
  772. //***********************************************
  773. m_IndexBuffer = tmp;
  774. if(!OffsetToString("coordIndex ["))
  775. {
  776. TRACE("invalid meshn");
  777. return 0;
  778. }
  779. m_IndexBuffer += strlen("coordIndex [") + 1;
  780. // Cur : int, int, int, -1,
  781. // End : int, int, int, -1]
  782. int NbFace = 0;
  783. do
  784. {
  785. int v1,v2,v3;
  786. ReadWord();
  787. success  = sscanf(m_pBufferWord,"%d,",&v1);
  788. ReadWord();
  789. success &= sscanf(m_pBufferWord,"%d,",&v2);
  790. ReadWord();
  791. success &= sscanf(m_pBufferWord,"%d,",&v3);
  792. ASSERT(v1 >= 0);
  793. ASSERT(v2 >= 0);
  794. ASSERT(v3 >= 0);
  795. if(success && v1 >= 0 && v2 >= 0 && v3 >= 0)
  796. {
  797. CFace3d *pFace = new CFace3d(pArrayVertex->GetAt(v1),
  798.                            pArrayVertex->GetAt(v2),
  799.  pArrayVertex->GetAt(v3));
  800. pArrayFace->SetAt(NbFace++,pFace);
  801. }
  802. int test;
  803. ReadWord();
  804. sscanf(m_pBufferWord,"%d",&test);
  805. if(strstr(m_pBufferWord,"]") != NULL)
  806. success = 0;
  807. }
  808. while(success);
  809. TRACE(" added %d facesn",NbFace);
  810. // Store texture coord index
  811. //***********************************************
  812. if(HasTexture)
  813. {
  814. m_IndexBuffer = tmp;
  815. if(!OffsetToString("texCoordIndex ["))
  816. {
  817. TRACE("invalid meshn");
  818. return 0;
  819. }
  820. m_IndexBuffer += strlen("texCoordIndex [") + 1;
  821. // Cur : int, int, int, -1,
  822. // End : int, int, int, -1]
  823. int NbTexCoordIndex = 0;
  824. do
  825. {
  826. int v1,v2,v3;
  827. ReadWord();
  828. success  = sscanf(m_pBufferWord,"%d,",&v1);
  829. ReadWord();
  830. success &= sscanf(m_pBufferWord,"%d,",&v2);
  831. ReadWord();
  832. success &= sscanf(m_pBufferWord,"%d,",&v3);
  833. ASSERT(v1 >= 0);
  834. ASSERT(v2 >= 0);
  835. ASSERT(v3 >= 0);
  836. if(success && v1 >= 0 && v2 >= 0 && v3 >= 0)
  837. {
  838. pTextureCoordinateIndex[3*NbTexCoordIndex] = v1;
  839. pTextureCoordinateIndex[3*NbTexCoordIndex+1] = v2;
  840. pTextureCoordinateIndex[3*NbTexCoordIndex+2] = v3;
  841. NbTexCoordIndex++;
  842. }
  843. int test;
  844. ReadWord();
  845. sscanf(m_pBufferWord,"%d",&test);
  846. if(strstr(m_pBufferWord,"]") != NULL)
  847. success = 0;
  848. }
  849. while(success);
  850. TRACE(" added %d texture coordinate indexn",NbTexCoordIndex);
  851. }
  852. return 1;
  853. }
  854. // ** EOF **