home *** CD-ROM | disk | FTP | other *** search
/ Avalon - 3D Objects & Resources / Avalon.iso / frmtspcs / trbslvrb.frm < prev   
Text File  |  1995-01-01  |  23KB  |  557 lines

  1.  
  2. From: her@compel.UUCP (Helge Egelund Rasmussen)
  3. Newsgroups: comp.sys.amiga.tech
  4. Subject: Description of Turbo Silver Object format
  5.  
  6.  
  7. Here is the description of the Turbo Silver TDDD chunk.
  8. If you order the 'File formats diskette' (value $5) from Impulse Inc.
  9. you also get the source for a program to read/write an object file. 
  10. As I'm not sure that the program is Public Domain, I'll not post the program.
  11.  
  12. ======================================================================
  13.  
  14.                           FORM TDDD
  15.                           ---------
  16.  
  17.     FORM TDDD is used by Impulse's Turbo Silver 3.0 for 3D rendering
  18.     data.  TDDD stands for "3D data description".  The files contain
  19.     object and (optionally) observer data.
  20.  
  21.     Currently, in "standard IFF" terms, a FORM TDDD has only two chunk
  22.     types:  an INFO chunk describing observer data;  and an OBJ chunk
  23.     describing an object heirarchy.  The INFO chunk appears in "cell"
  24.     files, and the OBJ chunk appears in "cell" files and "object" files.
  25.     The FORM has an (optional) INFO chunk followed by some number of
  26.     OBJ chunks.  (Note:  OBJ is followed by a space -- ckID = "OBJ ")
  27.  
  28.     The INFO and OBJ chunks, in turn, are made up of smaller chunks with
  29.     the standard IFF structure:  <ID> <data-size> <data>.
  30.  
  31.     The INFO "sub-chunks" are relatively straightforward to interpret.
  32.  
  33.     The OBJ "sub-chunks" support object heirarchies, and are slightly
  34.     more difficult to interpret.  Currently, there are 3 types of OBJ
  35.     sub-chunks:  an EXTR chunk, describing an "external" object in a
  36.     seperate file; a DESC chunk, describing one node of a heirarchy;
  37.     and a TOBJ chunk marking the end of a heirarchy chain.  For each
  38.     DESC chunk, there must be a corresponding TOBJ chunk.  And an
  39.     EXTR chunk is equivalent to a DESC/TOBJ pair.
  40.  
  41.     In Turbo Silver, the structure of the object heirarchy is as
  42.     follows.  There is a head object, and its (sexist) brothers.
  43.     Each brother may have child objects.  The children may have
  44.     grandchildren, and so on. The brother nodes are kept in a
  45.     doubly linked list, and each node has a (possibly NULL)
  46.     pointer to a doubly linked "child" list. The children point
  47.     to the "grandchildren" lists, and so on.  (In addition, each
  48.     node has a "back" pointer to its parent).
  49.  
  50.     Each of the "head" brothers is written in a seperate OBJ chunk,
  51.     along with all its descendants.  The descendant heirarchy is
  52.     supported as follows:
  53.  
  54.         for each node of a doubly linked list,
  55.  
  56.         1)  A DESC chunk is written, describing its object.
  57.         2)  If it has children, steps 1) to 3) are performed
  58.             for each child.
  59.         3)  A TOBJ chunk is written, marking the end of the children.
  60.  
  61.     For "external" objects, steps 1) to 3) are not performed, but
  62.     an EXTR chunk is written instead.  (This means that an external
  63.     object cannot have children unless they are stored in the same
  64.     "external" file).
  65.  
  66.     The TOBJ sub-chunks have zero size -- and no data.  The DESC
  67.     and EXTR sub-chunks are made up of "sub-sub-chunks", again,
  68.     with the standard IFF structure:  <ID> <data-size> <data>.
  69.  
  70.     Reader software WILL FOLLOW the standard IFF procedure of
  71.     skipping over any un-recognized chunks -- and "sub-chunks"
  72.     or "sub-sub-chunks". The <data-size> field indicates how many
  73.     bytes to skip.  In addition it WILL OBSERVE the IFF rule that
  74.     an odd <data-size> may appear, in which case the corredponding
  75.     <data> field will be padded at the end with one extra byte to
  76.     give it an even size.
  77.  
  78.  
  79.     Now, on with the details.
  80.  
  81.     First, there are several numerical fields appearing in the data,
  82.     describing object positions, rotation angles, scaling factors, etc.
  83.     They are stored as "32-bit fractional" numbers, such that the true
  84.     number is the 32-bit number divided by 65536.  So as an example,
  85.     the number 3.14159 is stored as (hexadecimal) $0003243F.  This
  86.     allows the data to be independant of any particular floating point
  87.     format. And it (actually) is the internal format used in the
  88.     "integer" version of Turbo Silver.  Numbers stored in this format
  89.     are called as "FRACT"s below.
  90.  
  91.     Second, there are several color (or RGB) fields in the data.
  92.     They are always stored as three UBYTEs representing the red,
  93.     green and blue components of the color.  Red is always first,
  94.     followed by green, and then blue.  For some of the data chunks,
  95.     Turbo Silver reads the color field into the 24 LSB's of a
  96.     LONGword.  In such cases, the 3 RGB bytes are preceded by a
  97.     zero byte in the file.
  98.  
  99.  
  100.     The following "typedef"s are used below:
  101.  
  102.     typedef LONG    FRACT;          /* 4 bytes */
  103.     typedef UBYTE   COLOR[3];       /* 3 bytes */
  104.  
  105.     typedef struct  vectors {
  106.         FRACT   X;                  /* 4 bytes */
  107.         FRACT   Y;                  /* 4 bytes */
  108.         FRACT   Z;                  /* 4 bytes */
  109.     } VECTOR;                   /* 12 bytes total */
  110.  
  111.     typedef struct  matrices {
  112.         VECTOR  I;                  /* 12 bytes */
  113.         VECTOR  J;                  /* 12 bytes */
  114.         VECTOR  K;                  /* 12 bytes */
  115.     } MATRIX;                   /* 36 bytes total */
  116.  
  117.  
  118.     The following structure is used in generating animated cells
  119.     from a single cell.  It can be attached to an object or to the
  120.     camera.  It is also used for Turbo Silver's "extrude along a
  121.     path" feature.
  122.  
  123.     typedef struct  story   {
  124.         UBYTE   Path[18];           /*  18 bytes        */
  125.         VECTOR  Translate;          /*  12 bytes        */
  126.         VECTOR  Rotate;             /*  12 bytes        */
  127.         VECTOR  Scale;              /*  12 bytes        */
  128.         UWORD   info;               /*   2 bytes        */
  129.     } STORY;                    /*  56 bytes total  */
  130.  
  131.     The Path[] name refers to a named object in the cell data.
  132.     The path object should be a sequence of points connected
  133.     with edges.  The object moves from the first point of the
  134.     first edge, to the last point of the last edge.  The edge
  135.     ordering is important.  The path is interpolated so that
  136.     the object always moves an equal distance in each frame of
  137.     the animation.  If there is no path the Path[] field should
  138.     be set to zeros.
  139.     The Translate vector is not currently used.
  140.     The Rotate "vector" specifies rotation angles about the
  141.     X, Y, and Z axes.
  142.     The Scale vector specfies X,Y, and Z scale factors.
  143.     The "info" word is a bunch of bit flags:
  144.  
  145.         ABS_TRA     0x0001      - translate in world coorinates (not used)
  146.         ABS_ROT     0x0002      - rotation in world coorinates
  147.         ABS_SCL     0x0004      - scaling in world coorinates
  148.         LOC_TRA     0x0010      - translate in local coorinates (not used)
  149.         LOC_ROT     0x0020      - rotation in local coorinates
  150.         LOC_SCL     0x0040      - scaling in local coorinates
  151.         X_ALIGN     0x0100      - (not used)
  152.         Y_ALIGN     0x0200      - align Y axis to path's direction
  153.         Z_ALIGN     0x0400      - (not used)
  154.         FOLLOW_ME   0x1000      - children follow parent on path
  155.  
  156.  
  157.     INFO sub-chunks
  158.     ---------------
  159.  
  160.     BRSH - size 82
  161.  
  162.         WORD    Number;                 ; Brush number (between 0 and 7)
  163.         CHAR    Filename[80];           ; IFF ILBM filename
  164.  
  165.         There may be more than one of these.
  166.  
  167.     STNC - size 82
  168.  
  169.         Same format as BRSH chunk.
  170.  
  171.     TXTR - size 82
  172.  
  173.         Same format as BRSH chunk.  The Filename field is the name of
  174.         a code module that can be loaded with LoadSeg().
  175.  
  176.     OBSV - size 28
  177.  
  178.         VECTOR  Camera;                 ; Camera position
  179.         VECTOR  Rotate;                 ; Camera rotation angles
  180.         FRACT   Focal;                  ; Camera focal length
  181.  
  182.         This tells where the camera is, how it is aimed, and its
  183.         focal length.  The rotation angles are in degrees, and specify
  184.         rotations around the X, Y, and Z axes.  The camera looks down
  185.         its own Y axis, with the top of the picture in the direction of
  186.         the Z axis.  If the rotation angles are all zero, its axes
  187.         are aligned with the world coordinate axes.  The rotations are
  188.         performed in the order ZXY about the camera axes.  A positive
  189.         angle rotates Y toward Z, Z toward X, and X toward Y for
  190.         rotations about the X, Y, and Z axes respectively.  To
  191.         understand the focal length, imagine a 320 x 200 pixel
  192.         rectangle perpendicular to, and centered on the camera's
  193.         Y axis.  Any objects in the infinite rectangular cone defined
  194.         by the camera position and the 4 corners of the rectangle will
  195.         appear in the picture.
  196.  
  197.     OTRK - size 18
  198.  
  199.         BYTE    Trackname[18];
  200.  
  201.         This chunk specifies the name of an object that the camera
  202.         is "tracked" to.  If the name is NULL, the camera doesn't
  203.         track.  Otherwise, if the object is moved inside Turbo Silver,
  204.         the camera will follow it.
  205.  
  206.     OSTR - size 56
  207.  
  208.         STORY   CStory;         ; a STORY structure for the camera
  209.  
  210.         The story structure is defined above.
  211.  
  212.     FADE - size 12
  213.  
  214.         FRACT   FadeAt;         ; distance to start fade
  215.         FRACT   FadeBy;         ; distance of total fade
  216.         BYTE    pad;            ; pad byte - must be zero
  217.         COLOR   FadeTo;         ; RGB color to fade to
  218.  
  219.     SKYC - size 8
  220.  
  221.         BYTE    pad;            ; pad byte - must be zero
  222.         COLOR   Horizon;        ; horizon color
  223.         BYTE    pad;            ; pad byte - must be zero
  224.         COLOR   Zenith;         ; zenith color
  225.  
  226.     AMBI - size 4
  227.  
  228.         BYTE    pad;            ; pad byte - must be zero
  229.         COLOR   Ambient;        ; abmient light color
  230.  
  231.     GLB0 - size 8
  232.  
  233.         BYTE    Props[8];       ; an array of 8 "global properties" used
  234.                                 ; by Turbo Silver.
  235.  
  236.         Props[0] - GLB_EDGING       ; edge level (globals requester)
  237.         Props[1] - GLB_PERTURB      ; perturbance (globals requester)
  238.         Props[2] - GLB_SKY_BLEND    ; sky blending factor (0-255)
  239.         Props[3] - GLB_LENS         ; lens type (see below)
  240.         Props[4] - GLB_FADE         ; flag - Sharp/Fuzzy focus (globals)
  241.         Props[5] - GLB_SIZE         ; "apparant size" (see below)
  242.         Props[6] - GLB_RESOLVE      ; resolve depth (globals requester)
  243.         Props[7] - GLB_EXTRA        ; flag - genlock sky on/off
  244.  
  245.         The edging and perturbance values control the heuristics in
  246.         ray tracing.  The sky blending factor is zero for no blending,
  247.         and 255 for full blending.  The lens type is a number from 0
  248.         4, corresponding to the boxes in the "camera" requester, and
  249.         correspond to 0) Manual, 1) Wide angle, 2) Normal, 3) Telephoto,
  250.         and 4) Custom.  It is used in setting the camera's focal length
  251.         if the camera is tracked to an object.  The Sharp/Fuzzy flag
  252.         turns the "fade" feature on and off - non-zero means on.
  253.         The "apparant size" parameter is 100 times the "custom size"
  254.         parameter in the camera requester.  And is used to set the
  255.         focal length for a custom lens.  The "resolve depth" controls
  256.         the number of rays the ray tracer will shoot for a single pixel.
  257.         Each reflective/refractive ray increments the depth counter, and
  258.         the count is never allowed to reach the "resolve depth".  If both
  259.         a reflective and a refractive ray are traced, each ray gets its
  260.         own version of the count - so theoretically, a resolve depth of
  261.         4 could allow much more than 4 rays to be traced.  The "genlock
  262.         sky" flag controls whether the sky will be colored, or set to
  263.         the genlock color (color 0 - black) in the final picture.
  264.  
  265.  
  266.     All of the INFO sub-chunks are optional, as is the INFO chunk.
  267.     Default values are supplied if the chunks are not present.  The
  268.     defaults are:  no brushes, stencils, or textures defined; no story
  269.     for the camera; horizon and zenith and ambient light colors set
  270.     to black; fade color set to (80,80,80);  un-rotated, un-tracked
  271.     camera at (-100, -100, 100); and global properties array set to
  272.     [30, 0, 0, 0, 0, 100, 8, 0].
  273.  
  274.  
  275.     DESC sub-sub-chunks
  276.     -------------------
  277.  
  278.     NAME - size 18
  279.  
  280.         BYTE    Name[18];       ; a name for the object.
  281.  
  282.         Used for camera tracking, specifying story paths, etc.
  283.  
  284.     SHAP - size 4
  285.  
  286.         WORD    Shape;          ; number indicating object type
  287.         WORD    Lamp;           ; number indicating lamp type
  288.  
  289.         Lamp numbers are:
  290.  
  291.             0 - not a lamp
  292.             1 - like sunlight
  293.             2 - like a lamp - intensity falls off with distance.
  294.  
  295.         Shape numbers are:
  296.  
  297.             0 - Sphere
  298.             1 - Stencil
  299.             2 - Axis            ; custom objects with points/triangles
  300.             3 - Facets          ; illegal - for internal use only
  301.             4 - Surface
  302.             5 - Ground
  303.  
  304.         Spheres have thier radius set by the X size parameter.
  305.         Stencils and surfaces are plane-parallelograms, with one
  306.         point at the object's position vector; one side lying along
  307.         the object's X axis with a length set by the X size; and
  308.         another side starting from the position vector and going
  309.         "Y size" units in the Y direction and "Z size" units in
  310.         the X direction.  A ground object is an infinte plane
  311.         perpendicular to the world Z axis.  Its Z coordinate sets
  312.         its height, and the X and Y coordinates are only relevant
  313.         to the position of the "hot point" used in selecting the
  314.         object in the editor.  Custom objects have points, edges
  315.         and triangles associated with them.  The size fields are
  316.         relevant only for drawing the object axes in the editor.
  317.         Shape number 3 is used internally for triangles of custom
  318.         objects, and should never appear in a data file.
  319.  
  320.     POSI - size 12
  321.  
  322.         VECTOR  Position;       ; the object's position.
  323.  
  324.         Legal coordinates are in the range -32768 to 32767 and 65535/65536.
  325.         Currently, the ray-tracer only sees objects in the -1024 to 1024
  326.         range.  Light sources, and the camera may be placed outside that
  327.         range, however.
  328.  
  329.     AXIS - size 36
  330.  
  331.         VECTOR  XAxis;
  332.         VECTOR  YAxis;
  333.         VECTOR  ZAxis;
  334.  
  335.         These are direction vectors for the object coordinate system.
  336.         They must be "orthogonal unit vectors" - i.e. the sum of the
  337.         squares of the vevtor components must equal one (or close to it),
  338.         and the vectors must be perpendicular.
  339.  
  340.     SIZE - size 12
  341.  
  342.         VECTOR  Size;
  343.  
  344.         See SHAP chunk above.  The sizes are used in a variety of ways
  345.         depending on the object shape.  For custom objects, they are
  346.         the lengths of the coordinate axes drawn in the editor.  If the
  347.         object has its "Quickdraw" flag set, the axes lengths are also
  348.         used to set the size of a rectangular solid that is drawn rather
  349.         than drawing all the points and edges.
  350.  
  351.     PNTS - size 2 + 12 * point count
  352.  
  353.         UWORD   PCount;         ; point count
  354.         VECTOR  Points[];       ; points
  355.  
  356.         This chunk has all the points for custom objects.  The are
  357.         refered to by thier position in the array.
  358.  
  359.     EDGE - size 4 + 4 * edge cout
  360.  
  361.         UWORD   ECount;         ; edge count
  362.         UWORD   Edges[][2];     ; edges
  363.  
  364.         This chunk contins the edge list for custom objects.
  365.         The Edges[][2] array is pairs of point numbers that
  366.         are connected by the edges.  Edges are refered to by thier
  367.         position in the Edges[] array.
  368.  
  369.     FACE - size 2 + 6 * face count
  370.  
  371.         UWORD   TCount;         ; face count
  372.         UWORD   Connects[][3];  ; faces
  373.  
  374.         This chunk contains the triangle (face) list for custom objects.
  375.         The Connects[][3] array is triples of edge numbers that are
  376.         connected by triangles.
  377.  
  378.     COLR - size 4
  379.     REFL - size 4
  380.     TRAN - size 4
  381.  
  382.         BYTE    pad;        ; pad byte - must be zero
  383.         COLOR   col;        ; RGB color
  384.  
  385.         These are the main object RGB color, and reflection and
  386.         transmission coefficients.
  387.  
  388.     CLST - size 2 + 3 * count
  389.     RLST - size 2 + 3 * count
  390.     TLST - size 2 + 3 * count
  391.  
  392.         UWORD   count;      ; count of colors
  393.         COLOR   colors[];   ; colors
  394.  
  395.         These are the main object color, and reflection and
  396.         transmission coefficients for each face in custom objects.
  397.         The count should match the face count in the FACE chunk.
  398.         The ordering corresponds to the face order.
  399.  
  400.     TPAR - size 64
  401.  
  402.         FRACT   Params[16];     ; texture parameters
  403.  
  404.         This is the list of parameters for texture modules when
  405.         texture mapping is used.
  406.  
  407.     SURF - size 5
  408.  
  409.         BYTE    SProps[5];      ; object properties
  410.  
  411.         This chunk contains object (surface) properties used
  412.         by Turbo Silver.
  413.  
  414.         SProps[0] - PRP_SURFACE     ; surface type
  415.                                     ;   0 - normal
  416.                                     ;   4 - genlock
  417.                                     ;   5 - IFF brush
  418.         SProps[1] - PRP_BRUSH       ; brush number (if IFF mapped)
  419.         SProps[2] - PRP_WRAP            ; IFF brush wrapping type
  420.                                     ;   0 - no wrapping
  421.                                     ;   1 - wrap X
  422.                                     ;   2 - wrap Z
  423.                                     ;   3 - wrap X and Z
  424.         SProps[3] - PRP_STENCIL     ; stencil number for stencil objects
  425.         SProps[4] - PRP_TEXTURE     ; texture number if texture mapped
  426.  
  427.     MTTR - size 2
  428.  
  429.         UBYTE   Type;               ; refraction type (0-4)
  430.         UBYTE   Index;              ; custom index of refraction
  431.  
  432.         This chunk contains refraction data for transparent or
  433.         glossy objects.  If the refraction type is 4, the object
  434.         has a "custom" refractive index stored in the Index field.
  435.         The Index field is 100 * (true index of refraction - 1.00)
  436.         -- so it must be in the range of 1.00 to 3.55.  The
  437.         refraction types is 0-3 specify 0) Air - 1.00, 1) Water - 1.33,
  438.         2) Glass - 1.67 or 3) Crystal 2.00.
  439.  
  440.     SPEC - size 2
  441.  
  442.         UBYTE   Specularity;            ; range of 0-255
  443.         UBYTE   Hardness;               ; specular exponent (0-31)
  444.  
  445.         This chunk contains specular information.  The Specularity
  446.         field is the amount of specular reflection -- 0 is none,
  447.         255 is fully specular.  The "specular exponent" controls
  448.         the "tightness" of the specular spots.  A value of zero
  449.         gives broad specular spots and a value of 31 gives smaller
  450.         spots.
  451.  
  452.     PRP0 - size 6
  453.  
  454.         UBYTE   Props[6];           ; more object properties
  455.  
  456.         This chunk contains object properties that programs other
  457.         than Turbo Silver might support.
  458.  
  459.         Props[0] - PRP_BLEND        ; blending factor (0-255)
  460.         Props[1] - PRP_SMOOTH       ; roughness factor
  461.         Props[2] - PRP_SHADE        ; shading on/off flag
  462.         Props[3] - PRP_PHONG        ; phong shading on/off flag
  463.         Props[4] - PRP_GLOSSY       ; glossy on/off flag
  464.         Props[5] - PRP_QUICK        ; Quickdraw on/off flag
  465.  
  466.         The blending factor controls the amount of dithering used
  467.         on the object - 255 is fully dithered.  
  468.         The roughness factor controls how rough the object should
  469.         appear - 0 is smooth, 255 is max roughness.
  470.         The shading flag is interpreted differently depending on
  471.         whether the object is a light source or not.  For light
  472.         sources, it sets the light to cast shadows or not.  For
  473.         normal objects, if the flag is set, the object is always
  474.         considered as fully lit - i.e. it's color is read directly
  475.         from the object (or IFF brush), and is not affected by light
  476.         sources.
  477.         The phong shading is on by default - a non-zero value turns
  478.         it off.
  479.         The glossy flag sets the object to be glossy or not.  If
  480.         the object is glossy, the "transmit" colors and the index
  481.         of refraction control the amount of "sheen".  The glossy
  482.         feature is meant to simulate something like a wax coating
  483.         on the object with the specified index of refraction. The
  484.         trasmission coefficients control how much light from the
  485.         object makes it through the wax coating.
  486.         The Quickdraw flag, if set, tells the editor not to draw
  487.         all the points and edges for the object, but to draw a
  488.         rectanglular solid centered at the object position, and
  489.         with sizes detemined by the axis lengths.
  490.  
  491.     INTS - size 4
  492.  
  493.         FRACT   Intensity;          ; light intensity
  494.  
  495.         This is the intensity field for light source objects.
  496.         an intensity of 255 for a sun-like light fully lights
  497.         object surfaces which are perpendicular to the direction
  498.         to the light source.  For lamp-like light sources, the
  499.         necessary intensity will depend on the distance to the light.
  500.  
  501.     STRY - size 56
  502.  
  503.         STORY   story;          ; a story structure for the object.
  504.  
  505.         The story structure is described above.
  506.  
  507.  
  508.     Again, most of these fields are optional, and defaults are supplied.
  509.     However, if there is a FACE chunk, there must also be a CLST chunk,
  510.     an RLST chunk and a TLST chunk -- all with matching "count" fields.
  511.     The SHAP chunk is not optional. 
  512.  
  513.     Defaults are:  Colors set to (240,240,240); reflection and
  514.     transmission coefficients set to zero; illegal shape; no story or
  515.     special surface types; position at (0,0,0); axes aligned to the
  516.     world axes; size fields all 32.0; intensity at 300; no name;
  517.     no points/edges or faces; texture parameters set to zero; refraction
  518.     type 0 with index 1.00; specular, hardness and roughness set to zero;
  519.     blending at 255; glossy off; phong shading on; not a light source;
  520.     not brightly lit;
  521.  
  522.  
  523.  
  524.     EXTR sub-sub-chunks
  525.     -------------------
  526.  
  527.     MTRX - size 60
  528.  
  529.         VECTOR  Translate;          ; translation vector
  530.         VECTOR  Scale;              ; X,Y and Z scaling factors
  531.         MATRIX  Rotate;             ; rotation matrix
  532.  
  533.         The translation vector is i world coordinates.
  534.         The scaling factors are with respect to local axes.
  535.         The rotation matrix is with respect to the world axes,
  536.         and it should be a "unit matrix".
  537.         The rotation is such that a rotated axis's X,Y, and Z
  538.         components are the dot products of the MATRIX's I,J,
  539.         and K vectors with the un-rotated axis vector.
  540.  
  541.     LOAD - size 80
  542.  
  543.         BYTE    Filename[80];       ; the name of the external file
  544.  
  545.         This chunk contains the name of an external object file.
  546.         The external file should be a FORM TDDD file.  It may contain
  547.         an any number of objects possibly grouped into heirarchy(ies).
  548.  
  549.     Both of these chunks are required.
  550.  
  551. -----
  552. Helge E. Rasmussen  .  PHONE + 45 31 37 11 00  .  E-mail:  her@compel.dk
  553. Compel A/S          .  FAX   + 45 31 37 06 44  .  
  554. Copenhagen, Denmark
  555.  
  556.  
  557.