РБМК и движок OpenGL на MASM

Тема в разделе "WASM.OpenGL", создана пользователем ml64, 25 апр 2026.

  1. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    100
    Вечер 25.04.2026. Сорок лет
    Во вложении - пятак РБМК на самопальном OpenGL-движке
    Ходить - стрелками, летать - PgUp/PgDn,
    крутить объект - WSAD,
    крутить камеру - кнопки мыши и колесо, колесо можно крутить и нажимать
    F1 для справки
    Bonus0: то же самое на VBA для Excel. Тот случай, когда пишешь на ассемблере, но это VBA
    Bonus1: то же самое на С. Перевод на С с ассемблера

    RBMK.jpg
     

    Вложения:

    • RBMK_MASM.zip
      Размер файла:
      32,8 КБ
      Просмотров:
      134
    • RBMK_VBA.zip
      Размер файла:
      94,3 КБ
      Просмотров:
      121
    • RBMK_C.zip
      Размер файла:
      33,4 КБ
      Просмотров:
      118
    Последнее редактирование: 25 апр 2026
    Treant, Mikl___, GRAFik и ещё 1-му нравится это.
  2. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.031
     
  3. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    100
    Спасибо за интерес!!! Перезалил. Даже бонусов добавил
     
    Последнее редактирование: 25 апр 2026
  4. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    548
    ОБАЛДЕТЬ ! ! ! ! ! ! Вот это проект, так проект ! ! ! ! Можно сказать, что ПРОЕКТИЩЕ !!!!! Я аж прослезился от радости за автора этого проекта - от БЕЛОЙ ЗАВИСТИ ! ! ! :=)

    P.S. По-моему, в шапку нужно добавить, что есть проект для MASM x64 ! ! ! !
     
    ml64 нравится это.
  5. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    100
    Чтобы не менять название темы, я добавил движок под 32 бита.

    По идее, должен запускаться на всём, что имеет SSE, т.е. PIII Katmai и новее.
    Летает на Compaq Presario 1700T с Celeron 700E, 128Мб RAM и ATI Rage Mobility-M1.

    Дописал пока не всё. Как и в случае с "Москвичом", упёрся в парсер.
    Я не могу определиться, что я хочу от этого парсера, поэтому не могу решить несформулированную задачу.

    Что касается геометрии, то тут всё в порядке.
    Я не использую штатные glTranslatef и glRotatef. Всё своими ручками.
    Матрицу Projection я настраиваю на перспективу и больше не трогаю.
    Матрицу ModelView не преобразую вообще. Просто загружаю в неё результаты обработки двух кастомных матриц.
    А кастомные матрицы - это разделённые Model и View,
    только я их для различия назвал ObjectVolatile и CameraVolatile соответственно.
    Разделение позволяет независимо преобразовывать координаты модели и координаты камеры - К.О.
    Плюс для быстрого сброса я добавил ещё две матрицы: ObjectDefault и CameraDefault.
    Их я сразу проинициализировал в сегменте .code значениями, которые подбирал весь предыдущий год.

    Вот так мы ходим на SSE (матрица Camera):
    Код (ASM):
    1. ;dx_local = dStep * mtxCameraVolatile(0i)
    2. ;dy_local = dStep * mtxCameraVolatile(1i)
    3. ;dz_local = dStep * mtxCameraVolatile(2i)
    4. mulss xmm0,dword ptr[eax+0*4]
    5. mulss xmm1,dword ptr[eax+4*4]
    6. mulss xmm2,dword ptr[eax+8*4]
    7.  
    8. ;Fill all 4 xmm lanes
    9. shufps xmm0,xmm0,0 ;dx_local
    10. shufps xmm1,xmm1,0 ;dy_local
    11. shufps xmm2,xmm2,0 ;dz_local
    12.  
    13. ;Accumulate world-space displacement
    14.  
    15. ;dx contributes to world via column 0
    16. ;dy contributes to world via column 1
    17. ;dz contributes to world via column 2
    18.  
    19. ;dx_world = dx_local*m[00] + dy_local*m[04] + dz_local*m[08]
    20. ;dy_world = dx_local*m[01] + dy_local*m[05] + dz_local*m[09]
    21. ;dz_world = dx_local*m[02] + dy_local*m[06] + dz_local*m[10]
    22.  
    23. movaps xmm3,oword ptr[ecx+0*4] ;old[00..03]
    24. movaps xmm4,oword ptr[ecx+4*4] ;old[04..07]
    25. movaps xmm5,oword ptr[ecx+8*4] ;old[08..11]
    26. mulps xmm0,xmm3
    27. mulps xmm1,xmm4
    28. mulps xmm2,xmm5
    29. addps xmm0,xmm1
    30. addps xmm0,xmm2
    31.  
    32. ;Add to the Translation Column
    33. ;x_world = x_world + dx_world
    34. ;y_world = y_world + dy_world
    35. ;z_world = z_world + dz_world
    36. movaps xmm6,oword ptr[ecx+12*4] ;old[12..15]
    37. addps xmm0,xmm6

    Вот так мы поворачиваем модель на SSE (матрица Object):
    Код (ASM):
    1. Rx:
    2. ;1   0    0 0
    3. ;0 cos -sin 0
    4. ;0 sin  cos 0
    5. ;0   0    0 1
    6.  
    7. ;Load Values
    8. movaps xmm2,oword ptr[ecx+4*4] ;old[04..07]
    9. movaps xmm3,oword ptr[ecx+8*4] ;old[08..11]
    10. movaps xmm4,xmm2 ;old[04..07]
    11. movaps xmm5,xmm3 ;old[08..11]
    12.  
    13. ;new[04] = c * old[04] + s * old[08]
    14. ;new[05] = c * old[05] + s * old[09]
    15. ;new[06] = c * old[06] + s * old[10]
    16. ;new[07] = c * old[07] + s * old[11]
    17. mulps xmm2,xmm1 ;old[04..07]*cos
    18. mulps xmm3,xmm0 ;old[08..11]*sin
    19. addps xmm2,xmm3
    20. movaps oword ptr[ecx+4*4],xmm2 ;new[04..07]
    21.  
    22. ;new[08] = c * old[08] - s * old[04]
    23. ;new[09] = c * old[09] - s * old[05]
    24. ;new[10] = c * old[10] - s * old[06]
    25. ;new[11] = c * old[11] - s * old[07]
    26. mulps xmm5,xmm1 ;old[08..11]*cos
    27. mulps xmm4,xmm0 ;old[04..07]*sin
    28. subps xmm5,xmm4
    29. movaps oword ptr[ecx+8*4],xmm5 ;new[08..11]
    30.  
    31. jmp ModelRotate_End
    32.  
    33. Ry:
    34. ; cos 0 sin 0
    35. ;   0 1   0 0
    36. ;-sin 0 cos 0
    37. ;   0 0   0 1
    38.  
    39. ;Load Values
    40. movaps xmm2,oword ptr[ecx+0*4] ;old[00..03]
    41. movaps xmm3,oword ptr[ecx+8*4] ;old[08..11]
    42. movaps xmm4,xmm2 ;old[00..03]
    43. movaps xmm5,xmm3 ;old[08..11]
    44.  
    45. ;new[00] =  c * old[00] - s * old[08]
    46. ;new[01] =  c * old[01] - s * old[09]
    47. ;new[02] =  c * old[02] - s * old[10]
    48. ;new[03] =  c * old[03] - s * old[11]
    49. mulps xmm2,xmm1 ;old[00..03]*cos
    50. mulps xmm3,xmm0 ;old[08..11]*sin
    51. subps xmm2,xmm3
    52. movaps oword ptr[ecx+0*4],xmm2 ;new[00..03]
    53.  
    54. ;new[08] =  s * old[00] + c * old[08]
    55. ;new[09] =  s * old[01] + c * old[09]
    56. ;new[10] =  s * old[02] + c * old[10]
    57. ;new[11] =  s * old[03] + c * old[11]
    58. mulps xmm4,xmm0 ;old[00..03]*sin
    59. mulps xmm5,xmm1 ;old[08..11]*cos
    60. addps xmm4,xmm5
    61. movaps oword ptr[ecx+8*4],xmm4 ;new[08..11]
    62.  
    63. jmp ModelRotate_End
    64.  
    65. Rz:
    66. ;cos -sin 0 0
    67. ;sin  cos 0 0
    68. ;  0    0 1 0
    69. ;  0    0 0 1
    70.  
    71. ;Load Values
    72. movaps xmm2,oword ptr[ecx+0*4] ;old[00..03]
    73. movaps xmm3,oword ptr[ecx+4*4] ;old[04..07]
    74. movaps xmm4,xmm2 ;old[00..03]
    75. movaps xmm5,xmm3 ;old[04..07]
    76.  
    77. ;new[00] = c * old[00] + s * old[04]
    78. ;new[01] = c * old[01] + s * old[05]
    79. ;new[02] = c * old[02] + s * old[06]
    80. ;new[03] = c * old[03] + s * old[07]
    81. mulps xmm2,xmm1 ;old[00..03]*cos
    82. mulps xmm3,xmm0 ;old[04..07]*sin
    83. addps xmm2,xmm3
    84. movaps oword ptr[ecx+0*4],xmm2 ;new[00..03]
    85.  
    86. ;new[04] = c * old[04] - s * old[00]
    87. ;new[05] = c * old[05] - s * old[01]
    88. ;new[06] = c * old[06] - s * old[02]
    89. ;new[07] = c * old[07] - s * old[03]
    90. mulps xmm4,xmm0 ;old[00..03]*sin
    91. mulps xmm5,xmm1 ;old[04..07]*cos
    92. subps xmm5,xmm4
    93. movaps oword ptr[ecx+4*4],xmm5 ;new[04..07]

    Управление WSAD (поворот модели) + стрелки, PgUp, PgDn (движение камеры) + shift (ускорение)
     

    Вложения:

    • RBMK32_037.zip
      Размер файла:
      29,4 КБ
      Просмотров:
      7
    Последнее редактирование: 23 сен 2026 в 13:43
  6. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    548
    ml64, спасибо вам от всех любителей ассемблеров ! :=) К сожалению, ваш EXE-файл у меня выдаёт не то, что нужно, а сам я пока не компилировал, нужно будет MASM32 на досуге установить. :)
     

    Вложения:

  7. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    100
    Так это и есть то, что нужно!
    Там просто болванка - белый прямоугольник, на нём можно проверить работу всех матриц.
    Я же говорю: будет парсер - будет графика, а сейчас пока красоту надо искать в чистоте решений.
    Это же поэзия:

    Код (ASM):
    1. ;2.1. Activate the ModelView Matrix
    2. push 1700h ;GL_MODELVIEW
    3. call glMatrixMode
    4.  
    5. ;2.2. Load the current Camera matrix
    6. push offset mtxCameraVolatile
    7. call glLoadMatrixf
    8.  
    9. ;2.3. Multiply by the current Object matrix
    10. push offset mtxObjectVolatile
    11. call glMultMatrixf
    Вместо всех конских преобразований в матрицах Projection и ModelView

    ...Для того, чтобы повернуть матрицу в другом базисе, нужно всего лишь 12 инструкций.
    А на современных процессорах - ещё меньше
     
  8. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    548
    - А, понятно.
    - А у вас нет такого-же, но с парсером, без крыльев и с перламутровыми пуговицами?
    - Нет, да. Ну, будем искать. Будем искать. :)