home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / 3d / matrix.asm < prev    next >
Assembly Source File  |  1998-06-08  |  3KB  |  155 lines

  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-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  11. ;
  12. ; $Source: f:/miner/source/3d/rcs/matrix.asm $
  13. ; $Revision: 1.4 $
  14. ; $Author: matt $
  15. ; $Date: 1994/11/20 15:59:34 $
  16. ;
  17. ; Source for matrix setup & manipulation routines
  18. ;
  19. ; $Log: matrix.asm $
  20. ; Revision 1.4  1994/11/20  15:59:34  matt
  21. ; instance functions were trashing eax
  22. ; Revision 1.3  1994/01/04  12:06:17  matt
  23. ; Made scale_matrix save and restore ecx, which it was trashing.
  24. ; Revision 1.2  1993/11/04  18:49:16  matt
  25. ; Added system to only rotate points once per frame
  26. ; Revision 1.1  1993/10/29  22:20:27  matt
  27. ; Initial revision
  28. ;
  29. ;
  30.  
  31. .386
  32.     option    oldstructs
  33.  
  34.     .nolist
  35.     include    types.inc
  36.     include    psmacros.inc
  37.     include    gr.inc
  38.     include    3d.inc
  39.     .list
  40.  
  41.     assume    cs:_TEXT, ds:_DATA
  42.  
  43. _DATA    segment    dword public USE32 'DATA'
  44.  
  45. rcsid    db    "$Id: matrix.asm 1.4 1994/11/20 15:59:34 matt Exp $"
  46.     align    4
  47.  
  48.  
  49. _DATA    ends
  50.  
  51.  
  52.  
  53. _TEXT    segment    dword public USE32 'CODE'
  54.  
  55.  
  56. ;set view from x,y,z, p,b,h, & zoom. 
  57. ;takes esi=orient vec, edi=pos vec, eax=zoom. returns nothing
  58. g3_set_view_angles:
  59.     pushm    eax,edi
  60.  
  61.     mov    View_zoom,eax
  62.  
  63.     vm_copy    View_position,edi    ;trashes eax
  64.  
  65.     lea    edi,View_matrix
  66.     call    vm_angles_2_matrix
  67.  
  68.     jmp    scale_matrix        ;leave eax,edi pushed
  69.  
  70.  
  71. ;set view from x,y,z, matrix, & zoom.
  72. ;takes esi=orientation matrix, edi=pos vec, eax=zoom. returns nothing
  73. g3_set_view_matrix:
  74.     pushm    eax,edi
  75.     pushm    ecx,esi
  76.  
  77.     mov    View_zoom,eax
  78.  
  79.     vm_copy    View_position,edi    ;trashes eax
  80.  
  81.     lea    edi,View_matrix
  82.     mov    ecx,9
  83.     rep    movsd    ;slow? easy anyway...
  84.  
  85.     popm    ecx,esi
  86.  
  87.     jmp    scale_matrix    ;leave eax,edi pushed
  88.  
  89.  
  90. ;scale memory location dest by register s
  91. scale    macro    dest,s
  92.     mov    eax,dest
  93.     fixmul    s
  94.     mov    dest,eax
  95.     endm
  96.  
  97.  
  98. ;scale for aspect ratio, zoom, etc. eax,edi already pushed
  99. scale_matrix:    pushm    esi,ebx,ecx,edx
  100.  
  101.     lea    esi,View_matrix
  102.     lea    edi,Unscaled_matrix
  103.     mov    ecx,9
  104.     rep    movsd    ;save before scaling
  105.  
  106.     vm_copy    Matrix_scale,Window_scale
  107.             ;get aspect ratio scale
  108. ;set scale for zoom
  109.     mov    ebx,View_zoom
  110.     cmp    ebx,f1_0    ;> 1?
  111.     jg    zoom_out    ;..yep
  112.  
  113.     scale    Matrix_scale.z,ebx    ;zoom in by scaling z
  114.     jmp    done_zoom
  115.  
  116. zoom_out:    mov    eax,f1_0
  117.     fixdiv    ebx    ;get 1/zoom
  118.     mov    ebx,eax
  119.     scale    Matrix_scale.x,ebx
  120.     scale    Matrix_scale.y,ebx    ;zoom out by scaling x&y
  121. done_zoom:
  122.  
  123. ;now scale matrix elements
  124.  
  125.     mov    ebx,Matrix_scale.x
  126.     scale    View_matrix.m1,ebx
  127.     scale    View_matrix.m4,ebx
  128.     scale    View_matrix.m7,ebx
  129.  
  130.     mov    ebx,Matrix_scale.y
  131.     scale    View_matrix.m2,ebx
  132.     scale    View_matrix.m5,ebx
  133.     scale    View_matrix.m8,ebx
  134.  
  135.     mov    ebx,Matrix_scale.z
  136.     scale    View_matrix.m3,ebx
  137.     scale    View_matrix.m6,ebx
  138.     scale    View_matrix.m9,ebx
  139.  
  140.  
  141.     popm    esi,ebx,ecx,edx
  142.     popm    eax,edi
  143.     ret
  144.  
  145.  
  146.  
  147. _TEXT    ends
  148.  
  149.     end
  150.  
  151.