Direct3D9 в VB6.

Автор обещает много интересных штучек.

Модератор: The trick

Old_Maple
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 25.10.2016 (Вт) 12:03

Re: Direct3D9 в VB6.

Сообщение Old_Maple » 17.03.2017 (Пт) 8:10

Спасибо, Mikle! Все правильно заработало!
Veritas est aeterna!

The trick
Постоялец
Постоялец
 
Сообщения: 599
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Direct3D9 в VB6.

Сообщение The trick » 06.05.2018 (Вс) 23:58

Обновление.

Новые примеры:
  • Простая сцена (камера, процедурная генерация, выбор мышью, трансформации);
  • "Лазерные" линии;
  • Рендеринг в отдельном потоке.
Исправлены баги в функциях:
  • D3DXMatrixTranspose;
  • D3DXMatrixRotationQuaternion;
  • D3DXVec2Length.
Изменения:
  • Изменен прототип для функции D3DXPlaneIntersectLine, вместо генерации ошибки функция возвращает значение;
  • Изменено поведение функции D3DXQuaternionToAxisAngle, теперь она может принимать ненормализованные кватернионы.

UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3958
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Direct3D9 в VB6.

Сообщение Mikle » 02.02.2020 (Вс) 13:29

Я оптимизировал MatrixInverse почти в 2 раза по быстродействию, есть мысли на счёт дальнейшей оптимизации.
Пока так:
Код: Выделить всё
Public Function MatrixDeterminant(pM As D3DMATRIX) As Single
  Dim Minor   As D3DVECTOR4
  Dim v1      As D3DVECTOR4
  Dim v2      As D3DVECTOR4
  Dim v3      As D3DVECTOR4

  v1.x = pM.m11:  v1.y = pM.m21:  v1.z = pM.m31:  v1.w = pM.m41
  v2.x = pM.m12:  v2.y = pM.m22:  v2.z = pM.m32:  v2.w = pM.m42
  v3.x = pM.m13:  v3.y = pM.m23:  v3.z = pM.m33:  v3.w = pM.m43

  v4Cross Minor, v1, v2, v3
  MatrixDeterminant = -(pM.m14 * Minor.x + pM.m24 * Minor.y + pM.m34 * Minor.z + pM.m44 * Minor.w)
End Function

Public Function MatrixInverse(mOut As D3DMATRIX, Determinant As Single, Mtrx As D3DMATRIX) As Boolean
  Dim a       As Long
  Dim i       As Long
  Dim j       As Long
  Dim v       As D3DVECTOR4
  Dim Vec(2)  As D3DVECTOR4
  Dim Det     As Single
  Dim M(3, 3) As Single
  Dim o(3, 3) As Single
  Dim IDet    As Single

  Det = MatrixDeterminant(Mtrx)
  If Det = 0 Then Exit Function

  Determinant = Det
  IDet = 1 / Det
  MemCpy M(0, 0), Mtrx, 64

  For i = 0 To 3
    For j = 0 To i - 1
      Vec(j).x = M(j, 0)
      Vec(j).y = M(j, 1)
      Vec(j).z = M(j, 2)
      Vec(j).w = M(j, 3)
    Next j
    For j = i To 2
      Vec(j).x = M(j + 1, 0)
      Vec(j).y = M(j + 1, 1)
      Vec(j).z = M(j + 1, 2)
      Vec(j).w = M(j + 1, 3)
    Next j

    v4Cross v, Vec(0), Vec(1), Vec(2)

    o(0, i) = v.x * IDet
    o(1, i) = v.y * IDet
    o(2, i) = v.z * IDet
    o(3, i) = v.w * IDet
    IDet = -IDet
  Next i
  MemCpy mOut, o(0, 0), 64
  MatrixInverse = True
End Function

Private Sub v4Cross(vOut As D3DVECTOR4, v1 As D3DVECTOR4, v2 As D3DVECTOR4, v3 As D3DVECTOR4)
  vOut.x = v1.y * (v2.z * v3.w - v3.z * v2.w) - v1.z * (v2.y * v3.w - v3.y * v2.w) + v1.w * (v2.y * v3.z - v2.z * v3.y)
  vOut.y = -(v1.x * (v2.z * v3.w - v3.z * v2.w) - v1.z * (v2.x * v3.w - v3.x * v2.w) + v1.w * (v2.x * v3.z - v3.x * v2.z))
  vOut.z = v1.x * (v2.y * v3.w - v3.y * v2.w) - v1.y * (v2.x * v3.w - v3.x * v2.w) + v1.w * (v2.x * v3.y - v3.x * v2.y)
  vOut.w = -(v1.x * (v2.y * v3.z - v3.y * v2.z) - v1.y * (v2.x * v3.z - v3.x * v2.z) + v1.z * (v2.x * v3.y - v3.x * v2.y))
End Sub

The trick
Постоялец
Постоялец
 
Сообщения: 599
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Direct3D9 в VB6.

Сообщение The trick » 03.02.2020 (Пн) 17:31

Спасибо! Я писал эти функции основываясь на исходниках то ли Wine, то ли ReactOS, но и там были несоответствия вроде бы с реальными из d3dx (я даже по-моему у тебя спрашивал), приходилось реверсить.
UA6527P

Пред.

Вернуться в The trick

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList