home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga ACS 1998 #6
/
amigaacscoverdisc1998-061998.iso
/
games
/
descent
/
source
/
3d
/
instance.asm
< prev
next >
Wrap
Assembly Source File
|
1998-06-08
|
4KB
|
183 lines
;THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
;SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
;END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
;ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
;IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
;SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
;FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
;CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
;AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
;COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
;
; $Source: f:/miner/source/3d/rcs/instance.asm $
; $Revision: 1.8 $
; $Author: matt $
; $Date: 1994/07/29 18:16:16 $
;
; Code for handling instanced 3d objects
;
; $Log: instance.asm $
; Revision 1.8 1994/07/29 18:16:16 matt
; Added instance by angles, and corrected parms for g3_init()
;
; Revision 1.7 1994/07/25 00:00:02 matt
; Made 3d no longer deal with point numbers, but only with pointers.
;
; Revision 1.6 1994/06/16 17:52:31 matt
; If NULL passed for instance matrix, don't rotate (just do offset)
;
; Revision 1.5 1994/06/01 18:10:22 matt
; Fixed register trash in g3_start_instance_matrix()
;
; Revision 1.4 1994/03/25 17:09:20 matt
; Increase MAX_INSTANCE_DEPTH to 5 (from 3)
;
; Revision 1.3 1994/02/10 18:00:43 matt
; Changed 'if DEBUG_ON' to 'ifndef NDEBUG'
;
; Revision 1.2 1994/01/24 14:08:45 matt
; Added code to this previously dull file
;
; Revision 1.1 1994/01/23 15:22:52 matt
; Initial revision
;
;
.386
option oldstructs
.nolist
include types.inc
include psmacros.inc
include vecmat.inc
include 3d.inc
.list
assume cs:_TEXT, ds:_DATA
_DATA segment dword public USE32 'DATA'
rcsid db "$Id: instance.asm 1.8 1994/07/29 18:16:16 matt Exp $"
align 4
MAX_INSTANCE_DEPTH equ 5
inst_context_size equ ((size vms_matrix) + (size vms_vector))
instance_stack db MAX_INSTANCE_DEPTH*inst_context_size dup (?)
instance_depth dd 0
tempv vms_vector <>
tempm vms_matrix <>
tempm2 vms_matrix <>
instmat vms_matrix <>
_DATA ends
_TEXT segment dword public USE32 'CODE'
;start instancing, using angles (called vm_angles_2_matrix)
;takes esi=position, edi=angvec. trashes esi,edi
;if angles==NULL, don't modify matrix. This will be like doing an offset
g3_start_instance_angles:
or edi,edi
jz g3_start_instance_matrix ;no new matrix
push esi
mov esi,edi
lea edi,instmat
call vm_angles_2_matrix
pop esi
; fall g3_start_instance_matrix
;start instancing, using a matrix
;takes esi=position, edi=matrix. trashes esi,edi
;if matrix==NULL, don't modify matrix. This will be like doing an offset
g3_start_instance_matrix:
pushm eax,ebx,ecx
push edi ;save matrix
push esi ;save position
;save current context
mov eax,instance_depth
inc instance_depth
ifndef NDEBUG
cmp eax,MAX_INSTANCE_DEPTH
break_if e,'Already at max depth'
endif
imul eax,inst_context_size
lea edi,instance_stack[eax]
lea esi,View_position
mov ecx,3
rep movsd
lea esi,View_matrix
mov ecx,9
rep movsd
;step 1: subtract object position from view position
pop esi ;object position
lea edi,View_position
call vm_vec_sub2
;step 2: rotate view vector through object matrix
pop edi ;get object matrix
or edi,edi ;null matrix?
jz no_inst_matrix
lea esi,View_position
lea eax,tempv
call vm_vec_rotate
vm_copy esi,eax,ebx
;step 3: rotate object matrix through view_matrix (vm = ob * vm)
mov esi,edi ;object matrix
lea edi,tempm2
call vm_copy_transpose_matrix
lea esi,tempm2
lea edi,View_matrix
lea eax,tempm
call vm_matrix_x_matrix
mov esi,eax
mov ecx,9
rep movsd
no_inst_matrix:
;now we are done!
popm eax,ebx,ecx
ret
;we are done instancing
g3_done_instance: pushm eax,ecx,esi,edi
dec instance_depth
break_if s,'Instance stack underflow!'
mov eax,instance_depth
imul eax,inst_context_size
lea esi,instance_stack[eax]
lea edi,View_position
mov ecx,3
rep movsd
lea edi,View_matrix
mov ecx,9
rep movsd
popm eax,ecx,esi,edi
ret
_TEXT ends
end