123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- ;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
|