/* Example of an OADL equivalent to Hoverware graphic object definitions */

class GraphBase {
    public var
        Rows, Columns,
        Color = {1.0, 1.0, 1.0},
        Scale = {1.0, 1.0, 1.0},
        Rotate = {0.0, 0.0, 0.0},
        Position = {0.0, 0.0, 0.0},
        ClassName = "GraphBase";
    public proc
        create() {
            say( "GraphBase.create; parent = ", self.parent.ClassName, "\n" );
        }
    operator {} () {
            say( "GraphBase.complete; parent = ", self.parent.ClassName, "\n" );
        }
}

class hwSphere(GraphBase) {
    public var
        ClassName = "hwSphere",
        Radius = 1.0,
        LatRange = {-90.0, 90.0},
        LonRange = {0.0, 360.0};
}

class hwRing(GraphBase) {
    public var
        ClassName = "hwRing",
        Radius = {0.5, 1.0},
        LonRange = {0.0, 360.0};
}

class hwCone(GraphBase) {
    public var
        ClassName = "hwCone",
        Radius = {0.0, 1.0},
        Height = 1.0,
        LonRange = {0.0, 360.0};
}

class hwTorus(GraphBase) {
    public var
        ClassName = "hwTorus",
        Radius = {0.5, 1.0},
        LatRange = {0.0, 360.0},
        LonRange = {0.0, 360.0};
}

class hwMesh(GraphBase) {
    public var
        ClassName = "hwMesh",
        Data;
}

class hwPolygon(GraphBase) {
    public var
        ClassName = "hwPolygon",
        Data;
}

class hwPolyline(GraphBase) {
    public var
        ClassName = "hwPolyline",
        Data;
}

class hwPolymarker(GraphBase) {
    public var
        ClassName = "hwPolymarker",
        Data;
}

class hwBox(GraphBase) {
    public var
        ClassName = "hwBox",
        Corners = {0,0,0,1,1,1};
}

class hwSurfRev(GraphBase) {
    public var
        ClassName = "hwSurfRev",
        Sweep = {360.0},
        Data;
}

class hwGroup(GraphBase) {
    public var
        ClassName = "hwGroup",
        Data;
}

class hwAltMesh(GraphBase) {
    public var
        ClassName = "hwAltMesh",
        Data;
}

class hwString(GraphBase) {
    public var
        ClassName = "hwString",
        Data;
}

hwGroup Hack {
    Data = {
        /*new*/ hwSphere {
            Color = {1.0, 0.0, 0.0}
            Radius = 100.0
        },
        /*new*/ hwRing {
            Color = {0.0, 1.0, 0.0}
            Radius = {150.0, 200.0}
        }
    }
}

proc main()
{
    say( "hwSphere.parent = ", hwSphere.parent.ClassName, "\n" );
    say( "Hack.parent = ", Hack.parent.ClassName, "\n" );
}