Difference between revisions of "RpGeometry"

From GTAMods Wiki
Jump to navigation Jump to search
m (Prelightning/Vertex colors)
(More compact and more correct description, also removed references to D3D specifics)
Line 1: Line 1:
 
{{RW Section|Geometry|0x000F}}
 
{{RW Section|Geometry|0x000F}}
  
'''Geometry''' is a container section used in [[model file|DFF files]] as child of a [[Geometry List (RW Section)|Geometry List]] section. The section itself does not store any data at all. All additional information get stored inside a [[Struct (RW Section)|struct section]] which directly follows this one as a child. ''Geometry'' is one of the most important sections inside a <code>.dff</code> model file. It stores geometry information for models (like the mesh and the texture maps).
+
'''Geometry''' is a container chunk used in [[model file|DFF files]] as child of a [[Geometry List (RW Section)|Geometry List]] section. The chunk itself does not store any data at all. All additional information get stored inside a [[Struct (RW Section)|Struct]] which directly follows this one as a child. ''Geometry'' is one of the most important chunks inside a <code>.dff</code> model file. It stores geometry information for models (like the mesh and the texture maps).
  
 
== Structure ==
 
== Structure ==
  
The structure differs for most files, but it always gets introduced by the following set of values:
+
The format of the Geometry's Struct chunk is as follows:
  
  2b - WORD  - Flags (See [[Geometry (RW Section)#Flags|below]])
+
  int32        format (see [[Geometry (RW Section)#Format|below]])
  1b - BYTE  - Number of UV coordinates (up to 8 sets of UVs, GTA default is 1, 2 for vehicles with reflection maps)
+
  int32        number of triangles (numTriangles)
  1b - BYTE  - Geometry native flags
+
int32        number of vertices (numVertices)
                // 0x01 rpGEOMETRYNATIVE
+
int32        number of morph targets (numMorphTargets) (morphing is not used in GTA series, so this is always 1)
                // 0x02 rpGEOMETRYNATIVEINSTANCE
+
  #if version < 0x34000
  4b - DWORD - Triangle count
+
  surface properties:
  4b - DWORD - Vertex count
+
    float32  ambient
  4b - DWORD - Number of morphing targets (blend shapes). Morphing is not used in GTA series, so only one "target" is presented.
+
    float32  specular
 +
    float32  diffuse
 +
#endif
 +
 +
#if (format & rpGEOMETRYNATIVE) == 0
 +
    #if (format & rpGEOMETRYPRELIT)
 +
        RwRGBA  prelitcolor[numVertices] (RwRGBA: uint8 r, g, b, a)
 +
    #endif
 +
   
 +
    #if format & (rpGEOMETRYTEXTURED | rpGEOMETRYTEXTURED2)
 +
        #repeat numTexSets (see [[Geometry (RW Section)#Format|below]])
 +
            RwTexCoords    texCoords[numVertices] (RwTexCoords: float32 u, v)
 +
        #endrepeat
 +
    #endif
 +
   
 +
    RpTriangle  triangles[numTriangles] (RpTriangle: uint16 vertex2, vertex1, materialId, vertex3)
 +
  #endif
 +
   
 +
  #repeat numMorphTargets
 +
    RwSphere    boundingSphere[3]    (RwSphere: float32 x, y, z, radius)
 +
    bool32      has vertices
 +
    bool32      has normals
 +
    #if has vertices
 +
        RwV3d  vertices[numVertices] (RwV3d: float x, y, z)
 +
    #endif
 +
    #if has normals
 +
        RwV3d  normals[numVertices]
 +
    #endif
 +
#endrepeat
  
For all [[RenderWare_binary_stream_file#Common_RW_Version_IDs|versions]] below '''3.4.0.3''' also some lightning color values are stored.
+
=== Format ===
  
4b - float  - Ambient
+
The following flags describe the behaviour of the mesh during the rendering progress. Some of the flags indicate the existence of data inside the following file format.
4b - float  - Diffuse
 
4b - float  - Specular
 
 
 
=== Flags ===
 
 
 
The following flags descripe the behaviour of the mesh during the rendering progress. Some of the flags indicate the existance of data inside the following file format.
 
  
 
{|{{Prettytable}} width="100%" class="collapsible"
 
{|{{Prettytable}} width="100%" class="collapsible"
 
!width="120px"|Flag
 
!width="120px"|Flag
!width="25%"|Binary
+
!width="25%"|Name
 
!Description
 
!Description
 
|-
 
|-
|<center>1</center>||<center><code>0000 0000 0000 0001</code></center>||Is [[wikipedia:Triangle_strip|triangle strip]] (if disabled it will be an triangle list)
+
|0x00000001||rpGEOMETRYTRISTRIP||Is [[wikipedia:Triangle_strip|triangle strip]] (if disabled it will be an triangle list)
 +
|-
 +
|0x00000002||rpGEOMETRYPOSITIONS||Vertex translation
 
|-
 
|-
|<center>2</center>||<center><code>0000 0000 0000 0010</code></center>||Vertex translation (<code>D3DFVF_XYZ</code>)
+
|0x00000004||rpGEOMETRYTEXTURED||Texture coordinates
 
|-
 
|-
|<center>4</center>||<center><code>0000 0000 0000 0100</code></center>||Texture coordinates 1 (<code>D3DFVF_TEX1</code>)
+
|0x00000008||rpGEOMETRYPRELIT||Vertex colors
 
|-
 
|-
|<center>8</center>||<center><code>0000 0000 0000 1000</code></center>||Vertex colors (<code>D3DFVF_DIFFUSE</code>)
+
|0x00000010||rpGEOMETRYNORMALS||Store normals
 
|-
 
|-
|<center>16</center>||<center><code>0000 0000 0001 0000</code></center>||Store normals (<code>D3DFVF_NORMAL</code>)
+
|0x00000020||rpGEOMETRYLIGHT||Dynamic vertex lightning ''(?)''
 
|-
 
|-
|<center>32</center>||<center><code>0000 0000 0010 0000</code></center>||Dynamic vertex lightning ''(?)''
+
|0x00000040||rpGEOMETRYMODULATEMATERIALCOLOR||Modulate material color
 
|-
 
|-
|<center>64</center>||<center><code>0000 0000 0100 0000</code></center>||Modulate material color
+
|0x00000080||rpGEOMETRYTEXTURED2||Texture coordinates 2
 
|-
 
|-
|<center>128</center>||<center><code>0000 0000 1000 0000</code></center>||Texture coordinates 2 (<code>D3DFVF_TEX2</code>)
+
|0x01000000||rpGEOMETRYNATIVE||Native Geometry
 
|}
 
|}
  
All of those flags (except the first) are used to build up the ''flexible vertex format (FVF)'' {{ref|2}}.
+
Bits 16-23 (mask <code>0x00FF0000</code>) in the format description give the number of texture coordinate sets (numTexSets).
 
+
If the value in the file is zero, rpGEOMETRYTEXTURED means there is one set of texture coordinates, rpGEOMETRYTEXTURED2 means there are two.
=== Prelightning/Vertex colors ===
 
 
 
If '''flag 8''' is enabled vertex color information for each vertex get stored up next:
 
 
 
4b - DWORD  - Vertex color (RwRGBA)
 
 
 
''San Andreas'' Rockstar's engine is able to change the vertex colors for ingame nights by availing of a [[List of RW section IDs#Rockstar.27s_Custom_Sections|custom section]] called [[Extra Vert Colour (RW Section)|Extra Vert Colour]]. This prevents the game from loading new models at different times and increments the performance of the engine. Previous games stored copies of the model with different prelightning information and defined it inside the [[TOBJ]] [[IDE]] section.
 
 
 
=== Texture/UV coordinates ===
 
 
 
If '''flag 4''' or '''128''' is set texture coordinates are following next. If both are set then the texture coordinates for the first texture of all vertices are listed before the texture coordinates for the second chanel of all vertices. There's a maximum of 8 sets for texture coordinates, but GTA games use only first (diffuse map) or second (reflection map) set.
 
 
 
4b - FLOAT  - Texture coordinate U
 
4b - FLOAT  - Texture coordinate V
 
 
 
=== Triangles ===
 
 
 
The following array holds indices and material IDs for each triangle. The number of indices is represented by the third multiple of the triangle count value. So for each triangle the following format gets used:
 
 
 
2b - WORD  - Index of second vertex
 
2b - WORD  - Index of first vertex
 
2b - WORD  - Material ID
 
2b - WORD  - Index of third vertex
 
 
 
'''NOTE!''' Since vertex index number is limited within 16 bits value, it's not possible to store more than '''65535''' vertices in Geometry.
 
 
 
=== Bounding information ===
 
 
 
The bounding information are used to check weather the mesh is visible for the camera, or not. It only exists once per geometry section.
 
 
 
4b - FLOAT  - Center X
 
4b - FLOAT  - Center Y
 
4b - FLOAT  - Center Z
 
4b - FLOAT  - Radius of bounding sphere
 
4b - DWORD  - Has positions
 
4b - DWORD  - Has normals
 
 
 
The central vector (<code>RwV3d</code>) describes the center of the bounding sphere as an offset from the [[IPL|placement]] of the object inside the real world.
 
 
 
=== Vertex translation info ===
 
 
 
The number of vertices gets defined inside the geometry structure. If '''flag 2''' is set the translation information gets stored for each vertex as a <code>RwV3d</code>:
 
 
 
4b - FLOAT  - Position X
 
4b - FLOAT  - Position Y
 
4b - FLOAT  - Position Z
 
 
 
The position values are an offset relative to the mesh pivot.
 
 
 
=== Normals ===
 
 
 
In case '''flag 16''' is set the [[wikipedia:Surface_normal|normal vectors]] are the last part of the geometry data structure. They are also stored as a <code>RwV3d</code> for each vertex:
 
  
4b - FLOAT  - Direction X
+
If rpGEOMETRYNATIVE is set, the platform dependent geometry data is to be found in the [[Native Data PLG (RW Section)|Native Data]] chunk.
4b - FLOAT  - Direction Y
 
4b - FLOAT  - Direction Z
 
  
 
== Child sections ==
 
== Child sections ==

Revision as of 11:57, 13 August 2015

{{{NAME}}}
RenderWare Stream Section
Vendor {{{VENDORNAME}}}
Module {{{MODULENAME}}}
Module ID 0x{{{MODULEID}}}
Identifier 0x{{{IDENTIFIER}}}
Chunk ID 0x{{{MODULEID}}}{{{IDENTIFIER}}}
Versions All
Hierarchy
Parents:
None
Children:
None
Extensions:
None
File Format

Geometry is a container chunk used in DFF files as child of a Geometry List section. The chunk itself does not store any data at all. All additional information get stored inside a Struct which directly follows this one as a child. Geometry is one of the most important chunks inside a .dff model file. It stores geometry information for models (like the mesh and the texture maps).

Structure

The format of the Geometry's Struct chunk is as follows:

int32        format (see below)
int32        number of triangles (numTriangles)
int32        number of vertices (numVertices)
int32        number of morph targets (numMorphTargets) (morphing is not used in GTA series, so this is always 1)
#if version < 0x34000
  surface properties:
    float32  ambient
    float32  specular
    float32  diffuse
#endif

#if (format & rpGEOMETRYNATIVE) == 0
    #if (format & rpGEOMETRYPRELIT)
        RwRGBA   prelitcolor[numVertices] (RwRGBA: uint8 r, g, b, a)
    #endif

    #if format & (rpGEOMETRYTEXTURED | rpGEOMETRYTEXTURED2)
        #repeat numTexSets (see below)
            RwTexCoords    texCoords[numVertices]  (RwTexCoords: float32 u, v)
        #endrepeat
    #endif
   
    RpTriangle   triangles[numTriangles]  (RpTriangle: uint16 vertex2, vertex1, materialId, vertex3)
#endif

#repeat numMorphTargets
    RwSphere    boundingSphere[3]    (RwSphere: float32 x, y, z, radius)
    bool32      has vertices
    bool32      has normals
    #if has vertices
        RwV3d   vertices[numVertices] (RwV3d: float x, y, z)
    #endif
    #if has normals
        RwV3d   normals[numVertices]
    #endif
#endrepeat

Format

The following flags describe the behaviour of the mesh during the rendering progress. Some of the flags indicate the existence of data inside the following file format.

Flag Name Description
0x00000001 rpGEOMETRYTRISTRIP Is triangle strip (if disabled it will be an triangle list)
0x00000002 rpGEOMETRYPOSITIONS Vertex translation
0x00000004 rpGEOMETRYTEXTURED Texture coordinates
0x00000008 rpGEOMETRYPRELIT Vertex colors
0x00000010 rpGEOMETRYNORMALS Store normals
0x00000020 rpGEOMETRYLIGHT Dynamic vertex lightning (?)
0x00000040 rpGEOMETRYMODULATEMATERIALCOLOR Modulate material color
0x00000080 rpGEOMETRYTEXTURED2 Texture coordinates 2
0x01000000 rpGEOMETRYNATIVE Native Geometry

Bits 16-23 (mask 0x00FF0000) in the format description give the number of texture coordinate sets (numTexSets). If the value in the file is zero, rpGEOMETRYTEXTURED means there is one set of texture coordinates, rpGEOMETRYTEXTURED2 means there are two.

If rpGEOMETRYNATIVE is set, the platform dependent geometry data is to be found in the Native Data chunk.

Child sections

Extension

The extension of an geometry usually holds the following sections in the order they are listed in here:

See also

References

^ * http://msdn.microsoft.com/en-us/library/bb172518%28VS.85%29.aspx
^ * http://msdn.microsoft.com/en-us/library/bb172559%28VS.85%29.aspx