thinman@netcom.com (Lance Norskog) (04/22/91)
- 33 -
- 34 -
8. _P_r_i_m_i_t_i_v_e__C_l_a_s_s__L_i_b_r_a_r_y
This is the first cut at basic tools I think I want for
doing graphics work. It is in an extremely condensed
pidgin. These are all built-in classes and methods, library
classes are listed in the next section.
/ Root object
(class
ID=Object
)
/ Number class
(class
ID=Number
super=Object
/ multi ops
op Self +(Self, Self, multi Self)
op Self *(Self, Self, multi Self)
/ binary
op Self -(Self, Self)
op Self /(Self, Self)
/ unary ops
op Self -(Self)
op Self sqrt(Self)
op Self number(Boolean)
/ multi ops IS THIS THE RIGHT WAY TO DO THIS?
/ assignment op
op Self Set(Self)
)
/ Angle definition -
/ Number modular around circle
/ Uses signed 2's complement arithmetic to implement clean
/ angular arithmetic. Going beyond 360 degrees rounds off
/ to beginning. If these are implemented with signed chars,
/ all trig becomes table lookups. Should complex numbers
/ subclass from Number or Angle?
(class
ID=Angle
super=Number
)
/ get Graphics Gems book and figure out ops
/ probably nothing needs to be overidden from Number
/ Point class
(class
- 35 -
ID=Point
super=Number
/ creation op
Point op Point(Number, Number, Number)
/ destruction ops
Number op X(Point)
Number op Y(Point)
Number op Z(Point)
/ binary ops
Point op +(Point, Point)
Point op -(Point, Point)
Point op *(Point, Number)
Point op *(Number, Point)
Point op *(Point, Matrix)
Point op *(Matrix, Point)
Point op Distance(Point, Point)
/ unary ops
Point op -(Point)
Point op sqrt(Point)
Point op normalize(Point)
Point op +(Point, Point, multi Point)
)
/ Matrix class - 4x4 matrix for general 3-space xlations
/ Do quaternions completely supercede this?
( class
ID=Matrix
super=Number
/ creation op
Matrix op Matrix(Number, Number, Number, ..., Number) / 16
Matrix op Matrix(Point, Point, Point, Point) / 4x3
/ binary ops
Matrix op *(Matrix, Matrix)
/ unary ops
Matrix op invert(Matrix)
Number op determinant(Matrix)
Matrix op normalize(Matrix)
Matrix op transpose(Matrix)
)
/ random numbers. Deliver a number between 0 & 1.
( class
ID=Random
super=Number
)
/ builtins: all the generators I can get with different distributions.
/ Raid Knuth for algorithms.
- 36 -
/ Range class
/ A range is a pair of numbers. The first must be lower than the second.
(class
ID=Range
super=Number
/ creation op
Range op Range(Number, Number)
/ destruction ops
Number op Lower(Range)
Number op Upper(Range)
/ binary ops
/ Range op +(Range, Range) / do these make sense?
/ Range op -(Range, Range)
Range op Shift(Range, Number) / shift range up or down
Range op Scale(Range, Number) / expand/contract range
/ in Dataset, shift and expand/contract are 'shift' and 'slide' ops
)
/ Boolean class
(class
ID=Boolean
super=Object
/ multi ops
op and(Boolean, multi Boolean)
op nor(Boolean, multi Boolean)
op xor(Boolean, multi Boolean)
/ unary ops
op Boolean not(Boolean)
op Boolean boolean(Number)
op Boolean change(anything) / when input changes, become true
/ assignment op
op Self Set(Self)
)
/ built-in Booleans
stereo / system is drawing in stereo mode - rw
left_eye / system is updating left or right eye - ro
out_of_ram / running on empty: do something! - ro
input_changed / an input value to this operator changed - ro
switch1 / supplied hardware or window system
switch2
switch3
switch4
/ Address of a node
/ This class needs to be here to provide a specific type for
/ indirect references to nodes.
(class
- 37 -
ID=Address
super=Object
)
/ Error class: error exception handler
( class
ID=Error
super=Object
/ On error #N, execute a program
/ Scoped for all siblings of this node and their descendants.
( Self op Self(Number, Void)) / get error
( Self op Self(Number, Void, Void)) / get error with message
/ Should the error number be a property?
/ If not specified, default to all?
( Self op Raise(Number)) / make error
( Self op Raise(Number, Void)) / make error with message
)
/ Void object
/ Various miscellaneous uses : rename it Glue? Clump?
(class
ID=Void
super=Object
(property // call all inputs in order, or simultaneously?
ID=ordered
type=Boolean
inherited=False
)
(property // when to execute
ID=execute
type=Boolean
)
(property // copy tree or evaluate tree and copy value
ID=evaluate
type=Boolean
)
/ clump of nodes
(op Void call( multi type=anything )) / do all
/ conditional
(op Void cond( Boolean, type=anything, type=anything)) / if then else
/ tree surgery operation- can only rearrange at void "cut-points"
/ replace tree at address with tree void
(op Void replace( Address type=Void), Void)
/ add tree to Void call op: add to collection
(op Void add( Address(call) type=Void), Void)
/ maybe remove the most recently added tree?
- 38 -
/ top of World
(op Void World( Void)) / top of world - visibility box
/ This is very goofy. I don't like what it does to
/ tree storage at all.
/ copy value of property from address to address
(op Void Setprop( Address (property name=xxx),
Address (property name=xxx) )
/ copy values of all properties from address to address
(op Void Setprop( Address (property name=xxx),
Address (property name=xxx) )
)
/ Unknown class
/ internal data of unknown format
/ used for things like network addresses, etc.
/ not manipulable, just there.
( class
ID=Unknown
super=Object
)
/ Dataset class
/ data array abstract superclass
(class
ID=Dataset
super=Object
(property
ID=dimensions
type=Number
)
(property
ID=indexable
type=Boolean
)
(property
ID=fractional
type=Boolean
)
/ OR
/(property
/ ID=indexing
/ type=Enum(none,integer,fractional)
/)
/ series of ranges for each dimension
(property
ID=infinite
- 39 -
type=Boolean
)
(property
ID=range0
type=Range
)
/ type of data held
(property
ID=datatype
type=Address
)
/ shift data up or down by factors
(op Self Shift(Self, Number, ...))
/ stretch or shrink indices by scale factors
(op Self Scale(Self, Number, ...))
/ concatenate two datasets to create a new one
/ they must have the same dimensionality, ranges, & types
(op Self concat(Self, Self))
)
/ real datasets you can use
/ HDF scientific data set - NCSA HDF format - or abstract superclass as
/ is deemed appropriate by sci-vis people.
/
/ I have the HDF spec but haven't studied it much.
( class
ID=HDF
super=dataset
)
/ linear numerical set
( class
ID=Linear / spectrum? 1D?
super=Dataset
)
/ random numbers? I don't get it!
/ ( class
/ ID=Random
/ super=Linear
/ )
/ Array
/ 2D or 3D array of equally spaced data points
/ may be formulaically derived (infinite=True). Fractionally indexable
/ (usually).
( class
ID=Texture
- 40 -
super=Dataset
(property
ID=indexable
type=Boolean
value=True
)
)
/ bitmap - 2D monochrome Texture
( class
ID=Bitmap
super=Texture
( property
ID=Dimension
type=Number
value=2
)
( property
ID=Size
type=Box
)
)
/ pixmap - 2D color Texture
( class
ID=Pixmap
super=Texture
( property
ID=Dimension
type=Number
value=2
)
( property
ID=Size
type=Box
)
)
/ body - 3D color Texture - throughcut woodgrain etc.
/ I've forgotten the special name for this, if there was one
( class
ID=Body
super=Texture
( property
ID=Dimension
type=Number
value=3
)
)
/ Drawable object
- 41 -
/ visible screen object abstract superclass
(class
ID=Drawable
/ for now, all the graphics you get.
(property
ID=color
type=Point
)
/ used for selecting several representations based on screen size
/ (that is, distance from user)
/ If this property is set, it overrides 3D placement stuff below.
/ If not set, it reflects the 3D placement stuff below.
(property
ID=screenbox
type=Box
)
/ when is this object to be drawn?
(property
ID=execute
type=Boolean
)
/ coordinate frame.
/ I thought I was using quaternions? Boy, am I confused.
(Property
ID=frame
Type=Point
)
/ xlate, scale, rotate operations
(op Self Scale(Self, Number X, Y, Z))
(op Self Xlate(Self, Number X, Y, Z))
(op Self Rotate(Self, Point Center, ???))
/ collection of drawables, inherit props from here
(op Drawable call(Drawable, multi Drawable))
/ should be drawable?
)
/ Line
( class
ID=Line
Super=Drawable
(Self op Self(Point, Point)) / two endpoints
/ Connect creates a line vertex
(Self op Vertex(Point, Point)) / connector: allow painted textures
)
/ Triangle
( class
- 42 -
ID=Triangle
Super=Drawable
(Self op Self(Point, Point, Point)) / three endpoints
/ Two triangles connect via a hinge
(op Self Hinge (Point, Point)) / Allow spray-painted textures
/ should hinge be self or void?
/ hinge will usually use pointers
)
/ Circle
( class
ID=Circle
Super=Drawable
(Self op Self(Point, Number)) / Center, radius
/ does connecting a circle make sense? At given points?
)
/ Sphere
( class
ID=Line
Super=Drawable
(Self op Self(Point, Number)) / Center, radius
/ does connecting a sphere make sense? At given points?
)
/ Don't hold your breath waiting for support for the following...
/ Patch
/ ( class
/ ID=Patch
/ Super=Drawable
/
/ / hellifino
/ )
/ Patch:Bezier
( class
/ ID=Bezier
/ Super=Patch
/
/ / hellifino
/ )
/ Quadric
/ ( class
/ ID=Quadric
/ Super=Drawable
/
/ (Self op Self()) / Equation inputs
- 43 -
/ (Self op Connect()) / Connect not allowed
/ )
/ Superquadric
/ ( class
/ ID=Line
/ Super=Drawable
/
/ (Self op Self()) / equation inputs
/ (Self op Connect()) / Connect not allowed
/ )
/
/ Painted drawable object
/ Overlay 2D or 3D Drawable with 2D or 3D texture
/ Here we have the classic Trouble With Objects: doing a whole damn
/ class definition just to make two different things interact.
( class
ID=Painted
Super=Drawable
Super=Texture
/ is this image sampled or just a flat bitmap?
/ real-time bitmaps will require the Intel DVI stuff or similar.
/ flat bitmaps are useful for hypertext
/ This can also be stroked Hershey fonts.
( property
ID=flat
type=Boolean
)
(op Apply(Texture, Drawable))
)
/ Built-in textures are 2D: granite, 3D: wood.
/ The apply operator re-runs the texturing operation with a new random
/ seed, to get a new texture.
/ Physical object
/ bounding-box physics abstract superclass.
(class
ID=Physical
super=Object
/ motion
(property
ID=direction
type=Point
)
(property
ID=force
type=Number
- 44 -
)
/ spin
(property
ID=rotation_axis
type=Point
)
(property
ID=angular_momentum
type=Number
)
)
// Box definition - used for physical and screen bounding boxes
(class
ID=Box
input Point lower, upper
(op Point ID=Lower(Box))
(op Point ID=Upper(Box))
(op Number ID=MinDist(Box))
(op Number ID=MaxDist(Box))
)
/ Quaternion class
/ used in 3D rotation & placement work
(class
ID=Quaternion
super=Number
/ creation op
Quaternion op Quaternion(Number, Number, Number, Number)
/ destruction ops
Number op X(Quaternion)
Number op I(Quaterion)
Number op J(Quaterion)
Number op K(Quaterion)
/ binary ops
/ go get the book, I don't know about these operations
Quaterion op +(Quaterion, Quaterion)
Quaterion op -(Quaterion, Quaterion)
Quaterion op *(Quaterion, Number)
Quaterion op *(Number, Quaterion)
Quaterion op *(Quaterion, Matrix)
Quaterion op *(Matrix, Quaterion)
Quaterion op Distance(Quaterion, Quaterion)
/ unary ops
Quaterion op -(Quaterion)
Quaterion op sqrt(Quaterion)
Quaterion op normalize(Quaterion)
)
- 45 -
/ I/O port abstract superclass
( class
ID=IO
super=Object
( property
ID=readable
Type=Boolean
)
( property
ID=writeable
Type=Boolean
)
( property
ID=evaluate
type=Boolean
)
( Self op Self )
/ notification op to alert handler
( Boolean op New (Self))
)
/ MIDI I/O port class- superclass only? It seems to be useless by itself.
( class
ID=MidiPort
Super=IO
readable=True
writeable=True
)
/ Speaker I/O port class- superclass only? It seems to be useless by itself.
/ Not a loudspeaker, but a separate abstract noise-making entity.
( class
ID=SoundChannel
Super=IO
( property
ID=Position
Type=Point
)
( property
ID=Volume
Type=Number
)
)
/ Absolute one-directional input from 0 to 1
- 46 -
/ A Slider itself is a number, but it inherits the New
/ An analog joystick is two Sliders.
( class
ID=Slider
Super=IO
Super=Number
readable=True
writeable=False
(Number op Value(Self))
)
/ Relative one-directional input from 0 to 1
/ A Delta itself is a number, but it inherits the New
/ A mouse is two Deltas.
/ An Nintendo joystick is two Deltas, using relative motion and an
/ auto-acceleration input.
( class
ID=Delta
Super=IO
Super=Number
readable=True
writeable=False
(Number op Value(Self))
)
/ Switch
( class
ID=Switch
Super=IO
Super=Boolean
readable=True
writeable=False
(Boolean op Value(Self))
)
/ sound bite
( class
ID=SoundSample
super=Linear
super=SoundChannel
(op Play(SoundSample, Speaker))
(op Record(Speaker, SoundSample))
/ the use of the when-executed property to start and stop is a hack
)
- 47 -
/ sound synthesizer patch: hardware-dependent.
/ With Csound, an LPC parameter set.
( class
ID=SoundPatch
super=Linear
super=SoundChannel
(op Play(SoundPatch, Speaker))
/ the use of the when-executed property to start and stop is a hack
)
/ MIDI sound file
( class
ID=MidiSeq
super=Dataset
super=MidiPort
/ one dimension, indexable
(op Play(MidiSeq, MidiPort)) / play Midi sequence out
(op Record(MidiPort, MidiSeq)) / real-time capture? good trick!
/ the use of the when-executed property to start and stop is a hack
)
/ Network port abstract superclass
( class
ID=Network
super=Object
/ This port has a unique channel number within the deck
( property
ID=Channel
type=Number
writeable=False
)
/ This protocol has guaranteed delivery
( property
ID=Reliable
type=Boolean
writeable=False
)
/ This protocol has ordered delivery
( property
ID=Ordered
type=Boolean
writeable=False
)
/ constructor & destructor ops
/ A network port's children are the most recent
/ incoming and outgoing trees which went across the net.
/ Void nodes are used as compartmental "cut-points".
- 48 -
( Self op Self (Void outgoing, incoming))
( Self op In (Self))
( Self op Out (Self))
/ send & receive programs
/ usually, the port is accessed via a Refer node
( Void op Send (Self, Void))
( Void op Receive (Self, Void))
/ notification op to alert handler
( Boolean op New (Self))
)
/ Virtual circuit port abstract superclass
( class
ID=VirtualCircuit
super=Network
/ Inherit channel number
/ This port initiates or accepts connections
( property
ID=Initiate
type=Boolean
writeable=False
)
)
/ Datagram port abstract superclass
( class
ID=Datagram
super=Network
)
/ TCP/IP UDP network port
/ 5D program directly in UDP packet, no intermediate protocol layer
/ A channel number is a UDP port number. It is assigned by the deck
/ when the program is digested. The deck must upload the tree with
/ the network object to an application to inform the application what
/ the subsidiary port number is.
( class
ID=UDP
super=Datagram
/ other host IP & Port number
( property
ID=OtherIP
type=Unknown / magic secret data type
/ value will be a text string, with format for RFC xxx
/ proto-assigner
)
)
- 49 -
/ TCP/IP TCP network port
/ 1 port # per channel
( class
ID=TCP
super=Network
/ other host IP & Port number
( property
ID=OtherIP
type=Unknown / magic secret data type
/ value will be a text string, with format for RFC xxx
/ proto-assigner
)
)