MATRIX.ASM 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. ; THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  2. ; SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
  3. ; END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  4. ; ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  5. ; IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  6. ; SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  7. ; FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  8. ; CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
  9. ; AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
  10. ; COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
  11. .386
  12. option oldstructs
  13. .nolist
  14. include pstypes.inc
  15. include psmacros.inc
  16. include gr.inc
  17. include 3d.inc
  18. .list
  19. assume cs:_TEXT, ds:_DATA
  20. _DATA segment dword public USE32 'DATA'
  21. rcsid db "$Id: matrix.asm 1.5 1996/01/08 14:59:11 matt Exp $"
  22. align 4
  23. _DATA ends
  24. _TEXT segment dword public USE32 'CODE'
  25. ;set view from x,y,z, p,b,h, & zoom.
  26. ;takes esi=orient vec, edi=pos vec, eax=zoom. returns nothing
  27. g3_set_view_angles:
  28. pushm eax,edi
  29. mov View_zoom,eax
  30. vm_copy View_position,edi ;trashes eax
  31. lea edi,View_matrix
  32. call vm_angles_2_matrix
  33. jmp scale_matrix ;leave eax,edi pushed
  34. ;set view from x,y,z, matrix, & zoom.
  35. ;takes esi=orientation matrix, edi=pos vec, eax=zoom. returns nothing
  36. g3_set_view_matrix:
  37. pushm eax,edi
  38. pushm ecx,esi
  39. mov View_zoom,eax
  40. vm_copy View_position,edi ;trashes eax
  41. lea edi,View_matrix
  42. mov ecx,9
  43. rep movsd ;slow? easy anyway...
  44. popm ecx,esi
  45. jmp scale_matrix ;leave eax,edi pushed
  46. ;scale memory location dest by register s
  47. scale macro dest,s
  48. mov eax,dest
  49. fixmul s
  50. mov dest,eax
  51. endm
  52. ;scale for aspect ratio, zoom, etc. eax,edi already pushed
  53. scale_matrix: pushm esi,ebx,ecx,edx
  54. lea esi,View_matrix
  55. lea edi,Unscaled_matrix
  56. mov ecx,9
  57. rep movsd ;save before scaling
  58. vm_copy Matrix_scale,Window_scale
  59. ;get aspect ratio scale
  60. ;set scale for zoom
  61. mov ebx,View_zoom
  62. cmp ebx,f1_0 ;> 1?
  63. jg zoom_out ;..yep
  64. scale Matrix_scale.z,ebx ;zoom in by scaling z
  65. jmp done_zoom
  66. zoom_out: mov eax,f1_0
  67. fixdiv ebx ;get 1/zoom
  68. mov ebx,eax
  69. scale Matrix_scale.x,ebx
  70. scale Matrix_scale.y,ebx ;zoom out by scaling x&y
  71. done_zoom:
  72. ;now scale matrix elements
  73. mov ebx,Matrix_scale.x
  74. scale View_matrix.m1,ebx
  75. scale View_matrix.m4,ebx
  76. scale View_matrix.m7,ebx
  77. mov ebx,Matrix_scale.y
  78. scale View_matrix.m2,ebx
  79. scale View_matrix.m5,ebx
  80. scale View_matrix.m8,ebx
  81. mov ebx,Matrix_scale.z
  82. scale View_matrix.m3,ebx
  83. scale View_matrix.m6,ebx
  84. scale View_matrix.m9,ebx
  85. popm esi,ebx,ecx,edx
  86. popm eax,edi
  87. ret
  88. _TEXT ends
  89. end