A Virtual Computer Science Community, Meeting 3, 2/16/04, 3pm

Audio Status - Andrei Buin and Ziad Al-Sharif

Andrei and Ziad gave informal demonstrations of PortAudio and OpenAL.

Network Status - Mike Kemp

Mike and Laurel have made progress on a simple n-person chat program.

Avatars - Jose Zuniga, Brandon Cook

Jose demonstrated a face; Brandon showed a spherical smiley in the PLEASE demo, with a simultaneous 2D "map"-like, but textual view.

PLEASE Lab Prototypes

Ray and Korrey were sick and/or absent, but they have made progress on a PLEASE Lab model, with about the same functionality as "Tha Crib".

Some preliminary work on collision detection has been done; it will be reported/discussed at a later time.

Level Editors: Wynn and Dr. J

Wynn has looked at level editors for various game engines (e.g. Unreal), but I commissioned him to look for editors whose file formats were human readable and/or easy to parse. I specifically suggested VRML, and Wynn went off and found X3D. Here is his first report:

VRML, X3D and other off-the-shelf options, Wynn Winkler

  1. Links:
  2. Comments on VRML
  3. What Wynn has Done or Tried so far:
  4. Pros/Cons of VRML and X3D:
    Pros:
    1. open standards
    2. fair amount of VRML stuff out there
    Cons:
    1. need specialized software
    2. may have difficult install
    3. may be tied to a web browser
    4. status/activity around X3D unclear

Building our own Ruminator, Dr. J

See the graphics subteam page for a discussion.

Announcements

  • NSF funding. Instead of 5-10% chances, it now appears with 98% probability that starting next fall, we will have $840,000 over three years to put our ideas to the test, deploying our environment at a consortium of New Mexico two year schools, including Northern NMCC, Crownpoint Institute of Technology, NMSU-Grants, and NMSU-Alamogordo.































    Ruminator.icn sample code

    procedure main(av)
       &window := open("Ruminator","g",if *av>0 then "image="||av[1] else "fg=red")
       WAttrib("fg=red","drawop=reverse")
       repeat {
          e := Event()
          case e of {
    	 "q": { exit(0) }
    	 &lpress: {  x1 := &x; y1 := &y; x2 := y2 := &null  }
    	 "t": {
    	    if \x1 & \y1 & \x2 & \y2 then { } # noop: extract doorplate texture
    	    }
    	 &lrelease: {
    	    DrawLine(x1,y1,x1,\y2)   # erase
    	    DrawLine(x1,y1,\x2,y1)   # erase
    	    DrawLine(x1,\y2,\x2,\y2) # erase
    	    DrawLine(\x2,y1,\x2,\y2) # erase
    	    doors := []
    	    y := y1; x := x1
    	    cornerpixel := door1 := door2 := &null
    	    every p := Pixel(x1,y1,x2-x1,1) do {
    	       /cornerpixel := p
    	       if bilevel(p) ~=== bilevel(cornerpixel) then {
    		  if not (/door1 := x) then door2 := x
    	          }
    	       else if \door2 then {
    		     put(doors, [\door1,y,\door2,y])
    		     door1 := door2 := &null
    	          }
    	       x +:= 1
    	       }
    	    put(doors, [\door1,y,\door2,y])
    
    	    y := y2; x := x1
    	    cornerpixel := door1 := door2 := &null
    	    every p := Pixel(x1,y2,x2-x1,1) do {
    	       if /cornerpixel := p then write("corner ", image(p))
    	       if bilevel(p) ~=== bilevel(cornerpixel) then {
    		  if not (/door1 := x) then door2 := x
    	          }
    	       x +:= 1
    	       }
    	    put(doors, [\door1,y,\door2,y])
    
    	    y := y1; x := x1
    	    cornerpixel := door1 := door2 := &null
    	    every p := Pixel(x1,y1,1,y2-y1) do {
    	       if /cornerpixel := p then write("corner ", image(p))
    	       if bilevel(p) ~=== bilevel(cornerpixel) then {
    		  if not (/door1 := y) then door2 := y
    	          }
    	       y +:= 1
    	       }
    	    put(doors, [x,\door1,x,\door2])
    
    	    x := x2; y := y1
    	    cornerpixel := door1 := door2 := &null
    	    every p := Pixel(x,y,1,y2-y1) do {
    	       if /cornerpixel := p then write("corner ", image(p))
    	       if bilevel(p) ~=== bilevel(cornerpixel) then {
    		  if not (/door1 := y) then door2 := y
    	          }
    	       y +:= 1
    	       }
    	    put(doors, [x,\door1,x,\door2])
    	    write(*doors , " doors found")
    	    }
    	&ldrag: {
    	   DrawLine(x1,y1,x1,\y2) # erase
    	   DrawLine(x1,y1,\x2,y1) # erase
    	   DrawLine(x1,\y2,\x2,\y2) # erase
    	   DrawLine(\x2,y1,\x2,\y2) # erase
    	   x2 := &x; y2 := &y
    	   DrawLine(x1,y1,x1,\y2) # erase
    	   DrawLine(x1,y1,\x2,y1) # erase
    	   DrawLine(x1,\y2,\x2,\y2) # erase
    	   DrawLine(\x2,y1,\x2,\y2) # erase
               }
    	default : { }
    	}
        }
    end
    procedure bilevel(c)
        c ? {
           r := tab(find(",")); =","; g := tab(find(",")); =","; b := tab(0)
           }
        if r < 32767 then r := 0 else r := 65535
        if g < 32767 then g := 0 else g := 65535
        if b < 32767 then b := 0 else b := 65535
        return r || "," || g || "," || b
    end