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
Pros:
Cons:
Building our own Ruminator, Dr. J
See the graphics subteam page for a discussion.
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