home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / SRC / DEMO4B / INT / INTSPLIT.CPP < prev    next >
C/C++ Source or Header  |  1992-10-31  |  2KB  |  119 lines

  1. /* Splitting-tree assembly routines (should be private to splits.c) */
  2.  
  3. /* Written by Bernie Roehl, June 1992 */
  4. /* Substantially upgraded by Dave Stampe, August '92 */
  5.  
  6. /* Copyright 1992 by Dave Stampe and Bernie Roehl.
  7.      May be freely used to write software for release into the public domain;
  8.      all commercial endeavours MUST contact Bernie Roehl and Dave Stampe
  9.      for permission to incorporate any part of this software into their
  10.      products!
  11.  */
  12.  
  13. #pragma inline
  14.  
  15. #include <dos.h>
  16.  
  17. #include "3dstruct.hpp"
  18. #include "splits.hpp"
  19.  
  20. int _which_side(SPLIT *s, long tx,long ty,long tz)
  21. {
  22.     int sign = -1; /* dot product: > , < , = zero */
  23.  
  24.     asm{
  25.         .386
  26.         push cx
  27.         push di
  28.         les bx,DWORD PTR s
  29.  
  30.         mov eax,DWORD PTR es:[bx].(SPLIT)nx
  31.         mov edx,DWORD PTR tx
  32.         sub edx,DWORD PTR es:[bx].(SPLIT)x
  33.         imul edx
  34.         mov ecx,eax
  35.         mov edi,edx
  36.         mov eax,DWORD PTR es:[bx].(SPLIT)ny
  37.         mov edx,DWORD PTR ty
  38.         sub edx,DWORD PTR es:[bx].(SPLIT)y
  39.         imul edx
  40.         add ecx,eax
  41.         adc edi,edx
  42.         mov eax,DWORD PTR es:[bx].(SPLIT)nz
  43.         mov edx,DWORD PTR tz
  44.         sub edx,DWORD PTR es:[bx].(SPLIT)z
  45.         imul edx
  46.         add ecx,eax
  47.         adc edi,edx
  48.         jl alldone
  49.         neg WORD PTR sign
  50.         or edi,ecx
  51.         jnz alldone
  52.         mov WORD PTR sign, di
  53.     }
  54. alldone:
  55.     asm {
  56.         pop di
  57.         pop cx
  58.         }
  59.     return sign;
  60. }
  61.  
  62.  
  63. void _fast_split_descent(SPLIT *tree, long x, long y, long z, char *type)
  64. {
  65.     asm {
  66.         push si
  67.         push cx
  68.         les bx,DWORD PTR tree
  69.         }
  70. next:
  71.     asm {
  72.         or bx,bx
  73.         jz endtree
  74.         mov eax,DWORD PTR es:[bx].(SPLIT)nx
  75.         mov edx,DWORD PTR x
  76.         sub edx,DWORD PTR es:[bx].(SPLIT)x
  77.         imul edx
  78.         mov esi,eax
  79.         mov ecx,edx
  80.         mov eax,DWORD PTR es:[bx].(SPLIT)ny
  81.         mov edx,DWORD PTR y
  82.         sub edx,DWORD PTR es:[bx].(SPLIT)y
  83.         imul edx
  84.         add esi,eax
  85.         adc ecx,edx
  86.         mov eax,DWORD PTR es:[bx].(SPLIT)nz
  87.         mov edx,DWORD PTR z
  88.         sub edx,DWORD PTR es:[bx].(SPLIT)z
  89.         imul edx
  90.         add esi,eax
  91.         adc ecx,edx
  92.         jge right
  93.         mov al,BYTE PTR es:bx.(SPLIT)left_type
  94.         les bx,DWORD PTR es:bx.(SPLIT)left
  95.         cmp al,ISSPLIT
  96.         je next
  97.         jmp endtree
  98.         }
  99. right:
  100.     asm {
  101.         mov al,BYTE PTR es:bx.(SPLIT)right_type
  102.         les bx,DWORD PTR es:bx.(SPLIT)right
  103.         cmp al,ISSPLIT
  104.         je next
  105.         }
  106. endtree:
  107.     asm {
  108.         mov cl,al
  109.         mov ax,bx
  110.         mov dx,es
  111.         les bx,DWORD PTR type
  112.         mov es:bx,cl
  113.         pop cx
  114.         pop si
  115.         }
  116.     return; /* the return value is in DX:AX */
  117. }
  118.  
  119.