Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*
defines the bod_bob_parser - class that can parse bod format and create
bob_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"
class bod_bob_parser : public bod_parser_base
{
private:
struct texture_coord_t
{
int x;
int y;
int index;
};
struct texture_coords_t : public ext::simple_list<texture_coord_t*>
{
int flag;
texture_coord_t * findCoords(int x, int y)
{
for(iterator &it=begin(); it!=end(); ++it){
if(it->x==x && it->y==y)
return *it;
}
return 0;
}
~texture_coords_t()
{
for(iterator &it=begin(); it!=end(); ++it){
delete *it;
}
}
};
struct point_t : public ext::simple_list<texture_coords_t*>
{
int x, y, z;
point_t() {}
point_t(int x, int y, int z) { this->x=x; this->y=y; this->z=z; }
~point_t()
{
for(iterator &it=begin(); it!=end(); ++it){
delete *it;
}
}
texture_coords_t * findTextureCoords(int flag)
{
for(iterator &it=begin(); it!=end(); ++it){
if(it->flag==flag) return *it;
}
texture_coords_t *coords=new texture_coords_t();
coords->flag=flag;
push_back(coords);
return coords;
}
size_t pointCount() const
{
size_t c=0;
for(const_iterator &it=begin(); it!=end(); ++it){
c+=it->size();
}
return c;
}
};
protected:
const Settings *m_settings;
bool checkImmediatePlacement(const bod_bob_parser::token *token1, const bod_bob_parser::token *token2);
private:
typedef ext::simple_list<point_t*> PointList;
typedef ext::array<point_t*> PointArray;
typedef ext::array<bob_dom_weight*> WeightArray;
const bob_dom_materials *m_materials;
PointArray m_points;
WeightArray m_weights;
private:
bool loadMatRGB(token_stream& is, bob_dom_material5::rgb& rgb);
bool loadMatPair(token_stream& is, bob_dom_material5::pair& pair);
bool loadMatPair(token_stream& is, bob_dom_material6::Small::pair& pair);
bool loadMat(bob_dom_material5 *mat, token_stream &is);
bool loadMat(bob_dom_material6 *mat, token_stream &is);
bool loadMaterial(bob_dom_bob *bob, token_stream& is);
bool loadBody(bob_dom_bob *bob, token_stream& is);
bool loadPoints(bob_dom_body *body, token_stream& is, PointList& points);
bool loadPart(bob_dom_body *body, token_stream& is);
bool loadFace(int matIdx, bob_dom_body& body, bob_dom_part& part, token_stream& is);
bool flagsFromString(token_stream& is, int& flags);
material6_value * loadMat6Value(token_stream& is);
bool loadMaterial6Small(bob_dom_material6 *mat, token_stream &is);
bool loadMaterial6Big(bob_dom_material6 *mat, token_stream &is);
bool loadSpecialValues(bob_dom_point *points[3], int magic[3], token_stream& is);
bool loadSpecialPointValues(token_stream& is, bob_dom_point *point);
bool loadBones(bob_dom_body *body, token_stream& is);
bool loadWeights(bob_dom_body *body, token_stream& is);
bool loadSecondaryUVRecord(token_stream& is, bob_dom_part& part);
bool loadSecondaryUVs(token_stream& is, bob_dom_part& part);
bool loadX3PartValues(token_stream& is, bob_dom_part& part);
void deleteTempData()
{
for(PointArray::iterator &it=m_points.begin(); it!=m_points.end(); ++it){
delete *it;
}
m_points.clear();
for(WeightArray::iterator &it=m_weights.begin(); it!=m_weights.end(); ++it){
delete *it;
}
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, bob_dom_obinaryfilestream& os, bool bEmbedded);
};
#endif //!defined(BOD_BOB_PARSER_INCLUDED)