
-----------------------------------
Homer_simpson
Mon Apr 20, 2009 12:28 pm

3d graphing
-----------------------------------
i was bored so i messed around with my old 3d engine

class Homer3Dengine
    export loadass, moveobject, drawobject, camera, obj, movecamera
    type dot :
        record
            x, y, z : real
        end record
    proc assign3d (var d : dot, x, y, z : real)
        d.x := x
        d.y := y
        d.z := z + 10
    end assign3d
    type object :
        record
            axy, axz, ayz, cx, cy, cz : real
            maxpoly : int
            poly : array 1 .. 1000, 1 .. 2 of dot
            col : array 1 .. 1000 of int
        end record
    var obj : object
    type cam :
        record
            axy, axz, ayz, cx, cy, cz, zoom : real
        end record
    var camera : cam
    camera.cx := 0
    camera.cy := 0
    camera.cz := 0
    camera.axy := 0
    camera.axz := 0
    camera.ayz := 0
    camera.zoom := 3000

    proc loadass (filename : string)
        var file, i : int := 0
        var x1, y1, z1, x2, y2, z2, x3, y3, z3 : real
        var col : int


        loop
            exit when i > 250
            i += 1

            %read : file, x1, y1, z1, x2, y2, z2, x3, y3, z3, col
            x1 := (sind (i * 10) * 100) * (i / 30)
            x2 := (sind ((i + 1) * 10 + 1) * 100) * ((i + 1) / 30)

            y1 := (cosd (i * 10) * 100) * (i / 30)
            y2 := (cosd ((i + 1) * 10 + 2) * 100) * ((i + 1) / 30)

            z1 := i * 3
            z2 := (i + 1) * 3

            col := 2
            assign3d (obj.poly (i, 1), x1, y1, z1)
            assign3d (obj.poly (i, 2), x2, y2, z2)
            obj.col (i) := col
        end loop
        obj.maxpoly := i
        obj.axy := 0
        obj.axz := 0
        obj.ayz := 0
    end loadass


    proc rotate (OriginX, OriginY : real, var secondpartX, secondpartY : real, Rotaion : real)
        var tempx := (((OriginX - secondpartX) * cosd (Rotaion)) + ((OriginY - secondpartY) * sind (Rotaion)))
        var tempy := (((OriginY - secondpartY) * cosd (Rotaion)) - ((OriginX - secondpartX) * sind (Rotaion)))
        secondpartY := OriginY - tempy
        secondpartX := OriginX - tempx
    end rotate
    proc findcenter (var x, y, z : real)
        x := 0.0
        y := 0.0
        z := 0.0
        for i : 1 .. obj.maxpoly
            for ii : 1 .. 2
                x += obj.poly (i, ii).x
                y += obj.poly (i, ii).y
                z += obj.poly (i, ii).z
            end for
        end for
        x /= (obj.maxpoly * 2)
        y /= (obj.maxpoly * 2)
        z /= (obj.maxpoly * 2)
        %drawfilloval (round (obj.cx / (obj.cz / camera.zoom)) + 320, round (obj.cy / (obj.cz / camera.zoom)) + 200, 10, 10, 12)

    end findcenter

    proc draw3dpolygon (d1, d2, d3 : dot, c, c2 : int, filled : boolean)
        if d1.z not= 0 and d2.z not= 0 and d3.z not= 0 then
            %    drawline (round (d1.x / (d1.z / camera.zoom)) + 320, round (d1.y / (d1.z / camera.zoom)) + 200, round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, c)
            %    drawline (round (d1.x / (d1.z / camera.zoom)) + 320, round (d1.y / (d1.z / camera.zoom)) + 200, round (d3.x / (d3.z / camera.zoom)) + 320, round (d3.y / (d3.z / camera.zoom)) + 200, c)
            %    drawline (round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, round (d3.x / (d3.z / camera.zoom)) + 320, round (d3.y / (d3.z / camera.zoom)) + 200, c)
            %drawline (round (obj.cx / (obj.cz / camera.zoom)) + 320, round (obj.cy / (obj.cz / camera.zoom)) + 200, round (d2.x / (d2.z / camera.zoom)) + 320, round (d2.y / (d2.z / camera.zoom)) + 200, 12)
            var xx : array 1 .. 3 of int
            var yy : array 1 .. 3 of int
            xx (1) := round ((d1.x - camera.cx) / ((d1.z - camera.cz) / camera.zoom)) + 320
            xx (2) := round ((d2.x - camera.cx) / ((d2.z - camera.cz) / camera.zoom)) + 320
            xx (3) := round ((d3.x - camera.cx) / ((d3.z - camera.cz) / camera.zoom)) + 320
            yy (1) := round ((d1.y - camera.cy) / ((d1.z - camera.cz) / camera.zoom)) + 200
            yy (2) := round ((d2.y - camera.cy) / ((d2.z - camera.cz) / camera.zoom)) + 200
            yy (3) := round ((d3.y - camera.cy) / ((d3.z - camera.cz) / camera.zoom)) + 200
            if filled then
                %Draw.FillPolygon (xx, yy, 3, c)
                %Draw.Polygon (xx, yy, 3, c)
            end if
            Draw.Polygon (xx, yy, 3, c2)
        end if
    end draw3dpolygon

    proc draw3dline (d1, d2 : dot, c : int)
        if d1.z not= 0 and d2.z not= 0 then
            Draw.Line (round ((d1.x - camera.cx) / ((d1.z - camera.cz) / camera.zoom)) + 320, round ((d1.y - camera.cy) / ((d1.z - camera.cz) / camera.zoom)) + 200,
                round ((d2.x - camera.cx) / ((d2.z - camera.cz) / camera.zoom)) + 320, round ((d2.y - camera.cy) / ((d2.z - camera.cz) / camera.zoom)) + 200, c)
        end if
    end draw3dline

    proc drawobject (col, col2, typ : int)
        var cent, tvec : dot;
        if typ = 1 then
            for i : 1 .. obj.maxpoly
                %draw3dpolygon (obj.poly (i, 1), obj.poly (i, 2), obj.poly (i, 3), col, col2, true)
                cent.x := (obj.poly (i, 1).x + obj.poly (i, 2).x) / 3
                cent.y := (obj.poly (i, 1).y + obj.poly (i, 2).y) / 3
                cent.z := (obj.poly (i, 1).z + obj.poly (i, 2).z) / 3

                %tvec.x := cent.x + obj.normals (i).x * 2
                %tvec.y := cent.y + obj.normals (i).y * 2
                %tvec.z := cent.z + obj.normals (i).z * 2
                %draw3dline (cent, tvec, white)
                draw3dline (obj.poly (i, 1), obj.poly (i, 2), col2)
                %draw3dpolygon (tvec, tvec, tvec, col, col2, true)
            end for
        end if

    end drawobject


    proc moveobject (s : string, d : real)
        findcenter (obj.cx, obj.cy, obj.cz)
        case s of
            label "xy" :
                obj.axy += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 2
                        rotate (obj.cx, obj.cy, obj.poly (i, ii).x, obj.poly (i, ii).y, d)
                    end for
                end for
            label "xz" :
                obj.axz += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 2
                        rotate (obj.cx, obj.cz, obj.poly (i, ii).x, obj.poly (i, ii).z, d)
                    end for
                end for
            label "yz" :
                obj.ayz += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 2
                        rotate (obj.cy, obj.cz, obj.poly (i, ii).y, obj.poly (i, ii).z, d)
                    end for
                end for
            label "x" :
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        obj.poly (i, ii).x += d
                    end for
                end for
            label "y" :
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        obj.poly (i, ii).y += d
                    end for
                end for
            label "z" :
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 2
                        obj.poly (i, ii).z += d
                    end for
                end for
            label :
        end case
    end moveobject
    proc movecamera (s : string, d : real)
        case s of
            label "xy" :
                camera.axy += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        rotate (camera.cx, camera.cy, obj.poly (i, ii).x, obj.poly (i, ii).y, d)
                    end for
                end for
            label "xz" :
                camera.axz += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        rotate (camera.cx, camera.cz, obj.poly (i, ii).x, obj.poly (i, ii).z, d)
                    end for
                end for
            label "yz" :
                camera.ayz += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        rotate (camera.cy, camera.cz, obj.poly (i, ii).y, obj.poly (i, ii).z, d)
                    end for
                end for
            label "x" :
                camera.cx += d
            label "y" :
                camera.cy += d
            label "z" :
                camera.cz += d
            label "zoom" :
                camera.zoom += d
                if camera.zoom = 0 then
                    camera.zoom += d
                end if
            label :
        end case
    end movecamera
end Homer3Dengine
var spike : ^Homer3Dengine
new Homer3Dengine, spike
%spike -> loadarf ("spike.arf")
spike -> loadass ("spike.arf")
colorback (black)
cls
View.Set ("offscreenonly")
spike -> moveobject ("z", 17000)


color (white)
loop
    locate (1, 1)
    /*put "Object coords :    ", spike -> obj.cx, " / ", spike -> obj.cy, " / ", spike -> obj.cz, " / "
     put "Object angles :    ", spike -> obj.axy mod 360, " / ", spike -> obj.axz mod 360, " / ", spike -> obj.ayz mod 360, " / "
     put "Camera coords :    ", spike -> camera.cx, " / ", spike -> camera.cy, " / ", spike -> camera.cz, " / "
     put "Camera angles :    ", spike -> camera.axy mod 360, " / ", spike -> camera.axz mod 360, " / ", spike -> camera.ayz mod 360, " / "
     put "Camera zoom :    ", spike -> camera.zoom, "X"%*/
    spike -> moveobject ("xz", 1) %rotates the object in xz axis
    spike -> moveobject ("yz", 1) %rotates the object in xz axis
    %spike -> moveobject ("x", 1) %moves object in x axis
    %spike -> movecamera ("z", -1) %moves camera in z axis
    spike -> drawobject (1, 10, 1) %draws the object with color 1 and 10 and in method 1
    View.Update
    delay (5)
    cls
end loop



-----------------------------------
Homer_simpson
Mon Apr 20, 2009 12:50 pm

Re: 3d graphing
-----------------------------------
here's another one :class Homer3Dengine
    export loadass, moveobject, drawobject, camera, obj, movecamera
    type dot :
        record
            x, y, z : real
        end record
    proc assign3d (var d : dot, x, y, z : real)
        d.x := x
        d.y := y
        d.z := z + 10
    end assign3d
    type object :
        record
            axy, axz, ayz, cx, cy, cz : real
            maxpoly : int
            poly : array 1 .. 1000, 1 .. 2 of dot
            col : array 1 .. 1000 of int
        end record
    var obj : object
    type cam :
        record
            axy, axz, ayz, cx, cy, cz, zoom : real
        end record
    var camera : cam
    camera.cx := 0
    camera.cy := 0
    camera.cz := 0
    camera.axy := 0
    camera.axz := 0
    camera.ayz := 0
    camera.zoom := 3000

    proc loadass (filename : string)
        var file, i : int := 0
        var x1, y1, z1, x2, y2, z2, x3, y3, z3 : real
        var col : int


        loop
            exit when i > 250
            i += 1

            %read : file, x1, y1, z1, x2, y2, z2, x3, y3, z3, col
            x1 := (sind (i * 10) * 100) * (i / 30)
            x2 := (sind ((i + 1) * 10) * 100) * ((i + 1) / 30)

            y1 := (cosd (i * 10) * 100) * (i / 30)
            y2 := (cosd ((i + 1) * 10) * 100) * ((i + 1) / 30)

            z1 := (sind (i * 20) * 50) * (i / 30) %(i * i)/50
            z2 := (sind ((i + 1) * 20) * 50) * (i / 30) %((i + 1)*(i+1)) / 50

            col := 2
            assign3d (obj.poly (i, 1), x1, y1, z1)
            assign3d (obj.poly (i, 2), x2, y2, z2)
            obj.col (i) := col
        end loop
        obj.maxpoly := i
        obj.axy := 0
        obj.axz := 0
        obj.ayz := 0
    end loadass


    proc rotate (OriginX, OriginY : real, var secondpartX, secondpartY : real, Rotaion : real)
        var tempx := (((OriginX - secondpartX) * cosd (Rotaion)) + ((OriginY - secondpartY) * sind (Rotaion)))
        var tempy := (((OriginY - secondpartY) * cosd (Rotaion)) - ((OriginX - secondpartX) * sind (Rotaion)))
        secondpartY := OriginY - tempy
        secondpartX := OriginX - tempx
    end rotate
    proc findcenter (var x, y, z : real)
        x := 0.0
        y := 0.0
        z := 0.0
        for i : 1 .. obj.maxpoly
            for ii : 1 .. 2
                x += obj.poly (i, ii).x
                y += obj.poly (i, ii).y
                z += obj.poly (i, ii).z
            end for
        end for
        x /= (obj.maxpoly * 2)
        y /= (obj.maxpoly * 2)
        z /= (obj.maxpoly * 2)
        %drawfilloval (round (obj.cx / (obj.cz / camera.zoom)) + 320, round (obj.cy / (obj.cz / camera.zoom)) + 200, 10, 10, 12)

    end findcenter



    proc draw3dline (d1, d2 : dot, c : int)
        if d1.z not= 0 and d2.z not= 0 then
            Draw.ThickLine (round ((d1.x - camera.cx) / ((d1.z - camera.cz) / camera.zoom)) + 320, round ((d1.y - camera.cy) / ((d1.z - camera.cz) / camera.zoom)) + 200,
                round ((d2.x - camera.cx) / ((d2.z - camera.cz) / camera.zoom)) + 320, round ((d2.y - camera.cy) / ((d2.z - camera.cz) / camera.zoom)) + 200, 3, c)
        end if
    end draw3dline

    proc drawobject (col, col2, typ : int)
        var cent, tvec : dot;
        if typ = 1 then
            for i : 1 .. obj.maxpoly
                %draw3dpolygon (obj.poly (i, 1), obj.poly (i, 2), obj.poly (i, 3), col, col2, true)
                cent.x := (obj.poly (i, 1).x + obj.poly (i, 2).x) / 3
                cent.y := (obj.poly (i, 1).y + obj.poly (i, 2).y) / 3
                cent.z := (obj.poly (i, 1).z + obj.poly (i, 2).z) / 3

                %tvec.x := cent.x + obj.normals (i).x * 2
                %tvec.y := cent.y + obj.normals (i).y * 2
                %tvec.z := cent.z + obj.normals (i).z * 2
                %draw3dline (cent, tvec, white)
                draw3dline (obj.poly (i, 1), obj.poly (i, 2), col2)
                %draw3dpolygon (tvec, tvec, tvec, col, col2, true)
            end for
        end if

    end drawobject


    proc moveobject (s : string, d : real)
        findcenter (obj.cx, obj.cy, obj.cz)
        case s of
            label "xy" :
                obj.axy += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 2
                        rotate (obj.cx, obj.cy, obj.poly (i, ii).x, obj.poly (i, ii).y, d)
                    end for
                end for
            label "xz" :
                obj.axz += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 2
                        rotate (obj.cx, obj.cz, obj.poly (i, ii).x, obj.poly (i, ii).z, d)
                    end for
                end for
            label "yz" :
                obj.ayz += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 2
                        rotate (obj.cy, obj.cz, obj.poly (i, ii).y, obj.poly (i, ii).z, d)
                    end for
                end for
            label "x" :
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        obj.poly (i, ii).x += d
                    end for
                end for
            label "y" :
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        obj.poly (i, ii).y += d
                    end for
                end for
            label "z" :
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 2
                        obj.poly (i, ii).z += d
                    end for
                end for
            label :
        end case
    end moveobject
    proc movecamera (s : string, d : real)
        case s of
            label "xy" :
                camera.axy += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        rotate (camera.cx, camera.cy, obj.poly (i, ii).x, obj.poly (i, ii).y, d)
                    end for
                end for
            label "xz" :
                camera.axz += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        rotate (camera.cx, camera.cz, obj.poly (i, ii).x, obj.poly (i, ii).z, d)
                    end for
                end for
            label "yz" :
                camera.ayz += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        rotate (camera.cy, camera.cz, obj.poly (i, ii).y, obj.poly (i, ii).z, d)
                    end for
                end for
            label "x" :
                camera.cx += d
            label "y" :
                camera.cy += d
            label "z" :
                camera.cz += d
            label "zoom" :
                camera.zoom += d
                if camera.zoom = 0 then
                    camera.zoom += d
                end if
            label :
        end case
    end movecamera
end Homer3Dengine
var spike : ^Homer3Dengine
new Homer3Dengine, spike
%spike -> loadarf ("spike.arf")
spike -> loadass ("spike.arf")
colorback (black)
cls
View.Set ("offscreenonly")
spike -> moveobject ("z", 17000)


color (white)
loop
    locate (1, 1)
    /*put "Object coords :    ", spike -> obj.cx, " / ", spike -> obj.cy, " / ", spike -> obj.cz, " / "
     put "Object angles :    ", spike -> obj.axy mod 360, " / ", spike -> obj.axz mod 360, " / ", spike -> obj.ayz mod 360, " / "
     put "Camera coords :    ", spike -> camera.cx, " / ", spike -> camera.cy, " / ", spike -> camera.cz, " / "
     put "Camera angles :    ", spike -> camera.axy mod 360, " / ", spike -> camera.axz mod 360, " / ", spike -> camera.ayz mod 360, " / "
     put "Camera zoom :    ", spike -> camera.zoom, "X"%*/
    spike -> moveobject ("xy", .5) %rotates the object in xz axis
    spike -> moveobject ("xz", 1) %rotates the object in xz axis
    spike -> moveobject ("yz", 1) %rotates the object in xz axis
    %spike -> moveobject ("x", 1) %moves object in x axis
    %spike -> movecamera ("z", -1) %moves camera in z axis
    spike -> drawobject (1, 10, 1) %draws the object with color 1 and 10 and in method 1
    View.Update
    delay (5)
    cls
end loop









you can replace this procedure to get different effects


-----------------------------------
saltpro15
Mon Apr 20, 2009 2:20 pm

RE:3d graphing
-----------------------------------
...


* starts slow clap  *

-----------------------------------
Homer_simpson
Tue Apr 21, 2009 5:45 pm

Re: 3d graphing
-----------------------------------
here's one with controls : arrow keys

class Homer3Dengine
    export loadass, moveobject, drawobject, camera, obj, movecamera
    type dot :
        record
            x, y, z : real
        end record
    proc assign3d (var d : dot, x, y, z : real)
        d.x := x
        d.y := y
        d.z := z + 10
    end assign3d
    type object :
        record
            axy, axz, ayz, cx, cy, cz : real
            maxpoly : int
            poly : array 1 .. 1000, 1 .. 2 of dot
            col : array 1 .. 1000 of int
        end record
    var obj : object
    type cam :
        record
            axy, axz, ayz, cx, cy, cz, zoom : real
        end record
    var camera : cam
    camera.cx := 0
    camera.cy := 0
    camera.cz := 0
    camera.axy := 0
    camera.axz := 0
    camera.ayz := 0
    camera.zoom := 3000

    proc loadass (var1, var2 : real)
        var file, i : int := 0
        var x1, y1, z1, x2, y2, z2 : real
        var col : int

        %var var1 := 30
        loop
            exit when i > 450
            i += 1

            %read : file, x1, y1, z1, x2, y2, z2, x3, y3, z3, col
            x1 := (sind (i * var1) * 100) * (i / 30)
            x2 := (sind ((i + 1) * var1) * 100) * ((i + 1) / 30)

            y1 := (cosd (i * var1) * 100) * (i / 30)
            y2 := (cosd ((i + 1) * var1) * 100) * ((i + 1) / 30)

            z1 := (sind (i * var2) * 50) * (i / 50) %(i * i)/50
            z2 := (sind ((i + 1) * var2) * 50) * ((i + 1) / 50) %((i + 1)*(i+1)) / 50

            col := 2
            assign3d (obj.poly (i, 1), x1, y1, z1)
            assign3d (obj.poly (i, 2), x2, y2, z2)
            obj.col (i) := col
        end loop
        obj.maxpoly := i
        obj.axy := 0
        obj.axz := 0
        obj.ayz := 0
    end loadass


    proc rotate (OriginX, OriginY : real, var secondpartX, secondpartY : real, Rotaion : real)
        var tempx := (((OriginX - secondpartX) * cosd (Rotaion)) + ((OriginY - secondpartY) * sind (Rotaion)))
        var tempy := (((OriginY - secondpartY) * cosd (Rotaion)) - ((OriginX - secondpartX) * sind (Rotaion)))
        secondpartY := OriginY - tempy
        secondpartX := OriginX - tempx
    end rotate
    proc findcenter (var x, y, z : real)
        x := 0.0
        y := 0.0
        z := 0.0
        for i : 1 .. obj.maxpoly
            for ii : 1 .. 2
                x += obj.poly (i, ii).x
                y += obj.poly (i, ii).y
                z += obj.poly (i, ii).z
            end for
        end for
        x /= (obj.maxpoly * 2)
        y /= (obj.maxpoly * 2)
        z /= (obj.maxpoly * 2)
        %drawfilloval (round (obj.cx / (obj.cz / camera.zoom)) + 320, round (obj.cy / (obj.cz / camera.zoom)) + 200, 10, 10, 12)

    end findcenter



    proc draw3dline (d1, d2 : dot, c : int)
        if d1.z not= 0 and d2.z not= 0 then
            Draw.ThickLine (round ((d1.x - camera.cx) / ((d1.z - camera.cz) / camera.zoom)) + 320, round ((d1.y - camera.cy) / ((d1.z - camera.cz) / camera.zoom)) + 200,
                round ((d2.x - camera.cx) / ((d2.z - camera.cz) / camera.zoom)) + 320, round ((d2.y - camera.cy) / ((d2.z - camera.cz) / camera.zoom)) + 200, 1, c)
        end if
    end draw3dline

    proc drawobject (col, col2, typ : int)
        var cent, tvec : dot;
        if typ = 1 then
            for i : 1 .. obj.maxpoly
                %draw3dpolygon (obj.poly (i, 1), obj.poly (i, 2), obj.poly (i, 3), col, col2, true)
                cent.x := (obj.poly (i, 1).x + obj.poly (i, 2).x) / 3
                cent.y := (obj.poly (i, 1).y + obj.poly (i, 2).y) / 3
                cent.z := (obj.poly (i, 1).z + obj.poly (i, 2).z) / 3

                %tvec.x := cent.x + obj.normals (i).x * 2
                %tvec.y := cent.y + obj.normals (i).y * 2
                %tvec.z := cent.z + obj.normals (i).z * 2
                %draw3dline (cent, tvec, white)
                draw3dline (obj.poly (i, 1), obj.poly (i, 2), col2)
                %draw3dpolygon (tvec, tvec, tvec, col, col2, true)
            end for
        end if

    end drawobject


    proc moveobject (s : string, d : real)
        findcenter (obj.cx, obj.cy, obj.cz)
        case s of
            label "xy" :
                obj.axy += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 2
                        rotate (obj.cx, obj.cy, obj.poly (i, ii).x, obj.poly (i, ii).y, d)
                    end for
                end for
            label "xz" :
                obj.axz += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 2
                        rotate (obj.cx, obj.cz, obj.poly (i, ii).x, obj.poly (i, ii).z, d)
                    end for
                end for
            label "yz" :
                obj.ayz += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 2
                        rotate (obj.cy, obj.cz, obj.poly (i, ii).y, obj.poly (i, ii).z, d)
                    end for
                end for
            label "x" :
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        obj.poly (i, ii).x += d
                    end for
                end for
            label "y" :
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        obj.poly (i, ii).y += d
                    end for
                end for
            label "z" :
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 2
                        obj.poly (i, ii).z += d
                    end for
                end for
            label :
        end case
    end moveobject
    proc movecamera (s : string, d : real)
        case s of
            label "xy" :
                camera.axy += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        rotate (camera.cx, camera.cy, obj.poly (i, ii).x, obj.poly (i, ii).y, d)
                    end for
                end for
            label "xz" :
                camera.axz += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        rotate (camera.cx, camera.cz, obj.poly (i, ii).x, obj.poly (i, ii).z, d)
                    end for
                end for
            label "yz" :
                camera.ayz += d
                for i : 1 .. obj.maxpoly
                    for ii : 1 .. 3
                        rotate (camera.cy, camera.cz, obj.poly (i, ii).y, obj.poly (i, ii).z, d)
                    end for
                end for
            label "x" :
                camera.cx += d
            label "y" :
                camera.cy += d
            label "z" :
                camera.cz += d
            label "zoom" :
                camera.zoom += d
                if camera.zoom = 0 then
                    camera.zoom += d
                end if
            label :
        end case
    end movecamera
end Homer3Dengine
var spike : ^Homer3Dengine
new Homer3Dengine, spike
%spike -> loadarf ("spike.arf")
colorback (black)
cls
View.Set ("offscreenonly")
var ch : char := " ";

var v, v2 : real := 20.5
var xy, xz, yz : real
v2 := 20
spike -> loadass (v, v2)
spike -> moveobject ("z", 17000)

color (white)
loop
    if Input.hasch then
        ch := getchar
        if ord (ch) = 200 then
            v += .1
        end if
        if ord (ch) = 208 then
            v -= .1
        end if
        if ord (ch) = 205 then
            v2 += .1
        end if
        if ord (ch) = 203 then
            v2 -= .1
        end if
        xz := spike -> obj.axz
        yz := spike -> obj.ayz
        xy := spike -> obj.axy
        spike -> loadass (v, v2)
        spike -> moveobject ("z", 8500)

        %spike -> moveobject ("xy", xy)
        %spike -> moveobject ("xz", xz)
        %spike -> moveobject ("yz", yz)
        spike -> moveobject ("z", 17000)

    end if
    locate (1, 1)
    /*put "Object coords :    ", spike -> obj.cx, " / ", spike -> obj.cy, " / ", spike -> obj.cz, " / "
     put "Object angles :    ", spike -> obj.axy mod 360, " / ", spike -> obj.axz mod 360, " / ", spike -> obj.ayz mod 360, " / "
     put "Camera coords :    ", spike -> camera.cx, " / ", spike -> camera.cy, " / ", spike -> camera.cz, " / "
     put "Camera angles :    ", spike -> camera.axy mod 360, " / ", spike -> camera.axz mod 360, " / ", spike -> camera.ayz mod 360, " / "
     put "Camera zoom :    ", spike -> camera.zoom, "X"%*/
    spike -> moveobject ("xy", .5) %rotates the object in xz axis
    spike -> moveobject ("xz", 1) %rotates the object in xz axis
    spike -> moveobject ("yz", 1) %rotates the object in xz axis
    %spike -> moveobject ("x", 1) %moves object in x axis
    %spike -> movecamera ("z", -1) %moves camera in z axis
    spike -> drawobject (1, 10, 1) %draws the object with color 1 and 10 and in method 1
    View.Update
    delay (5)
    cls
end loop


