Rev 1 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*defines the bod_bob_parser - class that can parse bod format and createbob_dom_bob object*/#ifndef BOD_BOB_PARSER_INCLUDED#define BOD_BOB_PARSER_INCLUDED#include "bob_dom_bob.h"#include "bod_text_parser.h"#include "token_stream.h"#include "settings.h"#include "bod_parser_base.h"#include "../common/ptr_list.h"#include "geometry.h"class bod_bob_parser : public bod_parser_base{private:struct SameVertices;struct SameSG_UVs;struct uv_coord : geometry::point2d<double>{friend SameSG_UVs;private:static geometry::point2d<double> NULL_COORDS;bool isNull () const { return *this==NULL_COORDS; }public:SameSG_UVs *parent;int vertexIndex;uv_coord(SameSG_UVs *p, double x, double y): geometry::point2d<double>(x,y), parent(p) { }bob_vertex * createBOBVertex(){bob_vertex *v=new bob_vertex(parent->parent->x, parent->parent->y, parent->parent->z);v->sgbits=parent->sgbits;if(!isNull()){v->textureCoords.x=x;v->textureCoords.y=y;v->flags|=bob_vertex::FLAG_UV;}return v;}};struct SameSG_UVs : public ptr_list<ext::simple_list<uv_coord*> >{public:SameVertices *parent;int sgbits;SameSG_UVs (SameVertices *p, int sg): sgbits(sg) { parent=p; }uv_coord * findUV(double x, double y){for(iterator &it=begin(); it!=end(); ++it){if(it->x==x && it->y==y)return *it;}return 0;}uv_coord * createUV(double x, double y){uv_coord *uv=new uv_coord(this, x,y);push_back(uv);return uv;}uv_coord * findNullUV(){return findUV(uv_coord::NULL_COORDS.x, uv_coord::NULL_COORDS.y);}uv_coord * createNullUV(){return createUV(uv_coord::NULL_COORDS.x, uv_coord::NULL_COORDS.y);}};struct SameVertices : public vertex, public ptr_list<ext::simple_list<SameSG_UVs*> >{SameVertices(int x, int y, int z){this->x=conversion::vertex_bod2bob(x);this->y=conversion::vertex_bod2bob(y);this->z=conversion::vertex_bod2bob(z);}SameSG_UVs * findTextureCoords(int sgbits){for(iterator &it=begin(); it!=end(); ++it){//if(it->sgbits==sgbits) return *it;/* changed and not tested - taken from max2msh by mindblast */if(it->sgbits & sgbits) return *it;}SameSG_UVs *uvs=new SameSG_UVs(this, sgbits);push_back(uvs);return uvs;}};protected:const Settings *m_settings;bool checkImmediatePlacement(const bod_bob_parser::token *token1, const bod_bob_parser::token *token2);private:typedef ext::simple_list<SameVertices*> VertexList;typedef ptr_list<ext::array<SameVertices*> > VertexArray;typedef ptr_list<ext::array<bob_weight*> > WeightArray;const bob_materials *m_materials;VertexArray m_vertices;WeightArray m_weights;private:bool loadMatRGB(token_stream& is, bob_material5::rgb& rgb);bool loadMatPair(token_stream& is, bob_material5::pair& pair);bool loadMatPair(token_stream& is, bob_material6::Small::pair& pair);bool loadMat(bob_material5 *mat, token_stream &is);bool loadMat(bob_material6 *mat, token_stream &is);bool loadMaterial(bob_dom_bob *bob, token_stream& is);bool loadBody(bob_dom_bob *bob, token_stream& is);bool loadVertices(bob_body *body, token_stream& is, VertexList& points);bool loadPart(bob_body *body, token_stream& is);bool loadFace(int matIdx, bob_body& body, bob_part& part, token_stream& is);bool flagsFromString(token_stream& is, int& flags);void computeVertexTangents(bob_body& body);material6_value * loadMat6Value(token_stream& is);bool loadMaterial6Small(bob_material6 *mat, token_stream &is);bool loadMaterial6Big(bob_material6 *mat, token_stream &is);bool loadSpecialValues(bob_vertex *points[3], token_stream& is);bool loadSpecialPointValues(token_stream& is, bob_vertex *point);bool loadFaceNormal(token_stream& is, bob_vertex *points[3]);bool loadBones(bob_body *body, token_stream& is);bool loadWeights(bob_body *body, token_stream& is);bool loadCollisionBoxData(token_stream& is, bob_part& part);void deleteTempData(){m_vertices.clear();m_weights.clear();}public:bod_bob_parser(const Settings *settings) { m_settings=settings; }~bod_bob_parser() { deleteTempData(); }bob_dom_bob * loadBOB(token_stream& is, bool bEmbedded);bool compile(token_stream& is, obinaryfilestream& os, bool bEmbedded);};#endif //!defined(BOD_BOB_PARSER_INCLUDED)