home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga ACS 1998 #6
/
amigaacscoverdisc1998-061998.iso
/
games
/
descent
/
source
/
3d
/
objects.asm
< prev
next >
Wrap
Assembly Source File
|
1998-06-08
|
6KB
|
309 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/objects.asm $
; $Revision: 1.5 $
; $Author: matt $
; $Date: 1993/12/07 23:04:47 $
;
; Code to draw objects
;
; $Log: objects.asm $
; Revision 1.5 1993/12/07 23:04:47 matt
; Misc changes.
; NOTE: This file will not be used anymore. See object.c in main.
;
; Revision 1.4 1993/12/02 16:09:50 matt
; Removed debugging print to mono screen
;
; Revision 1.3 1993/11/24 16:58:49 matt
; Changed bitmap number of cube object
;
; Revision 1.2 1993/11/23 14:29:53 matt
; Fixed bitmap objects, hopefully.
;
; Revision 1.1 1993/11/21 20:09:02 matt
; Initial revision
;
;
.386
option oldstructs
.nolist
include types.inc
include psmacros.inc
include vecmat.inc
include 3d.inc
include fix.inc
.list
assume cs:_TEXT, ds:_DATA
_DATA segment dword public USE32 'DATA'
rcsid db "$Id: objects.asm 1.5 1993/12/07 23:04:47 matt Exp $"
align 4
obj_pos dd ? ;ptr to pos vector
obj_type dd ?
obj_matrix dd ?
new_obj_matrix vms_matrix <>
obj_vec_g vms_vector <> ;object->eye, global frame
obj_vec_obj vms_vector <> ;in objects frame of ref.
vec_matrix_g vms_matrix <>
;3d points for corners of bitmap
up_left_v vms_vector <>
up_right_v vms_vector <>
down_right_v vms_vector <>
up_left_p g3s_point <>
up_right_p g3s_point <>
down_right_p g3s_point <>
bitmap_points dd up_left_p,up_right_p,down_right_p
bitmap_number dd ?
up_vec vms_vector <>
right_vec vms_vector <>
public draw_bitmap_lines
draw_bitmap_lines dd 0
extb _Vector_to_viewnum,_up_vecs
extb _Vector_to_viewnum2,_up_vecs2
_DATA ends
_TEXT segment dword public USE32 'CODE'
extn render_object_
;draws a bitmap object. takes esi=pos, edi=matrix, eax=size, ebx=obj type
g3_draw_object: pushm eax,ebx,ecx,edx,esi,edi
mov obj_type,ebx ;save objnum
mov obj_pos,esi ;save pos
mov obj_matrix,edi ;save matrix
push eax ;save size
;get vector from object to eye
lea eax,obj_vec_g ;dest
mov edi,esi ;obj position
lea esi,View_position ;eye positon
call vm_vec_sub
;normalize vector
lea esi,obj_vec_g
call vm_vec_normalize
;rotate into object's frame of reference
lea eax,obj_vec_obj
lea esi,obj_vec_g
mov edi,obj_matrix
call vm_vec_rotate
;select the right bitmap by looking in a table.
;get five bits for each of x,y,z, make a 15-bit index, and look in table
mov eax,obj_vec_obj.x
add eax,f1_0 ;make in range 0..2
break_if s,'bad value in vector'
cmp eax,f2_0
jl not_max_x
dec eax ;make less than 1
not_max_x: sar eax,2
and eax,111110000000000b
mov ebx,eax
mov eax,obj_vec_obj.y
add eax,f1_0 ;make in range 0..2
break_if s,'bad value in vector'
cmp eax,f2_0
jl not_max_y
dec eax ;make less than 1
not_max_y: sar eax,2+5
and eax,1111100000b
or ebx,eax
mov eax,obj_vec_obj.z
add eax,f1_0 ;make in range 0..2
break_if s,'bad value in vector'
cmp eax,f2_0
jl not_max_z
dec eax ;make less than 1
not_max_z: sar eax,2+10
and eax,11111b
or ebx,eax
movzx eax,_Vector_to_viewnum[ebx]
cmp obj_type,1 ;other object?
jne got_viewnum
movzx eax,_Vector_to_viewnum2[ebx]
got_viewnum:
mov bitmap_number,eax
;; debug "bm=%d\n",eax
;build matrix with vec from obj to eye & bitmap's up vector
mov eax,bitmap_number
sal eax,1 ;*2
add eax,bitmap_number ;*3
sal eax,2 ;*12
lea eax,_up_vecs[eax]
cmp obj_type,1 ;other object/
jne got_up_vec
add eax,offset _up_vecs2
sub eax,offset _up_vecs
got_up_vec:
lea edi,vec_matrix_g
lea esi,obj_vec_obj ;obj_vec_g
call vm_vector_2_matrix
;rotate object's matrix through new matrix
lea eax,new_obj_matrix
mov esi,obj_matrix
lea edi,vec_matrix_g
call vm_matrix_x_matrix
;now, up and right describe edges
vm_copy up_vec,new_obj_matrix.uvec
vm_copy right_vec,new_obj_matrix.rvec
;calculate corner points of bitmap
pop ecx ;get size
sar ecx,1
lea ebx,up_vec
call vm_vec_scale
lea ebx,right_vec
call vm_vec_scale
;upper left
lea eax,up_left_v
mov esi,obj_pos
lea edi,right_vec
call vm_vec_add
mov edi,eax
lea esi,up_vec
call vm_vec_add2
;upper right
lea eax,up_right_v
lea esi,up_left_v
lea edi,right_vec
call vm_vec_sub
mov esi,edi ;rvec
mov edi,eax ;dest=up_right
call vm_vec_sub2
;lower right
lea eax,down_right_v
lea esi,up_right_v
lea edi,up_vec
call vm_vec_sub
mov esi,edi ;uvec
mov edi,eax ;dest=down_right
call vm_vec_sub2
;now take three points, rotate & project
lea esi,up_left_v
lea edi,up_left_p
call g3_rotate_point
or bl,bl
js obj_off_screen
lea esi,up_right_v
lea edi,up_right_p
call g3_rotate_point
or bl,bl
js obj_off_screen
lea esi,down_right_v
lea edi,down_right_p
call g3_rotate_point
or bl,bl
js obj_off_screen
;set all z values same before project
mov eax,up_left_p.z
mov up_right_p.z,eax
mov down_right_p.z,eax
lea esi,up_left_p
call g3_project_point
lea esi,up_right_p
call g3_project_point
lea esi,down_right_p
call g3_project_point
mov eax,obj_type
mov edx,bitmap_number
lea ebx,bitmap_points
call render_object_
test draw_bitmap_lines,-1
jz skip_lines
extn gr_setcolor_,gr_line_
mov eax,15
call gr_setcolor_
mov eax,up_left_p.p3_sx
mov edx,up_left_p.p3_sy
mov ebx,up_right_p.p3_sx
mov ecx,up_right_p.p3_sy
call gr_line_
mov ebx,up_right_p.p3_sx
mov ecx,up_right_p.p3_sy
mov eax,down_right_p.p3_sx
mov edx,down_right_p.p3_sy
call gr_line_
skip_lines:
obj_off_screen:
popm eax,ebx,ecx,edx,esi,edi
ret
_TEXT ends
end