mreal_t ASTTransform::evaluate(void* data) const
{
  mreal_t value = getChild()->evaluate(data);

  switch (getTransformType())
  {
    case MTRANSFORM_NONE:
      return value;
    case MTRANSFORM_NEGATE:
      return -value;
    default:
      MP_ASSERT_NOT_REACHED();
      return 0.0f;
  }
}
Exemple #2
0
// Stará se o načítání datového souboru
bool Loader::load(const char* szFile,int ScalingFactor)
{
    ifstream file;
    file.open(szFile);

    if (file.is_open()){
        // Prvně přidej počáteční polohu (jako identickou transformaci)
        Transform *Tr = new Transform;
        Tr->type = ttIdentity;
        Tr->T.identity();
        Tr->p1 = Tr->p2 = 0;
        transforms.pushback(*Tr);

        setlocale(LC_NUMERIC,"C"); // Nutné nastavit locale kvůli atof, který jinak nebere . jako desetinnou čárku

        // Dále čti soubor dokud to jde...
        string cmd,p1,p2;
        while(file.good()){
            cmd.clear(); p1.clear(); p2.clear();
            file >> cmd;

            // Zjisti typ transformace
            TransformType tt = getTransformType(cmd);
            if (tt == ttUnknown) continue; // Když nejde zjistit, preskoč

            Transform *Tr = new Transform;
            Tr->type = tt;

            switch (tt) {
                case ttTranslate: // TRANSLACE
                    file >> p1 >> p2;
                    Tr->p1 = ::atof(p1.c_str()); // Lepší použít atof než přímo číst double přes >> protože v případě chyby nastaví failbit
                    Tr->p2 = ::atof(p2.c_str()); // a stream už není good() takže čtení zbytečně skončí ačkoliv další řádky můžou být už v pořádku.

                    Tr->T(0,0) = 1; Tr->T(0,1) = 0; Tr->T(0,2) = Tr->p1*ScalingFactor;
                    Tr->T(1,0) = 0; Tr->T(1,1) = 1; Tr->T(1,2) = -Tr->p2*ScalingFactor; // Zde je mínus kvůli odlišné bázi
                    Tr->T(2,0) = 0; Tr->T(2,1) = 0; Tr->T(2,2) = 1;
                break;
                case ttRotate:    // ROTACE
                    file >> p1;
                    Tr->p1 = ::atof(p1.c_str());

                    Tr->T(0,0) = cos(Tr->p1*M_PI/180);  Tr->T(0,1) = sin(Tr->p1*M_PI/180); Tr->T(0,2) = 0;
                    Tr->T(1,0) = -sin(Tr->p1*M_PI/180); Tr->T(1,1) = cos(Tr->p1*M_PI/180); Tr->T(1,2) = 0;
                    Tr->T(2,0) = 0;       Tr->T(2,1) = 0;   Tr->T(2,2) = 1;
                break;
                case ttScale:   // ŠKÁLOVÁNÍ
                    file >> p1 >> p2;
                    Tr->p1 = ::atof(p1.c_str());
                    Tr->p2 = ::atof(p2.c_str());
                    if (Tr->p1 == 0) Tr->p1 = 1;
                    if (Tr->p2 == 0) Tr->p2 = 1;

                    Tr->T(0,0) = Tr->p1; Tr->T(0,1) = 0;      Tr->T(0,2) = 0;
                    Tr->T(1,0) = 0;      Tr->T(1,1) = Tr->p2; Tr->T(1,2) = 0;
                    Tr->T(2,0) = 0;      Tr->T(2,1) = 0;      Tr->T(2,2) = 1;
                break;
                default: break;
            };
            transforms.pushback(*Tr); // Přidej transformaci do seznamu

        }
        setlocale(LC_NUMERIC,""); // Vrať zpátky původní locale
        file.close(); // Zavři stream po skončení čtení
        return true;
    }