[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]

    {
    Ok, it's finished now, and it's pretty fast (1600-1700 poly's per second on
    one of the DX2-66's in school). You can find it below. But I doubt if you'll
    learn a lot from it, except asm tricks. Better is to understand the method,
    and then write you own routines. But you're allowed to use it :-) (Credit
    me, allright? I like that :-).

    > I haven't done much figure graphics(stuff like polygons, 3d,
    > rotating, etc...), simply because I'm still learning, and am
    > going slow.  But, what else can you expect, I'm only 14.  <g>

    Well, in that case you've got enough time to learn :-). I'm 19 now, and I'm
    still learning every day (In fact I've been born 10 years early, I started
    programming on a ZX Spectrum (yech, 8 colors) :-). Just pay attention in
    math-class. For efficient code, you need to know your math's really well!

    Ok, here's the polygon-routine:
    }

    Procedure TriAngle(X1,Y1,X2,Y2,X3,Y3:Integer; Color:Byte); Assembler;
    Var RV1,RV2,IF1,IF2,DeX1,DeX2,DeY1,DeY2 : Integer;
    Asm

      CLI

      {Sort by Y-value}
      Mov  CX,2
    @@SortLoop:
      Mov  AX,[Y2]; Cmp  AX,[Y3]; JBE  @@Skip1
      Xor  AX,[Y3]; Xor  [Y3],AX; Xor  AX,[Y3]; Mov  [Y2],AX
      Mov  AX,[X2]; Xor  AX,[X3]; Xor  [X3],AX; Xor  AX,[X3]; Mov  [X2],AX
    @@Skip1:
      Mov  AX,[Y1]; Cmp  AX,[Y2]; JBE  @@Skip2
      Xor  AX,[Y2]; Xor  [Y2],AX; Xor  AX,[Y2]; Mov  [Y1],AX
      Mov  AX,[X1]; Xor  AX,[X2]; Xor  [X2],AX; Xor  AX,[X2]; Mov  [X1],AX
    @@Skip2:
      Mov  AX,[Y1]; Cmp  AX,[Y3]; JBE  @@Skip3
      Xor  AX,[Y3]; Xor  [Y3],AX; Xor  AX,[Y3]; Mov  [Y1],AX
      Mov  AX,[X1]; Xor  AX,[X3]; Xor  [X3],AX; Xor  AX,[X3]; Mov  [X1],AX
    @@Skip3:
      Loop @@SortLoop

      {Calculate start-offsets}
      Mov  DX,[Y1]; Shl  DX,6; Mov  BX,DX; Shl  DX,2; Add  DX,BX
      Add  DX,[X1]; Mov  SI,DX

      {Claculate DY, and fill DeY en RefVar with it}
      {Just sorted by Y-value, so no checking for <0 is needed}
      Mov  AX,[Y3]; Sub  AX,[Y1]; Inc  AX; Mov  [DeY1],AX
      Mov  [RV1],AX; Mov  AX,[Y2]; Sub  AX,[Y1]; Inc  AX
      Mov  [DeY2],AX; Mov  [RV2],AX

      {Same for DX. Possible to get a <0 value, so check for that}
      Mov  [IF1],1; Mov  AX,[X3]; Sub  AX,[X1]; JNC  @@SkipDXNeg1
      Neg  AX; Neg  [IF1]
    @@SkipDXNeg1:
      Inc  AX; Mov  [DeX1],AX; Mov  [IF2],1; Mov  AX,[X2]
      Sub  AX,[X1]; JNC  @@SkipDXNeg2; Neg  AX; Neg  [IF2]
    @@SkipDXNeg2:
      Inc  AX; Mov  [DeX2],AX

      {Video segment in ES}
      Mov  AX,$A000; Mov  ES,AX

      Mov  AL,[Color]; Mov  AH,AL; Mov  CX,[DeY2]
    @@DrawLoop1:
      Push CX
      {Draw a horizontal line}
      Mov  DI,DX
      Mov  CX,SI
      Cmp  CX,DI
      JA   @@DontSwap1
      Xchg CX,DI
    @@DontSwap1:
      Sub  CX,DI
      Inc  CX
      Test CX,1
      JZ   @@Even1
      StosB
    @@Even1:
      Shr  CX,1
      Rep  StosW

      {Adapt: RV1, Ofs1}
      Mov  BX,[RV1]
      Sub  BX,[DeX1]
      Cmp  BX,0
      JG   @@DoNothing1
    @@DoSomething1:
      Add  BX,[DeY1]
      Add  DX,[IF1]
      Cmp  BX,0
      JLE  @@DoSomething1
    @@DoNothing1:
      Add  DX,320
      Mov  [RV1],BX

      {Adapt: RV2, Ofs2}
      Mov  BX,[RV2]
      Sub  BX,[DeX2]
      Cmp  BX,0
      JG   @@DoNothing2
    @@DoSomething2:
      Add  BX,[DeY2]
      Add  SI,[IF2]
      Cmp  BX,0
      JLE  @@DoSomething2
    @@DoNothing2:
      Add  SI,320
      Mov  [RV2],BX

      Pop  CX
      Loop @@DrawLoop1

      {Adapt: DeY2, DeX2, RV2, IF2}
      Push DX
      Mov  DX,[Y3]
      Sub  DX,[Y2]
      Inc  DX
      Mov  [DeY2],DX
      Mov  [RV2],DX
      Mov  [IF2],1
      Mov  DX,[X3]
      Sub  DX,[X2]
      JNC  @@DX2Pos
      Neg  DX
      Neg  [IF2]
    @@DX2Pos:
      Inc  DX
      Mov  [DeX2],DX
      Pop  DX

      {Draw second half of poly}
      Mov  CX,[DeY2]
    @@DrawLoop2:
      Push CX
      {Draw a horizontal line}
      Mov  DI,DX
      Mov  CX,SI
      Cmp  CX,DI
      JA   @@DontSwap2
      Xchg CX,DI
    @@DontSwap2:
      Sub  CX,DI
      Inc  CX
      Test CX,1
      JZ   @@Even2
      StosB
    @@Even2:
      Shr  CX,1
      Rep  StosW

      {Adapt: RV1, Ofs1}
      Mov  BX,[RV1]
      Sub  BX,[DeX1]
      Cmp  BX,0
      JG   @@DoNothing3
    @@DoSomething3:
      Add  BX,[DeY1]
      Add  DX,[IF1]
      Cmp  BX,0
      JLE  @@DoSomething3
    @@DoNothing3:
      Add  DX,320
      Mov  [RV1],BX

      {Adapt: RV2, Ofs2}
      Mov  BX,[RV2]
      Sub  BX,[DeX2]
      Cmp  BX,0
      JG   @@DoNothing4
    @@DoSomething4:
      Add  BX,[DeY2]
      Add  SI,[IF2]
      Cmp  BX,0
      JLE  @@DoSomething4
    @@DoNothing4:
      Add  SI,320
      Mov  [RV2],BX

      Pop  CX
      Loop @@DrawLoop2
    @@Exit:
      STI
    End;{NewTri3}

    {
    To make the source readeable again, get rid of all ; (Done to decrease size).
    If you want I can explain to you how it works.
    }

[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]