1. C++ / Говнокод #7660

    +159

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    Obj = 0;
      while (dsmodel1.tellg () < LEN)
      {
        dsmodel1.read ( (char*)&ID, 2);
        dsmodel1.read ( (char*)&length, 4);
    
        switch (ID)
        {
        case 0x4d4d: break;
        case 0xb000: break;
        case 0xb002: break;
        case 0xb010: 
    
          char ch;
                do
                {
                    dsmodel1.read ( (char*)&ch, 1);
                }while (ch != '\0' && !dsmodel1.eof ());
    
          dsmodel1.ignore (4);
          dsmodel1.read ( (char*)&father_id [Obj], 2); // айди родительского объекта в иерархии
    
          break;
    
        case 0xb013:
    
          dsmodel1.read ( (char*)&(pivot [Obj].x), 4);   //координаты точки, вокруг которой будет вращаться объект
          dsmodel1.read ( (char*)&(pivot [Obj].y), 4);
          dsmodel1.read ( (char*)&(pivot [Obj].z), 4);
          break;
    
    
        case 0xb020:                                                                             // это поле описывает перенос объекта
          dsmodel1.ignore (10);
          number_of_keys [Obj] = new DWORD;
    
          dsmodel1.read ( (char*)&(number_of_keys [Obj][0]), 4);  //сколько кадров анимации будет у объекта
          key_number [Obj] = new DWORD [number_of_keys [Obj][0]];
          frameTran [Obj] = new D3DXVECTOR3 [number_of_keys [Obj][0]];
    
          how_much_to_ignore = 0;
    
          accel_flags = 0;
          for (i = 0; i < number_of_keys [Obj][0]; i++)
          {
            dsmodel1.read ( (char*)&(key_number [Obj][i]), 4);  
            dsmodel1.read ( (char*)&(accel_flags), 2);              //это флаги сплайнов, в этом примере всегда = 0
    
            if (accel_flags && (1 << 15)) how_much_to_ignore++;
            if (accel_flags && (1 << 14)) how_much_to_ignore++;
            if (accel_flags && (1 << 13)) how_much_to_ignore++;
    //...
     dsmodel1.read ( (char*)&(frameRot [Obj][i].y), 4);    // как я понял он должен быть помещен в точку pivot (она считывалась выше в поле 0хb013)
    //...
    case 0xb030:
          dsmodel1.read ( (char*)&(hierarchy_id [Obj]), 2);            // номер объекта в иерархии, в нашем примере = номеру объекта по порядку считывания

    Полный код:

    http://www.gamedev.ru/code/forum/?id=151570

    Запостил: CPPGovno, 26 Августа 2011

    Комментарии (11) RSS

    • Магические числа такие магические...
      Ответить
    • if (accel_flags && (1 << 15)) how_much_to_ignore++;

      Использование && вместо & - очаровательно.
      Ответить
      • Два амперсанда надёжней чем один. :)
        Ответить
        • А шуруп, забитый молотком, держит крепче гвоздя, завернутого отверткой.
          Ответить
          • И так как никто не видит, шуруп мы возьмем деревянный...
            Ответить
        • Рассчитано, на ситуацию, когда при передачи по сети потеряется один символ из программы.
          Ответить
        • я бы сказал : два амперсанда логичнее, чем один
          Ответить
      • А, я понял. Это зашифрованное "всех в игнор" (хотя если accel_flags всегда 0 - не прокатит)
        Ответить
    • Что ещё тут ужасного, кроме банальной опечатки?
      Ответить
    • - Сам подойдёт. И извинится за всё. Он сейчас переживает из-за того, что натворил.
      Ответить

    Добавить комментарий