Демка Elastic Collisions

Тема в разделе "WASM.GRAPHICS", создана пользователем Intro, 7 сен 2024.

Метки:
  1. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    591
    Сделал демку по мотивам этого видео.

    Использовал ООП, поэтому получилось немного громоздко, так же разделил графическую реализацию, в этой версии реализованы GDI, GDI+. Потом можно добавить например OpenGL. Код для UASM v2.52, используется SSE2, можно опционально SSE3
    Физический движок моделирует упругую коллизию шариков, хотя по мне реализация столкновения имеет некоторую погрешность и зависимость к высокому ФПС, т.е. апдейтов за сек, в некоторых случаях маленькие шарики могут пролетать сквозь друг-друга. Для фикса надо реализовать пересечения траекторий.
    Графический движок использует двойную буферизацию, реализация так себе, насколько позволяет WinAPI, а позволяет он не очень много. На старых ПК больше времени занимает рендер графики.
    ЗЫ
    Ещё автор использовал хитрую оптимизацию чтобы уменьшить квадратичную зависимость от кол. шариков, но я забил на это, код и так быстро работает, да слишком большое кол. шариков на сцене портит картинку.
     

    Вложения:

  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.786
  3. E.D.

    E.D. New Member

    Публикаций:
    0
    Регистрация:
    8 окт 2017
    Сообщения:
    3
    Могу ошибаться, но вроде в about kerberos что-то похожее присутствует
     
  4. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    591
    Апдейт vector2.asm, добавлена поддержка SSE4.1 используется инструкция dppd, вычисление dotproduct
    Код (ASM):
    1. movxmm MACRO dest:req, source:req
    2. IFDIFI <dest>,<source>
    3.     movups  dest, source
    4. ENDIF
    5. ENDM
    6. dVec2 union ;(sizeof=16, align=8)
    7.                         xmmword ?
    8.     struct
    9.         x               real8 ?
    10.         y               real8 ?
    11.     ends
    12. dVec2 ends
    13. ;скалярное произведения 3d вектора
    14. ;результат возвращается xmm0.0, регистры xmm0, xmm1 не сохраняются
    15. dVec2@dotproduct MACRO res_reg:req, vec_this:req, vec:req
    16.     movxmm  xmm0, vec_this
    17. IF INSTRUCTIONS__SSEx EQ 3
    18.     dVec2@mul xmm0, vec
    19.     haddpd  xmm0, xmm0
    20. ELSEIF INSTRUCTIONS__SSEx EQ 4
    21.     dppd    xmm0, vec, 110011b
    22. ELSE
    23.     dVec2@mul xmm0, vec
    24.     movsd   xmm1, xmm0          ; xmm1.x = x
    25.     shufpd  xmm0, xmm0, 11b     ; копируем 1-й элемент в 0-й элемент
    26.     addsd   xmm0, xmm1          ; = x + y
    27. ENDIF
    28.     movxmm  res_reg, xmm0
    29. ENDM
    30. dVec2@magnitude MACRO res_reg:req, vec_this:req
    31.     movxmm  xmm0, vec_this
    32. IF INSTRUCTIONS__SSEx EQ 3
    33.     mulpd   xmm0, xmm0
    34.     haddpd  xmm0, xmm0
    35. ELSEIF INSTRUCTIONS__SSEx EQ 4
    36.     dppd    xmm0, xmm0, 110011b
    37. ELSE
    38.     mulpd   xmm0, xmm0
    39.     movsd   xmm1, xmm0          ; xmm1.x = x
    40.     shufpd  xmm0, xmm0, 11b     ; копируем 1-й элемент в 0-й элемент
    41.     addsd   xmm0, xmm1          ; x + y
    42. ENDIF
    43.     sqrtsd  res_reg, xmm0
    44. ENDM
    45. dVec2@normalize MACRO vec_this:req
    46.     dVec2@magnitude xmm1, vec_this
    47.     movsd   xmm0, CFP8(1.0)
    48.     divsd   xmm0, xmm1
    49.     shufpd  xmm0, xmm0, 00b
    50.     movxmm  xmm1, vec_this
    51.     mulpd   xmm0, xmm1
    52. ENDM
    53. dVec2@set_length MACRO res_reg:req, vec_this:req, len:req
    54.     dVec2@magnitude xmm0, vec_this
    55.     movsd   xmm1, len
    56.     divsd   xmm1, xmm0          ;=len/magnitude();
    57.     shufpd  xmm1, xmm1, 00b
    58.     movxmm  res_reg, vec_this
    59.     mulpd   res_reg, xmm1       ;this.mul(len/magnitude());
    60. ENDM
    61. dVec2@opr2or3 MACRO comand:req, vec0:req, vec1:req, vec2
    62. IFNB <vec2>
    63.     movxmm  xmm0, vec1
    64.     IF ((OPATTR (vec2)) AND REG_EXPR)
    65.         comand  xmm0, vec2
    66.     ELSE
    67.         movxmm  xmm1, vec2
    68.         comand  xmm0, xmm1
    69.     ENDIF
    70. ELSE
    71.     movxmm  xmm0, vec0
    72.     IF ((OPATTR (vec1)) AND REG_EXPR)
    73.         comand  xmm0, vec1
    74.     ELSE
    75.         movxmm  xmm1, vec1
    76.         comand  xmm0, xmm1
    77.     ENDIF
    78. ENDIF
    79.     movxmm  vec0, xmm0
    80. ENDM
    81. dVec2@mul MACRO vec0:req, vec1:req, vec2
    82.     dVec2@opr2or3   mulpd, vec0, vec1, vec2
    83. ENDM
    84. dVec2@div MACRO vec0:req, vec1:req, vec2
    85.     dVec2@opr2or3   divpd, vec0, vec1, vec2
    86. ENDM
    87. dVec2@add MACRO vec0:req, vec1:req, vec2
    88.     dVec2@opr2or3   addpd, vec0, vec1, vec2
    89. ENDM
    90. dVec2@sub MACRO vec0:req, vec1:req, vec2
    91.     dVec2@opr2or3   subpd, vec0, vec1, vec2
    92. ENDM
    Добавить в начале ElasticCollisions.asm
    INSTRUCTIONS__SSEx = 4 ;2 - SSE2, 3 - SSE3, 4 - SSE4.1