Author Topic: Rotating a Cube . . . Pseudo3D? . . . help please?  (Read 3213 times)

0 Members and 1 Guest are viewing this topic.

Offline DrewPee

  • I Toast Therefore I am
  • Pentium
  • *****
  • Posts: 563
  • Karma: 25
  • Eat Cheese - It's good for you!
    • View Profile
    • Retro Computer Museum
Hello again
Does anybody know how to rotate a outlined 3D cube? in Freebasic using TinyPTC?
Ive tried and failed and is beginning to p me off!
Any help is very much appreciated.

Drew
DrewPee
aka Falcon of The Lost Boyz (Amiga)
Ex-Amiga Coder and Graphic Designer
Administrator of > www.retrocomputermuseum.co.uk

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17409
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Re: Rotating a Cube . . . Pseudo3D? . . . help please?
« Reply #1 on: August 08, 2007 »
You'll need a line drawing routine for a start, I don't have a ready made wireframe cube here atm so I'll make one for you :)
Shockwave ^ Codigos
Challenge Trophies Won:

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17409
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Re: Rotating a Cube . . . Pseudo3D? . . . help please?
« Reply #2 on: August 08, 2007 »
I should apologise for this shit before I start. These were hacked together from some of my old demos.

Some of the routines are shit.
The line cube you'll need to play around with the connections to get rid of the line across each face, each face is divided into 2 triangular polygons atm as it was converted from a filled cube code.

Wire Frame:

Code: [Select]
'-------------------------------------------------------------------------
' CONSTANTS;
'-------------------------------------------------------------------------

    CONST   XRES    =   800:'            SCREEN WIDTH
    CONST   YRES    =   600:'            SCREEN HEIGHT

    DIM SHARED AS INTEGER HALFX,HALFY
   
                          HALFX=XRES/2:' SIMPLE OPTIMISATIONS TO SAVE 2 DIVIDES
                          HALFY=YRES/2:' PER STAR LATER ON.

'-------------------------------------------------------------------------
' FIXED SIZE ARRAYS, DEFINE >ALL< VARIABLES;
'-------------------------------------------------------------------------

    OPTION STATIC
    OPTION EXPLICIT
   
  '  #DEFINE PTC_WIN
    #INCLUDE ONCE  "TINYPTC.BI"
    declare SUB EDGE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL LR AS INTEGER, BYVAL LG AS INTEGER, BYVAL LB AS INTEGER)
    DECLARE SUB FLAT_TRIANGLE( BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER, BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL X3 AS INTEGER, BYVAL Y3 AS INTEGER , BYVAL TC AS INTEGER)   
    DECLARE SUB CONSTRUCT()
    DECLARE SUB ROTATE() 

    DIM SHARED AS UINTEGER BUFFER ( XRES * YRES )

'---------------------------------------------------------
'            Define the necessary variables;
'---------------------------------------------------------
    DIM shared N AS DOUBLE
    dim shared vx1 as double
    dim shared vx2 as double
    dim shared vy1 as double
    dim shared vy2 as double


    DIM SHARED SIZE AS DOUBLE
    DIM SHARED POINTS AS INTEGER
    DIM SHARED FACES AS INTEGER

    DIM SHARED VXR as double
    dim shared VYR as double
    dim shared VZR AS double

   

    points = 8

    size=24
    faces=12

    Dim SHARED Vx(points) AS DOUBLE
    Dim SHARED Vy(points) AS DOUBLE
    Dim SHARED Vz(points) AS DOUBLE
   
    Dim SHARED Vtx(points) AS INTEGER
    Dim SHARED Vty(points) AS INTEGER
    Dim SHARED Vtz(points) AS INTEGER



    Dim SHARED Vf1(faces) AS DOUBLE
    Dim SHARED Vf2(faces) AS DOUBLE
    Dim SHARED Vf3(faces) AS DOUBLE
    Dim SHARED Vf4(faces) AS DOUBLE
    Dim SHARED Vr(faces) AS DOUBLE
    Dim SHARED Vg(faces) AS DOUBLE
    Dim SHARED Vb(faces) AS DOUBLE


 
   
 
'---------------------------------------------------------
'               Read in the Object's points;
'---------------------------------------------------------
    dim A
    For a=1 To points
        Read Vx(a)
        read Vy(a)
        read Vz(a)
    Next

    For a=1 To faces
    Read Vf1(a)
    Read Vf2(a)
    Read Vf3(a)
    Read Vf4(a)
    Read Vr(a)
    READ Vg(a)
    READ Vb(a)
    Next

'-------------------------------------------------------------------------
' OPEN SCREEN
'-------------------------------------------------------------------------

    If( ptc_open( "+ CUBE +", XRES, YRES ) = 0 ) Then
    End -1
End If

    WHILE(1)
       
       ROTATE()
        CONSTRUCT()

        PTC_UPDATE@BUFFER(0):'           UPDATE THE SCREEN BUFFER.
        ERASE BUFFER:'                   CLEAR THE BUFFER AND .:. THE SCREEN.
       
    wend
    end

SUB construct()



    DIM A
    DIM  AS DOUBLE N,RD,GR,BL
'---------------------------------------------------------
'              Draw A Face Of The Object;
'---------------------------------------------------------

    For a=1 To faces step 2

'---------------------------------------------------------
'              Draw A Face Of The Object;
'---------------------------------------------------------


  vx1= Vtx(Vf1(a))-Vtx(Vf2(a))
  vy1= Vty(Vf1(a))-Vty(Vf2(a))
  vx2= Vtx(Vf3(a))-Vtx(Vf2(a))
  vy2= Vty(Vf3(a))-Vty(Vf2(a))
  n=  vx1*vy2-vx2*vy1
 
If n<0 THEN

    n=-(n/1200)
                        rd=Vr(a)*n : If rd>250 THEN rd=250
                        gr=Vg(a)*n : If gr>250 THEN gr=250
                        bl=Vb(a)*n : If bl>250 THEN bl=250 
                       
edge     (Vtx(Vf1(a)),Vty(Vf1(a)),Vtx(Vf2(a)),Vty(Vf2(a)),rd,gr,bl)                   
edge     (Vtx(Vf2(a)),Vty(Vf2(a)),Vtx(Vf3(a)),Vty(Vf3(a)),rd,gr,bl)                   
edge     (Vtx(Vf1(a)),Vty(Vf1(a)),Vtx(Vf3(a)),Vty(Vf3(a)),rd,gr,bl)                   

edge     (Vtx(Vf1(a+1)),Vty(Vf1(a+1)),Vtx(Vf2(a+1)),Vty(Vf2(a+1)),rd,gr,bl)                   
edge     (Vtx(Vf2(a+1)),Vty(Vf2(a+1)),Vtx(Vf3(a+1)),Vty(Vf3(a+1)),rd,gr,bl)                   
edge     (Vtx(Vf1(a+1)),Vty(Vf1(a+1)),Vtx(Vf3(a+1)),Vty(Vf3(a+1)),rd,gr,bl)                   


    End If
    NEXT

END SUB


SUB ROTATE()
DIM A
DIM XCUNT AS DOUBLE
xcunt=0
    DIM VX1 AS DOUBLE
    dim VY1 AS DOUBLE
    dim VZ1 AS DOUBLE
   
    DIM VZZ AS DOUBLE   
    dim vxx as double
    dim vyy as double
   
    DIM VDV AS DOUBLE

'###############################################
'## Rotate And Scale Each Point! Store Result ##
'###############################################
 For a=1 To points

    VX1=Vx(a)
    VY1=Vy(a)
   
    VZ1=Vz(a)
   
'######################
'## X,Y,Z rotations! ##
'######################
  Vxx=Vx1
  Vyy=Vy1*cos(Vxr)+Vz1*sin(Vxr)
  Vzz=Vz1*cos(Vxr)-Vy1*sin(Vxr)
 
  Vy1=Vyy
  Vx1=Vxx*cos(Vyr)-Vzz*sin(Vyr)
  Vz1=Vxx*sin(Vyr)+Vzz*cos(Vyr)
 
  Vzz=Vz1
  Vxx=Vx1*cos(Vzr)-Vy1*sin(Vzr)
  Vyy=Vx1*sin(Vzr)+Vy1*cos(Vzr)
'########################
'## Apply Perspective! ##
'########################
  Vdv=(Vzz/30)+1

  Vxx=(size*(Vxx/Vdv))+halfx
 
  Vyy=(size*(Vyy/Vdv))+HALFY
 
  Vtx(a)=Int(Vxx)
  Vty(a)=Int(Vyy)
  Vtz(a)=Int(Vzz)

 Next

        Vxr=Vxr+.04
        Vyr=Vyr+.03
        Vzr=Vzr+.02

END SUB

SUB FLAT_TRIANGLE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER, BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL X3 AS INTEGER, BYVAL Y3 AS INTEGER , BYVAL TC AS INTEGER)
'-------------------------------------------------------------------------
' FLAT TRIANGLE RENDERER WITH ASSEMBLY LANGUAGE RASTERISING BY SHOCKWAVE ^ DBF ^ S!P 2006.
'-------------------------------------------------------------------------
'-------------------------------------------------------------------------
' WE NEED TO SORT THESE POINTS INTO ORDER FROM TOP TO BOTTOM, AN EXCHANGE SORT IS OK.
' AS WE ONLY HAVE GOT 3 POINTS TO ARRANGE.
'-------------------------------------------------------------------------
DIM AS INTEGER TEMPX,TEMPY,LO,LI
                DIM AS INTEGER PX(3)
                DIM AS INTEGER PY(3)
                DIM TFLAG AS INTEGER
                dim pp as uinteger PTR
                DIM AS INTEGER IL1,IL2,SLICE
                TFLAG=0
        PX(1)= X1
        PX(2)= X2
        PX(3)= X3
       
        PY(1)= Y1
        PY(2)= Y2
        PY(3)= Y3

FOR LO = 1 TO 2
    FOR LI =1 TO 2     
        IF PY(LI+1) <= PY(LI) THEN
        TEMPX = PX(LI) : TEMPY = PY(LI)
        PX(LI) = PX(LI+1)
        PY(LI) = PY(LI+1)
        PX(LI+1) = TEMPX
        PY(LI+1) = TEMPY
        END IF   
    NEXT LI
NEXT LO

'   BOOT OUT INVISIBLE TRIANGLES!

    IF PX(1)<0 AND PX(2)<0  AND PX(3)< 0 THEN TFLAG=1
    IF PX(1)>XRES AND PX(2)>XRES  AND PX(3)>XRES THEN TFLAG=1
    IF PY(1)>YRES AND PY(2)>YRES  AND PY(3)>YRES THEN TFLAG=1
   
        DIM AS DOUBLE XP1,XP2:' SCREEN POSITIONS.
        DIM AS DOUBLE XI1,XI2:' INTERPOLATIONS.
       
'***
'*** REGULAR TRIANGLE (Y1<Y2 Y2<Y3)
'***

IF PY(1)<PY(2) AND PY(2)<PY(3) or (PY(2) = PY(3)) THEN
    TFLAG=1
XP1 = PX(1)
XP2 = PX(1)
XI1 = (PX(1)-PX(2)) / (PY(2) - PY(1))
XI2 = (PX(1)-PX(3)) / (PY(3) - PY(1))

FOR LO = PY(1) TO PY(2)-1
   
IF LO>=0 AND LO<YRES THEN

    IF XP1<=XP2 THEN
        IL1=XP1
        IL2=XP2
    ELSE
        IL1=XP2
        IL2=XP1
    END IF
   
    IF IL2>XRES THEN IL2=XRES
    IF IL1<0 THEN IL1=0

    SLICE = IL2-IL1
    IF SLICE>0 THEN
    PP = @BUFFER(IL1+(LO*XRES))   
    asm
        mov eax,dword ptr[TC]
        mov ecx, [slice]
        mov edi, [PP]
        rep stosd
    end asm   
    END IF
   

END IF

XP1=XP1-XI1
XP2=XP2-XI2
NEXT

XI1 = (PX(2)-PX(3)) / (PY(3) - PY(2))
XP1 = PX(2)

FOR LO = PY(2) TO PY(3)
IF LO>=0 AND LO<YRES THEN
    IF XP1<=XP2 THEN
        IL1=XP1
        IL2=XP2
    ELSE
        IL1=XP2
        IL2=XP1
    END IF

    IF IL2>XRES THEN IL2=XRES
    IF IL1<0 THEN IL1=0

    SLICE = IL2-IL1
    IF SLICE>0 THEN
    PP = @BUFFER(IL1+(LO*XRES))   
    asm
        mov eax,dword ptr[TC]
        mov ecx, [slice]
        mov edi, [PP]
        rep stosd
    end asm   
    END IF
END IF
XP1=XP1-XI1
XP2=XP2-XI2
NEXT

END IF


'***
'*** FLAT TOPPED TRIANGLE Y1=Y2
'***

IF TFLAG=0 AND PY(1) = PY(2) THEN
   
        TFLAG=1
        XP1 = PX(1)
        XP2 = PX(2)
        XI1 = (PX(1)-PX(3)) / (PY(3) - PY(1))
        XI2 = (PX(2)-PX(3)) / (PY(3) - PY(2))
FOR LO = PY(1) TO PY(3)
 IF LO>=0 AND LO<YRES THEN
    IF XP1<=XP2 THEN
        IL1=XP1
        IL2=XP2
    ELSE
        IL1=XP2
        IL2=XP1
    END IF
   
    IF IL2>XRES THEN IL2=XRES
    IF IL1<0 THEN IL1=0
   
    SLICE = IL2-IL1
    IF SLICE>0 THEN
    PP = @BUFFER(IL1+(LO*XRES))   
    asm
        mov eax,dword ptr[TC]
        mov ecx, [slice]
        mov edi, [PP]
        rep stosd
    end asm   
    END IF
END IF
    XP1=XP1-XI1
    XP2=XP2-XI2

NEXT
END IF
END SUB


SUB EDGE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER , BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL LR AS INTEGER, BYVAL LG AS INTEGER, BYVAL LB AS INTEGER)
'-------------------------------------------------------------------------------
'
' THIS LINE ROUTINE IS NOT VERY FAST BUT IT WORKS. THANKS TETRA.
' USAGE:
' EDGE ( X1 , Y1 , X2 , Y2 , R , G , B )
'
'-------------------------------------------------------------------------------
        DIM xdistance AS DOUBLE
        DIM ydistance AS DOUBLE
        DIM TC AS INTEGER       
        DIM i AS INTEGER
        DIM h2 AS INTEGER
       
        DIM StartX AS DOUBLE
        DIM StartY AS DOUBLE
        DIM XRatio AS DOUBLE
        DIM YRatio AS DOUBLE

        TC = RGB ( LR,LG,LB )

        xdistance = X2 - X1
        ydistance = Y2 - Y1

        h2 = sqr( xdistance * xdistance + ydistance * ydistance )
       
        StartX = X1
        StartY = Y1
       
        XRatio = xdistance * ( 1.0 / h2 )
        YRatio = ydistance * ( 1.0 / h2 )
       
        for i = 0 to h2
            IF STARTX>0 AND STARTX<XRES AND STARTY>0 AND STARTY<YRES THEN
            BUFFER ( INT(StartX) + (INT(StartY) * XRES ) ) = TC
            END IF
            StartX = StartX + XRatio
            StartY = StartY + YRatio
        next i
END SUB


'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
'   The Object Description As Data!
'   The Data Below Describes A Cube.
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

'Points definition;
'~~~~~~~~~~~~~~~~~~
'Below are the points of the Object defined as x,y,z;


data -5,-5,-5,5,-5,-5,5,5,-5,-5,5,-5
data -5,-5, 5,5,-5, 5,5,5, 5,-5,5, 5

data 1,2,3,3,6,3,6
data 1,3,4,4,6,3,6

data 5,6,2,2,6,3,6
data 5,2,1,1,6,3,6

data 4,3,7,7,6,3,6
data 4,7,8,8,6,3,6

data 8,7,5,5,6,3,6
data 6,5,7,7,6,3,6

data 7,3,2,2,6,3,6
data 2,6,7,7,6,3,6

data 5,1,4,4,6,3,6
data 5,8,4,4,6,3,6

And just for Phun, filled;

Code: [Select]
'-------------------------------------------------------------------------
' CONSTANTS;
'-------------------------------------------------------------------------

    CONST   XRES    =   800:'            SCREEN WIDTH
    CONST   YRES    =   600:'            SCREEN HEIGHT

    DIM SHARED AS INTEGER HALFX,HALFY
   
                          HALFX=XRES/2:' SIMPLE OPTIMISATIONS TO SAVE 2 DIVIDES
                          HALFY=YRES/2:' PER STAR LATER ON.

'-------------------------------------------------------------------------
' FIXED SIZE ARRAYS, DEFINE >ALL< VARIABLES;
'-------------------------------------------------------------------------

    OPTION STATIC
    OPTION EXPLICIT
   
  '  #DEFINE PTC_WIN
    #INCLUDE ONCE  "TINYPTC.BI"

    DECLARE SUB FLAT_TRIANGLE( BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER, BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL X3 AS INTEGER, BYVAL Y3 AS INTEGER , BYVAL TC AS INTEGER)   
    DECLARE SUB CONSTRUCT()
    DECLARE SUB ROTATE() 

    DIM SHARED AS UINTEGER BUFFER ( XRES * YRES )

'---------------------------------------------------------
'            Define the necessary variables;
'---------------------------------------------------------
    DIM shared N AS DOUBLE
    dim shared vx1 as double
    dim shared vx2 as double
    dim shared vy1 as double
    dim shared vy2 as double


    DIM SHARED SIZE AS DOUBLE
    DIM SHARED POINTS AS INTEGER
    DIM SHARED FACES AS INTEGER

    DIM SHARED VXR as double
    dim shared VYR as double
    dim shared VZR AS double

   

    points = 8

    size=24
    faces=12

    Dim SHARED Vx(points) AS DOUBLE
    Dim SHARED Vy(points) AS DOUBLE
    Dim SHARED Vz(points) AS DOUBLE
   
    Dim SHARED Vtx(points) AS INTEGER
    Dim SHARED Vty(points) AS INTEGER
    Dim SHARED Vtz(points) AS INTEGER



    Dim SHARED Vf1(faces) AS DOUBLE
    Dim SHARED Vf2(faces) AS DOUBLE
    Dim SHARED Vf3(faces) AS DOUBLE
    Dim SHARED Vf4(faces) AS DOUBLE
    Dim SHARED Vr(faces) AS DOUBLE
    Dim SHARED Vg(faces) AS DOUBLE
    Dim SHARED Vb(faces) AS DOUBLE


 
   
 
'---------------------------------------------------------
'               Read in the Object's points;
'---------------------------------------------------------
    dim A
    For a=1 To points
        Read Vx(a)
        read Vy(a)
        read Vz(a)
    Next

    For a=1 To faces
    Read Vf1(a)
    Read Vf2(a)
    Read Vf3(a)
    Read Vf4(a)
    Read Vr(a)
    READ Vg(a)
    READ Vb(a)
    Next

'-------------------------------------------------------------------------
' OPEN SCREEN
'-------------------------------------------------------------------------

    If( ptc_open( "+ CUBE +", XRES, YRES ) = 0 ) Then
    End -1
End If

    WHILE(1)
       
       ROTATE()
        CONSTRUCT()

        PTC_UPDATE@BUFFER(0):'           UPDATE THE SCREEN BUFFER.
        ERASE BUFFER:'                   CLEAR THE BUFFER AND .:. THE SCREEN.
       
    wend
    end

SUB construct()



    DIM A
    DIM  AS DOUBLE N,RD,GR,BL
'---------------------------------------------------------
'              Draw A Face Of The Object;
'---------------------------------------------------------

    For a=1 To faces step 2

'---------------------------------------------------------
'              Draw A Face Of The Object;
'---------------------------------------------------------


  vx1= Vtx(Vf1(a))-Vtx(Vf2(a))
  vy1= Vty(Vf1(a))-Vty(Vf2(a))
  vx2= Vtx(Vf3(a))-Vtx(Vf2(a))
  vy2= Vty(Vf3(a))-Vty(Vf2(a))
  n=  vx1*vy2-vx2*vy1
 
If n<0 THEN

    n=-(n/1200)
                        rd=Vr(a)*n : If rd>250 THEN rd=250
                        gr=Vg(a)*n : If gr>250 THEN gr=250
                        bl=Vb(a)*n : If bl>250 THEN bl=250 
                       
                        FLAT_TRIANGLE(Vtx(Vf1(a)),Vty(Vf1(a)),Vtx(Vf2(a)),Vty(Vf2(a)),Vtx(Vf3(a)),Vty(Vf3(a)),RGB(RD,GR,BL))
                        FLAT_TRIANGLE(Vtx(Vf1(a+1)),Vty(Vf1(a+1)),Vtx(Vf2(a+1)),Vty(Vf2(a+1)),Vtx(Vf3(a+1)),Vty(Vf3(a+1)),RGB(RD,GR,BL))


    End If
    NEXT

END SUB


SUB ROTATE()
DIM A
DIM XCUNT AS DOUBLE
xcunt=0
    DIM VX1 AS DOUBLE
    dim VY1 AS DOUBLE
    dim VZ1 AS DOUBLE
   
    DIM VZZ AS DOUBLE   
    dim vxx as double
    dim vyy as double
   
    DIM VDV AS DOUBLE

'###############################################
'## Rotate And Scale Each Point! Store Result ##
'###############################################
 For a=1 To points

    VX1=Vx(a)
    VY1=Vy(a)
   
    VZ1=Vz(a)
   
'######################
'## X,Y,Z rotations! ##
'######################
  Vxx=Vx1
  Vyy=Vy1*cos(Vxr)+Vz1*sin(Vxr)
  Vzz=Vz1*cos(Vxr)-Vy1*sin(Vxr)
 
  Vy1=Vyy
  Vx1=Vxx*cos(Vyr)-Vzz*sin(Vyr)
  Vz1=Vxx*sin(Vyr)+Vzz*cos(Vyr)
 
  Vzz=Vz1
  Vxx=Vx1*cos(Vzr)-Vy1*sin(Vzr)
  Vyy=Vx1*sin(Vzr)+Vy1*cos(Vzr)
'########################
'## Apply Perspective! ##
'########################
  Vdv=(Vzz/30)+1

  Vxx=(size*(Vxx/Vdv))+halfx
 
  Vyy=(size*(Vyy/Vdv))+HALFY
 
  Vtx(a)=Int(Vxx)
  Vty(a)=Int(Vyy)
  Vtz(a)=Int(Vzz)

 Next

        Vxr=Vxr+.04
        Vyr=Vyr+.03
        Vzr=Vzr+.02

END SUB

SUB FLAT_TRIANGLE(BYVAL X1 AS INTEGER , BYVAL Y1 AS INTEGER, BYVAL X2 AS INTEGER , BYVAL Y2 AS INTEGER , BYVAL X3 AS INTEGER, BYVAL Y3 AS INTEGER , BYVAL TC AS INTEGER)
'-------------------------------------------------------------------------
' FLAT TRIANGLE RENDERER WITH ASSEMBLY LANGUAGE RASTERISING BY SHOCKWAVE ^ DBF ^ S!P 2006.
'-------------------------------------------------------------------------
'-------------------------------------------------------------------------
' WE NEED TO SORT THESE POINTS INTO ORDER FROM TOP TO BOTTOM, AN EXCHANGE SORT IS OK.
' AS WE ONLY HAVE GOT 3 POINTS TO ARRANGE.
'-------------------------------------------------------------------------
DIM AS INTEGER TEMPX,TEMPY,LO,LI
                DIM AS INTEGER PX(3)
                DIM AS INTEGER PY(3)
                DIM TFLAG AS INTEGER
                dim pp as uinteger PTR
                DIM AS INTEGER IL1,IL2,SLICE
                TFLAG=0
        PX(1)= X1
        PX(2)= X2
        PX(3)= X3
       
        PY(1)= Y1
        PY(2)= Y2
        PY(3)= Y3

FOR LO = 1 TO 2
    FOR LI =1 TO 2     
        IF PY(LI+1) <= PY(LI) THEN
        TEMPX = PX(LI) : TEMPY = PY(LI)
        PX(LI) = PX(LI+1)
        PY(LI) = PY(LI+1)
        PX(LI+1) = TEMPX
        PY(LI+1) = TEMPY
        END IF   
    NEXT LI
NEXT LO

'   BOOT OUT INVISIBLE TRIANGLES!

    IF PX(1)<0 AND PX(2)<0  AND PX(3)< 0 THEN TFLAG=1
    IF PX(1)>XRES AND PX(2)>XRES  AND PX(3)>XRES THEN TFLAG=1
    IF PY(1)>YRES AND PY(2)>YRES  AND PY(3)>YRES THEN TFLAG=1
   
        DIM AS DOUBLE XP1,XP2:' SCREEN POSITIONS.
        DIM AS DOUBLE XI1,XI2:' INTERPOLATIONS.
       
'***
'*** REGULAR TRIANGLE (Y1<Y2 Y2<Y3)
'***

IF PY(1)<PY(2) AND PY(2)<PY(3) or (PY(2) = PY(3)) THEN
    TFLAG=1
XP1 = PX(1)
XP2 = PX(1)
XI1 = (PX(1)-PX(2)) / (PY(2) - PY(1))
XI2 = (PX(1)-PX(3)) / (PY(3) - PY(1))

FOR LO = PY(1) TO PY(2)-1
   
IF LO>=0 AND LO<YRES THEN

    IF XP1<=XP2 THEN
        IL1=XP1
        IL2=XP2
    ELSE
        IL1=XP2
        IL2=XP1
    END IF
   
    IF IL2>XRES THEN IL2=XRES
    IF IL1<0 THEN IL1=0

    SLICE = IL2-IL1
    IF SLICE>0 THEN
    PP = @BUFFER(IL1+(LO*XRES))   
    asm
        mov eax,dword ptr[TC]
        mov ecx, [slice]
        mov edi, [PP]
        rep stosd
    end asm   
    END IF
   

END IF

XP1=XP1-XI1
XP2=XP2-XI2
NEXT

XI1 = (PX(2)-PX(3)) / (PY(3) - PY(2))
XP1 = PX(2)

FOR LO = PY(2) TO PY(3)
IF LO>=0 AND LO<YRES THEN
    IF XP1<=XP2 THEN
        IL1=XP1
        IL2=XP2
    ELSE
        IL1=XP2
        IL2=XP1
    END IF

    IF IL2>XRES THEN IL2=XRES
    IF IL1<0 THEN IL1=0

    SLICE = IL2-IL1
    IF SLICE>0 THEN
    PP = @BUFFER(IL1+(LO*XRES))   
    asm
        mov eax,dword ptr[TC]
        mov ecx, [slice]
        mov edi, [PP]
        rep stosd
    end asm   
    END IF
END IF
XP1=XP1-XI1
XP2=XP2-XI2
NEXT

END IF


'***
'*** FLAT TOPPED TRIANGLE Y1=Y2
'***

IF TFLAG=0 AND PY(1) = PY(2) THEN
   
        TFLAG=1
        XP1 = PX(1)
        XP2 = PX(2)
        XI1 = (PX(1)-PX(3)) / (PY(3) - PY(1))
        XI2 = (PX(2)-PX(3)) / (PY(3) - PY(2))
FOR LO = PY(1) TO PY(3)
 IF LO>=0 AND LO<YRES THEN
    IF XP1<=XP2 THEN
        IL1=XP1
        IL2=XP2
    ELSE
        IL1=XP2
        IL2=XP1
    END IF
   
    IF IL2>XRES THEN IL2=XRES
    IF IL1<0 THEN IL1=0
   
    SLICE = IL2-IL1
    IF SLICE>0 THEN
    PP = @BUFFER(IL1+(LO*XRES))   
    asm
        mov eax,dword ptr[TC]
        mov ecx, [slice]
        mov edi, [PP]
        rep stosd
    end asm   
    END IF
END IF
    XP1=XP1-XI1
    XP2=XP2-XI2

NEXT
END IF
END SUB


'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
'   The Object Description As Data!
'   The Data Below Describes A Cube.
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

'Points definition;
'~~~~~~~~~~~~~~~~~~
'Below are the points of the Object defined as x,y,z;


data -5,-5,-5,5,-5,-5,5,5,-5,-5,5,-5
data -5,-5, 5,5,-5, 5,5,5, 5,-5,5, 5

data 1,2,3,3,6,3,6
data 1,3,4,4,6,3,6

data 5,6,2,2,6,3,6
data 5,2,1,1,6,3,6

data 4,3,7,7,6,3,6
data 4,7,8,8,6,3,6

data 8,7,5,5,6,3,6
data 6,5,7,7,6,3,6

data 7,3,2,2,6,3,6
data 2,6,7,7,6,3,6

data 5,1,4,4,6,3,6
data 5,8,4,4,6,3,6
Shockwave ^ Codigos
Challenge Trophies Won:

Offline DrewPee

  • I Toast Therefore I am
  • Pentium
  • *****
  • Posts: 563
  • Karma: 25
  • Eat Cheese - It's good for you!
    • View Profile
    • Retro Computer Museum
Re: Rotating a Cube . . . Pseudo3D? . . . help please?
« Reply #3 on: August 09, 2007 »
Thanks man! I will have a look later!

Drew
DrewPee
aka Falcon of The Lost Boyz (Amiga)
Ex-Amiga Coder and Graphic Designer
Administrator of > www.retrocomputermuseum.co.uk

Offline DrewPee

  • I Toast Therefore I am
  • Pentium
  • *****
  • Posts: 563
  • Karma: 25
  • Eat Cheese - It's good for you!
    • View Profile
    • Retro Computer Museum
Re: Rotating a Cube . . . Pseudo3D? . . . help please?
« Reply #4 on: August 09, 2007 »
Just had a play around - I think I may use the filled cube . . . will work well in my next production - I will credit you for any code used shockwave. Thanks again man - Not worthy!  :buddies:
DrewPee
aka Falcon of The Lost Boyz (Amiga)
Ex-Amiga Coder and Graphic Designer
Administrator of > www.retrocomputermuseum.co.uk

Offline Shockwave

  • good/evil
  • Founder Member
  • DBF Aficionado
  • ********
  • Posts: 17409
  • Karma: 498
  • evil/good
    • View Profile
    • My Homepage
Re: Rotating a Cube . . . Pseudo3D? . . . help please?
« Reply #5 on: August 09, 2007 »
Go ahead and use it, looking forward to seeing the finished thing!
Shockwave ^ Codigos
Challenge Trophies Won: