Videoscape GEO file format

Written by Max Gilead, based on Blender manual
Thanks to Ton Roosendaal who wrote the paper docs
Additions by Paul Bourke


Videoscape file format was originally used by an early Amiga animation package called "Videoscape 3D". It is now used by Blender for importing/exporting meshes in text format. All compatibility is tested with Blender. In fact, all info in this doc is taken from Blender manual.

GEO files are ascii printable text only files, the first line of which contains a single word that determines the type of file format that follows. The coordinate system is left handed, traditionally with the y axis as the default up or sky vector. Where appropriate, polygon vertices are ordered in a clockwise direction. Blank lines may be added to make file more readable but no comments lines are allowable.

Files may be in four major flavors:
  1. Mesh with coloured faces
  2. Mesh with coloured vertices
  3. Lamp
  4. Gouraud curves or NURBS surfaces

Each flavor is identified by magic number (first line in file). They are each listed in the following sections.

1. Mesh with coloured faces

3DG1                     - magic number
total_number_of_vertices - total number of vertices
x1 y1 z1
x2 y2 z2
...                      - vertex coordinates
number_of_vertices_in_face vertex_index_1 vertex_index_2 vertex_index_3 ... vertex_index_n color

Vertex index is counted starting from 0. Color is written in BGR format (reverse order to RGB). Eg. red color in BGR is 0x0000FF.

Example file (simple gray plane) and screenshot:

3DG1
4
1.000000 1.000000 0.000000
1.000000 -1.000000 0.000000
-1.000000 -1.000000 0.000000
-1.000000 1.000000 0.000000
4 0 3 2 1 0xcccccc

2. Mesh with coloured vertices

Warning! This file flavor doesn't seem to be recognized or saved by Blender and is here for completeness only.

GOUR                     - magic number
total_number_of_vertices - total number of vertices
x1 y1 z1 color
x2 y2 z2 color
...                      - vertex coordinates with color in BGR format
number_of_vertices_in_face vertex_index_1 vertex_index_2 vertex_index_3 ... vertex_index_n
Example file:

GOUR
4
1.000000 1.000000 0.000000 0x0000ff
1.000000 -1.000000 0.000000 0x00ff00
-1.000000 -1.000000 0.000000 0xff0000
-1.000000 1.000000 0.000000 0x00ffff
4 0 3 2 1
3. Lamp

3DG2 - magic number
total_number_of_lamps - total number of lamps in file
for each lamp:
type               - lamp type (0 - point lamp, 1 - spot lamp, 2 - sun)
spotsize spotblend - size of spot beam in degrees and intensity (length) of beam
R G B E            - color (RGB) and (E)nergy of lamp
x y z              - lamp coordinates
vecx vecy vecz     - lamp direction vector
Example file (two lamps - one normal and one spot) and screenshot.

3DG2
2
0
0.0 0.0
1.0 1.0 1.0 1.0
-4.0 4.0 2.0
0.0 0.0 0.0
1
45.0 0.5
0.5 1.0 1.0 1.0
2.0 3.0 4.0
0.4 0.3 0.6

4. Gouraud curves or NURBS surfaces

This kind of file can describe both curves and surfaces.

3DG3            - magic number
type            - object type (5 is surface, other is bezier curve)
number_of_items - number of curves or surfaces
ext1 ext2       - extrude numbers also indicated for surfaces. These are NOT floats, they're integers divided by 500.
Matrix [4][4]   - right-handed object matrix. Used to determine position, rotation and size

for each item:
type            - type (0 - poly, 1 - bezier, 4 - nurbs. Add 8 to this if curve is 2D.)
pntsu pntsv     - numbers of vertices in u and v directions
resolu resolv   - resulotion of u and v direction
orderu orderv   - order in the u and v direction
flagu flagv     - the 'cyclic' flag in u and v direction. If equal to 1 it is cyclic.

for bezier repeat this block pntsu times:
x y z
x y z
x y z           - three handle vertices
h1 h2           - handle types (0 - free, 1 - auto, 2 - vector, 3 - aligned)

for other curve type or for surface repeat this block pntsu*pntsv times:
x y z w         - coordinates and weight of vertices

for other curve types add this block:

u1 u2 u3...     - knots in u direction

for surfaces add this block:
v1 v2 v3...     - knots in v direction

The number of knots is a very precise value. If the value is not correct, file will not be properly loaded. This is the calculation for the total number of knots = order + pnts + (order-1)*(flag&1)

If necessary, a series of increasing numbers can be filled in here.

Example bezier curve:

3DG3
0
1
0 0
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
9
2 0
32 0
0 0
0 0
-3.0 -1.0 0.0
-2.0 0.0 0.0
-1.0 1.0 0.0
3 3
1.0 1.0 0.0
2.0 0.0 0.0
3.0 -1.0 0.0
3 3

Example of NURBS surface:

3DG3
5
1
0 0
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
4
4 2
32 32
4 2
0 0
-2.0 0.0 0.0 1.0
-1.0 1.0 0.0 1.0
2.0 0.0 0.0 1.0
3.0 -1.0 0.0 1.0
-2.0 0.0 1.0 1.0
-1.0 1.0 1.0 1.0
2.0 0.0  1.0 1.0
3.0 -1.0 1.0 1.0
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0
1.0 2.0 3.0 4.0