Subversion Repositories spk

Rev

Rev 1 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "bob_dom_frame.h"
//---------------------------------------------------------------------------------
bool bob_frame::Position::toFile(otextfilestream & os)
{
        os << noSemicolons << x << ';' << y << ';' << z << "; ";
        return os.good();
}
//---------------------------------------------------------------------------------
bool bob_frame::rgb::load(ibinaryfilestream& is)
{
        if(!is.good()) return false;
        is >> r >> g >> b;
        return !is.fail();
}
//---------------------------------------------------------------------------------
bool bob_frame::rgb::toFile(otextfilestream & os)
{
        os << noSemicolons << r << ';' << g << ';' << b << "; ";
        return os.good();
}
//---------------------------------------------------------------------------------
bool bob_frame::rgb::toFile(obinaryfilestream& os)
{
        os << r << g << b;
        return os.good();
}
//---------------------------------------------------------------------------------
bool bob_frame::AngleAxis::load(ibinaryfilestream& is)
{
        if(!is.good()) return false;
        is >> angle >> x >> y >> z;

        return(!is.fail());
}
//---------------------------------------------------------------------------------
bool bob_frame::AngleAxis::toFile(otextfilestream& os)
{
        os << noSemicolons << angle << ';' << x << ';' << y << ';' << z << "; ";
        return os.good();
}
//---------------------------------------------------------------------------------
bool bob_frame::AngleAxis::toFile(obinaryfilestream& os)
{
        os << angle << x << y << z;
        return os.good();
}
//---------------------------------------------------------------------------------
bool bob_frame::tcb_info::load(ibinaryfilestream& is)
{
        if(!is.good()) return false;
        is >> tension >> continuity >> bias >> easeFrom >> easeTo;
        return !is.fail();
}
//---------------------------------------------------------------------------------
bool bob_frame::tcb_info::toFile(otextfilestream & os)
{
        os << noSemicolons;
        os << tension << ';' << continuity << ';' << bias << ';' << easeFrom << ';' << easeTo << "; ";
        return os.good();
}
//---------------------------------------------------------------------------------
bool bob_frame::tcb_info::toFile(obinaryfilestream& os)
{
        os << tension << continuity << bias << easeFrom << easeTo;
        return os.good();
}
//---------------------------------------------------------------------------------
bool bob_frame::load(ibinaryfilestream& is)
{
        is >> flags;

        // if we don't know some bits in the flags, the load will probably fail but not necessarily
        if((flags & ~flagMask) > 0)
                error(s_warning, e_unsupportedFrameFlags, "0x%X - unsupported bits set in frame flags", flags);

        // these flags are "known" but they were never found so I don't know how to treat them
        if(flags & CUT_F_POSBEZINFO)
                error(s_warning, e_unsupportedFrameFlags, "0x%X: CUT_F_POSBEZINFO encountered - don't know how to output", flags);
        if(flags & CUT_F_SAMESCALE)
                error(s_warning, e_unsupportedFrameFlags, "0x%X: CUT_F_SAMESCALE encountered", flags);

        if((flags & CUT_F_SAMEPOS)==0){
                if(position.load(is)==false) { error(e_notEnoughData, "Error loading position"); return false; }
                if((flags & CUT_F_POSTCBINFO) > 0) {
                        pos_tcb_info=new tcb_info();
                        if(pos_tcb_info->load(is)==false) { error(e_notEnoughData, "Error loading position TCB data"); return false; }
                }
        }
        if((flags & CUT_F_SAMEROT)==0 && (flags & CUT_F_ROT) > 0){
                rotation=new AngleAxis();
                if(rotation->load(is)==false) { error(e_notEnoughData, "Error loading rotation"); return false; }
                if((flags & CUT_F_ROTTCBINFO) > 0) {
                        rot_tcb_info=new tcb_info();
                        if(rot_tcb_info->load(is)==false) { error(e_notEnoughData, "Error loading rotation TCB data"); return false; }
                }
        }
        if((flags & CUT_F_TARGETPOS) > 0) {
                if((flags & CUT_F_SAMETARGET) == 0){
                        targetPos=new Position();
                        if(targetPos->load(is)==false) { error(e_notEnoughData, "Error loading target position data"); return false; }
                }
                if((flags & CUT_F_SAMEROT) == 0){
                        is >> rollAngle;
                        if(is.fail()) { error(e_notEnoughData, "Error loading roll angle"); return false; }
                }
                if((flags & CUT_F_TPOSTCBINFO) > 0) {
                        tpos_tcb_info=new tcb_info();
                        if(tpos_tcb_info->load(is)==false) { error(e_notEnoughData, "Error loading target position TCB data"); return false; }
                }
        }
        if((flags & CUT_F_SAMEFOV)==0 && (flags & CUT_F_FOV) > 0){
                is >> fov;
                if(is.fail()) { error(e_notEnoughData, "Error loading FOV"); return false; }
        }
        if((flags & CUT_F_SAMECOLOR)==0 && (flags & CUT_F_COLOR) > 0){
                color=new rgb();
                if(color->load(is)==false) { error(e_notEnoughData, "Error loading RGB"); return false; }
        }

        is >> length >> index;
        if(is.fail()) { error(e_notEnoughData, "Error loading length or index"); return false; }

        return !is.fail();
}
//---------------------------------------------------------------------------------
bool bob_frame::toFile(obinaryfilestream& os)
{
        os << flags;

        if((flags & CUT_F_SAMEPOS)==0){
                position.toFile(os);
                if(pos_tcb_info)
                        pos_tcb_info->toFile(os);
        }
        if((flags & CUT_F_SAMEROT)==0 && rotation){
                rotation->toFile(os);
                if(rot_tcb_info)
                        rot_tcb_info->toFile(os);
        }
        if(flags & CUT_F_TARGETPOS) {
                if(targetPos)
                        targetPos->toFile(os);

                if((flags & CUT_F_SAMEROT) == 0)
                        os << rollAngle;

                if(tpos_tcb_info)
                        tpos_tcb_info->toFile(os);
        }
        if((flags & CUT_F_SAMEFOV)==0 && (flags & CUT_F_FOV) > 0)
                os << fov;

        if((flags & CUT_F_SAMECOLOR)==0 && (flags & CUT_F_COLOR) > 0)
                color->toFile(os);

        os << length << index;
        return os.good();
}
//---------------------------------------------------------------------------------
bool bob_frame::toFile(otextfilestream& os)
{
        os << noSemicolons << "{ " << hex << "0x" << flags << dec << "; ";

        if((flags & CUT_F_SAMEPOS)==0){
                position.toFile(os);
                if(pos_tcb_info)
                        pos_tcb_info->toFile(os);
        }
        if((flags & CUT_F_SAMEROT)==0 && rotation){
                rotation->toFile(os);
                if(rot_tcb_info)
                        rot_tcb_info->toFile(os);
        }
        if((flags & CUT_F_TARGETPOS) > 0) {
                if(targetPos)
                        targetPos->toFile(os);

                if((flags & CUT_F_SAMEROT) == 0)
                        os << rollAngle << "; ";

                if(tpos_tcb_info)
                        tpos_tcb_info->toFile(os);
        }
        if((flags & CUT_F_SAMEFOV)==0 && (flags & CUT_F_FOV) > 0)
                os << fov << "; ";

        if((flags & CUT_F_SAMECOLOR)==0 && (flags & CUT_F_COLOR) > 0)
                color->toFile(os);

        os << autoSemicolons << length << index << noSemicolons << '}';

        return os.good();
}
//---------------------------------------------------------------------------------
int bob_frame::valueCount()
{
        int size=0;

        if((flags & CUT_F_SAMEPOS)==0){
                size+=3;
                if((flags & CUT_F_POSTCBINFO) > 0)
                        size+=5;
        }
        if((flags & CUT_F_SAMEROT)==0 && (flags & CUT_F_ROT) > 0){
                size+=4;
                if((flags & CUT_F_ROTTCBINFO) > 0)
                        size+=5;
        }
        if((flags & CUT_F_TARGETPOS) > 0) {
                if((flags & CUT_F_SAMETARGET) == 0)
                        size+=3;

                if((flags & CUT_F_SAMEROT) == 0)
                        size++;

                if((flags & CUT_F_TPOSTCBINFO) > 0)
                        size+=5;
        }
        if((flags & CUT_F_SAMEFOV)==0 && (flags & CUT_F_FOV) > 0)
                size+=1;
        if((flags & CUT_F_SAMECOLOR)==0 && (flags & CUT_F_COLOR) > 0)
                size+=3;
        return size;
}
//---------------------------------------------------------------------------------