PDA

View Full Version : GR2 Editor/Viewer/Extractor/Importer


Pages : [1] 2 3 4 5 6 7 8 9 10 11

TheDarkWraith
09-29-11, 05:10 PM
For approximately the last 8 months I've been gathering information on the GR2 format. I've found info from the net and from this one magical place on the net dealing with QuArK. This one magical place has been a major source of the information I've attained about the GR2 format. Another huge source of information was the GrannyViewer app from RAD games (the 'maker' of the granny format - a free app from them). That app tells you everything that is contained in the GR2 file - the trick is figuring where the info displayed resides in the GR2 file. I used that app extensively in the making of this app. Last, but not least, Privateer provided the last missing piece to the puzzle when he released his GR2 template for the 010 editor. I couldn't figure out how to read the very beginning of the file and that template provided information that allowed me to figure it out.
The pointers contained in section 0 of the GR2 file will tell you everything you need to know to do what I've done.

http://www.subsim.com/radioroom/picture.php?albumid=553&pictureid=5515

The screenshot above shows NSS_Uboat7a (with hull mesh turned off to show rooms). All waypoints are shown also.

Since I have all this data and I know how to interpret it correctly I can do basically anything with it. An extractor will be coded in to allow you to extract meshes from the GR2 file into OBJ format (might even code it for Microsoft's X format also). I hope to also figure out how to import new items into the GR2 file via the app.

Now I know someone is going to say "We have the goblin editor and Granny viewer to see GR2 files graphically. Why reinvent the wheel?" And that would be a good and valid question. Here's why:
- If I can display the information I read from the file graphically and it renders correctly then I'm reading the file correctly. Most important.
- To do things that either of them can't do (picking, moving bones, rotating meshes, etc.)

For anyone that's curious:
- developed using Visual Studio 2008 C#
- currently uses DirectX fixed-function pipeline (I plan on converting it to the programmable pipeline [aka shaders] once everything is working). I use the fixed-function pipeline because it's easier to code initially. Goal is to get everything working then go back and polish.
- uses DirectX 9.0c for rendering (no OpenGL or anything like that)

current version v1.1.459.1: https://www.mediafire.com/?0c360d3g4jx3qah
NOTE: CURRENT VERSION IS IN ALPHA STATE. ENSURE TO BACKUP YOUR WORK BEFORE SAVING WITH APP!

:|\\


In hopes of getting some open-source type thing going on here is the C# AntiGranny code file (old and outdated but still full of useful info). Since there was no participation in my open-source adventure I will not be updating the source code below anymore:
(http://www.gamefront.com/files/20885697/AntiGranny___Subsim_10_13_2011_zip)http://www.gamefront.com/files/20890908/AntiGranny___Subsim_10_15_2011_zip

THE_MASK
09-29-11, 05:16 PM
Speechless :rock:

Echolot
09-29-11, 05:47 PM
TheDarkWraith :rock:

Privateer :rock:

Subsim community :rock:

Great.

:sunny:

Madox58
09-29-11, 07:31 PM
Very Nice Mate!
:salute:

I'm sure some of the information I have will help alot.

Sailor Steve
09-29-11, 08:34 PM
Supercalifragilisticexpialidocious! :rock:

Not that I understand any of it, but I can see that it's awesome!

TheDarkWraith
09-29-11, 09:39 PM
First texture render (lighting disabled):

http://www.subsim.com/radioroom/picture.php?albumid=553&pictureid=4940

As you can see I have more work to do on it. Not bad for first render with textures though! The textures and how they are defined in the GR2 file are somewhat confusing. You have a pointer that can point to the actual material or it could point to another pointer that can point to another pointer......so on and so forth :shifty: I obviously don't have my pointers straight :DL By looking at this graphically I can see that I'm not reading this part of the file correctly.

TheDarkWraith
09-29-11, 09:57 PM
The problem above is due to multiple textures defined per a mesh subset. I'm not reading those correctly. When I try a simple item like the CMD_small_boat it renders fine:

http://www.subsim.com/radioroom/picture.php?albumid=553&pictureid=4941

Back to the Granny Viewer we go!

Anvart
09-30-11, 01:25 AM
For approximately the last 8 months I've been gathering information on the GR2 format. I've found info from the net ...
At last, "a whipping boy" appeared... :haha:
Looks tempting ...
Good luck. :up:

TheDarkWraith
09-30-11, 01:48 AM
Well I'm miffed :shifty: According to granny viewer all my ducks are in a row regarding textures, vertices, texture coordinates, etc. for the King George gr2 file. But the hull still renders incorrectly. Now one thing I have noticed is that on some units where the hull is rendered incorrectly if I place the camera inside the hull (inside the ship) and look at the hull it's rendered correctly (with culling set to none). Puzzling :hmmm:

Another thing that maybe someone knows the answer to: how does one correctly render the other maps beside the diffuse map (self-illumination and bump)? :06: Some units have all 3 of these maps defined for a mesh and I'm currently only using the diffuse one.

Rongel
09-30-11, 02:54 AM
Another thing that maybe someone knows the answer to: how does one correctly render the other maps beside the diffuse map (self-illumination and bump)? :06: Some units have all 3 of these maps defined for a mesh and I'm currently only using the diffuse one.

I've been figuring out myself how the textures are assigned to GR2 units, but don't know still. The O0_file is always in the ship folder, so I guessed other maps are embedded. But then I found in data/textures lots of ship textures, about 30 of them in total (ship_hull_N01, ship_hull_T01-T06, ship_T01 for example). I'm not sure if that helps but I guess they must be there for a reason.

Anyway, awesome work!

:DL:DL:DL:DL:DL:DL:DL:DL:DL:DL:DL:DL:DL:woot:

I really hope that you guys will break some locks that SH 5 has, and open the game to new possibilities!

skwasjer
09-30-11, 10:19 AM
Well I'm miffed :shifty: According to granny viewer all my ducks are in a row regarding textures, vertices, texture coordinates, etc. for the King George gr2 file. But the hull still renders incorrectly. Now one thing I have noticed is that on some units where the hull is rendered incorrectly if I place the camera inside the hull (inside the ship) and look at the hull it's rendered correctly (with culling set to none). Puzzling :hmmm:

Another thing that maybe someone knows the answer to: how does one correctly render the other maps beside the diffuse map (self-illumination and bump)? :06: Some units have all 3 of these maps defined for a mesh and I'm currently only using the diffuse one.
1. Most definately a matrix problem
2. Shaders and correct use of index/vertex buffers...

Here's S3D's shaders (diffuse, specular and ambient occlusion, no bump)... You know, that dumbmaking tool that did similar things to what you are making now for SH5! :har:



//--------------------------------------------------------------------------------------
// Global variables
//--------------------------------------------------------------------------------------
int g_nNumLights;

// Vertex shader globals
float4x4 worldViewProjection; // World * View * Projection matrix
float3 g_LightParams[3]; //x - type, y - Att2, z - Range
float3 g_LightSpotParams[3]; //x = cos(Phi/2), y = cos(theta/2), z = 1 / (cos(theta/2) - cos(Phi/2))
float4 g_LightDiffuse[3]; // Light's diffuse color
float4 g_LightSpecular[3]; // Light's specular color
float3 g_LightPos[3]; // Light's position in world space
float3 g_LightDir[3]; // Light's direction in world space
//float4 g_fogParam;
// Shared globals
float3 g_CameraPosition;
float3 g_MaterialParams; // x - specular power, y - specular strength
// Pixel shader globals
float4 g_MaterialAmbientColor;
//float3 g_fogColor;
float g_bUseSpecFromDiffuse;
float4 g_UseMaps; // x - use AO map, y - use spec map, z - use bump map
float2 g_BrightnessContrast = float2(0.05f, 0.05f); // x - brightness, y - contrast
float4 g_SelectionColor; // Color used to indicate selection.

// Wireframe color
float4 g_WireframeColor;

texture g_DiffuseTexture; // Color texture for mesh
texture g_SelfIllumTexture; // Color texture for mesh


float appTime; // App's time in seconds
float4x4 worldMatrix; // World matrix for object

//--------------------------------------------------------------------------------------
// Texture samplers
//--------------------------------------------------------------------------------------
sampler DiffuseMap =
sampler_state
{
Texture = <g_DiffuseTexture>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
sampler LightMap =
sampler_state
{
Texture = <g_SelfIllumTexture>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
//--------------------------------------------------------------------------------------
// Vertex shader output structure
//--------------------------------------------------------------------------------------
struct VS_OUTPUT
{
float4 ProjPos : POSITION; // vertex position
float4 Texs : TEXCOORD0; // vertex texture coords
//float Fog : TEXCOORD1;
float3 Normal : TEXCOORD2;
float3 EyeVertex : TEXCOORD3;
float3 Diffuse : COLOR0; // vertex diffuse color
float3 Specular : COLOR1; // vertex specular color
};

//--------------------------------------------------------------------------------------
// This shader computes standard transform and lighting
//--------------------------------------------------------------------------------------
VS_OUTPUT RenderSceneVS( float4 vPos : POSITION,
float3 vNormal : NORMAL,
float2 vTex0 : TEXCOORD0,
float2 vTex1 : TEXCOORD1,
uniform bool bWireFrame )
{
VS_OUTPUT Out;
Out.ProjPos = mul(vPos, worldViewProjection);
Out.Texs = float4(vTex0, vTex1);
// Out.Fog = 0;
Out.Normal = vNormal;
Out.EyeVertex = normalize(vPos.xyz - g_CameraPosition);
Out.Diffuse = 0;
Out.Specular = 0;
if (bWireFrame)
{
Out.Diffuse = float4(1, 1, 1, 1); // Full...
return Out;
}
float3 refl = reflect(Out.EyeVertex, vNormal);
float dist;
for (int i=0; i < g_nNumLights; i++)
{
float3 lightPos = mul(g_LightPos[i], transpose(worldMatrix));

dist = distance(lightPos, vPos.xyz);
float3 VertexLightDir = normalize(lightPos - vPos.xyz);
float LightAtt = 1 / (1 + dist * dist * g_LightParams[i].y);
float LightInfluence = LightAtt * saturate(dot(vNormal, VertexLightDir));
float specFactor = LightAtt * saturate(dot(refl, VertexLightDir));

float spot = 1;

if (g_LightParams[i].x > 1.1f) //that means we have a spot light
{
float cosa = dot(VertexLightDir, g_LightDir[i]);
if (cosa < g_LightSpotParams[i].x)
{
spot = 0;
}
else
{
if (cosa < g_LightSpotParams[i].y)
spot = (cosa - g_LightSpotParams[i].x) * g_LightSpotParams[i].z;
}
}

Out.Diffuse += g_LightDiffuse[i] * LightInfluence * spot;
Out.Specular += g_LightSpecular[i] * pow(specFactor, g_MaterialParams.x) * spot;
}

dist = distance(g_CameraPosition, vPos.xyz);
//Out.Fog = saturate((dist - g_fogParam.x) * g_fogParam.z);
return Out;
}

//--------------------------------------------------------------------------------------
// Pixel shader output structure
//--------------------------------------------------------------------------------------
struct PS_OUTPUT
{
float4 RGBColor : COLOR0; // Pixel color
};

//--------------------------------------------------------------------------------------
// This shader outputs the pixel's color by modulating the texture's
// color with diffuse material color
//--------------------------------------------------------------------------------------
float4 RenderScenePS( VS_OUTPUT In,
uniform bool bWireFrame ) : COLOR
{
if (bWireFrame)
{
return g_WireframeColor;
}
float4 BaseColor = tex2D(DiffuseMap, In.Texs.xy);
float4 SelfIllum = tex2D(LightMap, In.Texs.zw);

// float specMask = lerp(1, BaseColor.w, g_bUseSpecFromDiffuse);
float specMask = tex2D(LightMap, In.Texs.xy).w;
specMask = lerp(specMask, BaseColor.w, g_bUseSpecFromDiffuse);

if (g_UseMaps.x == 0)
SelfIllum = float4(0.75f, 0.75f, 0.75f, 1);
if (g_UseMaps.w == 0)
{
BaseColor = g_SelectionColor;
BaseColor.w = g_MaterialAmbientColor.w;
}
else
{
BaseColor.xyz = BaseColor.xyz * g_SelectionColor.xyz;
}
//else if (g_UseMaps.y == 0)
// BaseColor.xyz = (BaseColor.xyz + g_BrightnessContrast.x) * (1.0 + g_BrightnessContrast.y)/1.0;


if (g_UseMaps.y == 0) specMask = 0;
//BaseColor.w = saturate(BaseColor.w + g_bUseSpecFromDiffuse);

float3 VNormal = normalize(In.Normal);

float3 refl = reflect(In.EyeVertex, VNormal);

float3 DiffuseColor = In.Diffuse;
float3 SpecularColor = In.Specular;
for (int i=0; i < g_nNumLights; i++)
{
float LightInfluence = saturate(dot(VNormal, g_LightDir[i].xyz));
float specFactor = saturate(dot(refl, g_LightDir[i].xyz));
DiffuseColor += LightInfluence * g_LightDiffuse[i];
SpecularColor += g_MaterialParams.y * pow(specFactor, g_MaterialParams.x * (specMask+0.01)) * g_LightSpecular[i];
}

//return float4(BaseColor.xyz * (DiffuseColor + g_MaterialAmbientColor.xyz), 1);
//return float4(SpecularColor, 1);

float4 Color;
Color.xyz = BaseColor.xyz * SelfIllum.xyz * (DiffuseColor + g_MaterialAmbientColor.xyz) + SpecularColor * SelfIllum.x * specMask;

Color.w = BaseColor.w;
//Color.xyz = lerp(Color.xyz, g_fogColor, In.Fog);

Color.xyz = (Color.xyz + g_BrightnessContrast.x) * (1.0 + g_BrightnessContrast.y)/1.0;
return Color;
}
//--------------------------------------------------------------------------------------
// Renders scene to render target
//--------------------------------------------------------------------------------------
technique RenderScene
{
pass P0
{
VertexShader = compile vs_2_0 RenderSceneVS(false);
PixelShader = compile ps_2_0 RenderScenePS(false);
}
}
//--------------------------------------------------------------------------------------
// Renders scene to render target, using wireframe mode
//--------------------------------------------------------------------------------------
technique RenderSceneWireframe
{
pass P0
{
FillMode = Wireframe;
CullMode = CCW;
ZWriteEnable = false;
ZFunc = Less;
//CullMode = None;
VertexShader = compile vs_2_0 RenderSceneVS(true);
PixelShader = compile ps_2_0 RenderScenePS(true);
}
}
//--------------------------------------------------------------------------------------
// Renders scene to render target, using point mode
//--------------------------------------------------------------------------------------
technique RenderSceneVertices
{
pass P0
{
FillMode = Point;
CullMode = CCW;
ZWriteEnable = false;
ZFunc = Less;
VertexShader = compile vs_2_0 RenderSceneVS(true);
PixelShader = compile ps_2_0 RenderScenePS(true);
}
}

//--------------------------------------------------------------------------------------
// Renders scene to render target, using wireframe mode
//--------------------------------------------------------------------------------------
technique RenderSceneSolidWireframe
{
pass P0
{
FillMode = Solid;
CullMode = CCW;
ZWriteEnable = true;
ZFunc = LessEqual;

VertexShader = compile vs_2_0 RenderSceneVS(false);
PixelShader = compile ps_2_0 RenderScenePS(false);
}
pass P1
{
FillMode = Wireframe;
CullMode = CCW;
ZWriteEnable = false;
ZFunc = Less;

PixelShader = compile ps_2_0 RenderScenePS(true);
}
}
//--------------------------------------------------------------------------------------
// Renders scene to render target, using point mode
//--------------------------------------------------------------------------------------
technique RenderSceneSolidVertices
{
pass P0
{
FillMode = Solid;
CullMode = CCW;
ZWriteEnable = true;
ZFunc = LessEqual;
VertexShader = compile vs_2_0 RenderSceneVS(false);
PixelShader = compile ps_2_0 RenderScenePS(false);
}
pass P1
{
FillMode = Point;
CullMode = CCW;
ZWriteEnable = false;
ZFunc = Less;
PixelShader = compile ps_2_0 RenderScenePS(true);
}
}


Now if you need more (technical) answers you'll have to be more specific.

TheDarkWraith
09-30-11, 10:46 AM
Don't think it's a matrix problem. The bone associated with the King GeorgeV hull is positioned at world center (0,0,0) with no rotations so for all intensive purposes the world matrix is Matrix.Identity.

The index buffer and vertex buffer for the mesh match what the granny viewer shows. The texture coordinates for the verticies in the vertex buffer also match what granny viewer shows. The normals for the verticies in the vertex buffer also match what granny viewer shows. Everything renders correctly geometry wise and everything except the hull renders correctly texture wise. The hull mesh has two subsets and I've noticed that anything with more than 1 subset in the mesh doesn't render correctly texture wise.

I'm currently using the fixed-function pipeline for rendering. I'll convert to programmable pipeline (shaders) after I get everything working correctly.

This hull rendering problem is really starting to annoy me :shifty:

skwasjer
09-30-11, 10:54 AM
If you've got a 'small' world/view matrix error (or related, RH/LH system mixup), the entire unit still renders correctly (at least, might) but the uv-map thus can be offset. All I'm saying, it's a common and classic mistake, and you are not the first to make it. [edit] and PS, it's exactly why flipping the culling from CW to CCW or vice versa sort of fixes it (obviously it's not fixed, since it renders inside out). This generally means a matrix error (just a single 'sign' - somewhere, usually, the identity)

Of course it can have other causes, like not using map channels correctly, loading uv table incorrectly... but my first comment is something worth looking into because I've seen this error many times...

TheDarkWraith
09-30-11, 10:56 AM
I think I have an incorrect map assigned for subset 2. Subset 1 renders fine:

http://www.subsim.com/radioroom/picture.php?albumid=553&pictureid=4946

I'm going to try forcing subset 2 to use subset 1's map

EDIT:

same result.

The inside of the hull of the King George renders incorrectly also so it's not a matter of triangle verticies flipped.

TheDarkWraith
09-30-11, 11:11 AM
ok, I think I found the problem:

http://www.subsim.com/radioroom/picture.php?albumid=553&pictureid=4947

If a mesh has multiple subsets then of course it has maps assigned to each subset. When I read the maps assigned to a mesh with multiple subsets from the GR2 file I need to reverse the order of them. Another strange quirk of the GR2 format.

TheDarkWraith
09-30-11, 11:27 AM
I have a material binding problem somewhere:

http://www.subsim.com/radioroom/picture.php?albumid=553&pictureid=4948

After I reversed the order of the maps for a mesh subset with multiple maps I get the hull to render correctly but now the other subset (0) has an obvious incorrect material assigned to it. I have a pointer crossed somewhere.....:shifty:

TheDarkWraith
09-30-11, 11:59 AM
scratch what I said about needing to reverse the order of the maps associated with a mesh subset. I was reading and binding the maps correctly to each mesh subset. The problem was a coding error in the mesh class's render function :damn: Gotta love it....:shifty:

The King GeorgeV rendered correctly:

http://www.subsim.com/radioroom/picture.php?albumid=553&pictureid=4949

That was the 'hardest' GR2 file in SH5 I could find to read/parse. God am I happy everything is working now :D

TheDarkWraith
09-30-11, 01:02 PM
now that I can render the GR2 model correctly using the fixed-function pipeline it's time to convert to programmable pipeline. The reason I used fixed-function pipeline first was to minimize possible coding/shader errors. The goal was read and display model correctly then polish.

Now here's my question: I have only one set of texture coordinates for each vertex of each mesh. Don't I need 2 more sets of texture coordinates for the Self-Illumination (AO) and Bump (normal map)? :06:

Madox58
09-30-11, 02:00 PM
Now here's my question: I have only one set of texture coordinates for each vertex of each mesh. Don't I need 2 more sets of texture coordinates for the Self-Illumination (AO) and Bump (normal map)? :06:

Yes. You need the second set of Texcoords in the GR2 file for the AO.
There is no built in Structure in the granny2.dll to read them though.
So if your useing the same calls as used by Quark (Which came from gr2.Decode by the way) to read the PrimaryVertexData you'll never access them.

By-passing the granny2.dll allows reading (and writeing) them.
Here's the King George's AO texcoords extracted. (no granny2.dll was harmed during the extraction! :haha:).
http://i108.photobucket.com/albums/n12/privateer_2006/GR2%20Stuff/KG_AO_UVs.jpg

For the Normals, it uses the first Texcoords set.
But you need to write the code to implement Normals.
One good thing? You don't need to write the code to calculate the Normals, Tangents, or Bitangents.
Those are already in the PrimaryVertexData.
So you only need to read them.

reaper7
09-30-11, 03:33 PM
Amazing work going on here :o

Madox58
09-30-11, 03:45 PM
:yep:

But I do see a trend here.
Another 'dumbmaking tool'.
:har:

And that's fine with me!
I don't program 'pretty stuff' as others do.
I program what I need and move on.
Then I'll pass on what I know to others.
So if someone else does the fancy GUI stuff? All the better for everyone here.

If I can read and write what I want?
I don't need to see it in realtime as I already know the results before I ever put it in Game or run the program.
(90% of the time it works. I can deal with a 10% WTF rate and go back)

TheDarkWraith
09-30-11, 03:54 PM
ok then I need to define a structure for the second set of texture coordinates. Maybe the grannyloader.dll of SH5 can help me get to them :06: SH5 access them somehow and just have to figure out how. I'll poke around more in the granny2.dll to see if it can extract those coordinates for me.

Madox58
09-30-11, 04:02 PM
It won't. I know that for a fact.
It's one reason I dropped useing the dll and went for a full understanding of the format to do what I want.

If useing built in Structures from the Granny2.dll in SH5?
You'll never get the second set of texcoords.

Those are in the second section along with all the other PrimaryVertexData information.
(Section 3 is all the faces)
Section 1 contains all the information to decide the TriGroups and MUCH more!

Madox58
09-30-11, 05:06 PM
Another point.
Even if you figure out the right way to code things to use the granny2.dll?
That may violate copyrights.
Do what we want to the granny2.dll and GR2 files as long as we don't infringe.
So if you are useing something like:

nverts = (*GrannyGetMeshVertexCount)(mesh);

You may be subject to problems with RAD.

TheDarkWraith
09-30-11, 05:38 PM
If you bought the SH5 game you have a license to all the files contained in it. As long as I don't modify any dlls or exe there is no legal ground for anyone to stand on. Furthermore since the app asks you to point it to your granny2.dll file it is using your licensed copy of it.

Using tools from Microsoft I inspect the granny2.dll to figure out function calls. Just now I found in the exports section all the defined vertex formats that granny uses. From that information (and some trial and error) I make my code.

Just read in all the binormal and tangent information with each vertex :cool: There is not a granny vertex format defined that reads the second UV coordinates. Thus there is some function in that dll that does this. Now to find it.

Madox58
09-30-11, 05:48 PM
It's a special defined structure that is not in the granny2.dll
That I know.
Maybe in the grannyloader.dll granted.
I don't need those so I don't look at them.
The GR2 format is not that difficult to work with if you look at it as it is.
It's not compressed in SH5.
It's all layed out from start to EOF.
And SH5 does not do the CRC check.
Had SH5 used the CRC check?
We'd be screwed big time!!
Unless you fell back to an older granny2.dll
:03:

TheDarkWraith
09-30-11, 06:29 PM
ok, I think I found something interesting in the King GeorgeV.gr2 file itself:

000176E0 01 01 01 01 01 01 01 01 00 00 00 00 50 6F 73 69 ............Posi
000176F0 74 69 6F 6E 00 00 00 00 4E 6F 72 6D 61 6C 00 00 tion....Normal..
00017700 54 61 6E 67 65 6E 74 00 42 69 6E 6F 72 6D 61 6C Tangent.Binormal
00017710 00 00 00 00 54 65 78 74 75 72 65 43 6F 6F 72 64 ....TextureCoord
00017720 69 6E 61 74 65 73 30 00 54 65 78 74 75 72 65 43 inates0.TextureC
00017730 6F 6F 72 64 69 6E 61 74 65 73 31 oordinates1

Basically it tells me the vertex layout:
Position
Normal
Tangent
Binormal
TextureCoordinates0
TextureCoordinates1

so if I read in this vertex format it should work....time to try :yep:

Madox58
09-30-11, 06:41 PM
Yes.
All information like that is laid out in section 2 just as you see it in Grannyviewer!

It's a solid block defined by the section index and it's pointer.
Section 3 has all the faces.

That's all those sections contain.

Section 1 contains all the information as to how to divide those into seperste meshes and the textures assignments.
Plus much more.
:03:

The default for sections in a GR2 file is 8.
Max sections is 32
(That info is from the Granny history at RAD Games)

Also from a RAD Games Blog?
Most GR2 files are not modified even though Granny allows modifications.
'The First Templar' is a GREAT example of a modified GR2 file!
Easy to read/write setup for the most part.

Rongel
09-30-11, 08:57 PM
I don't understand a word from that, and I don't really want to, just keep going unless police orders you to stop :D

This kind of stuff is the future of SH 5.

Probably the last WW2 subsim that humankind has to offer!

TheDarkWraith
09-30-11, 09:02 PM
there looked to be a promising function in the granny2.dll: GrannyGetMeshVertexType. OllyDebug reported that it took one parameter and it was quite obvious that the one parameter was a pointer to a mesh. So I passed in the pointer to a mesh that had 2 texture coordinates per vertex defined hoping that the value returned would be a pointer to the granny vertex type defining 2 texture coordinates. I passed the returned value into the GrannyCopyMeshVertices function and looked at the returned values from that function. Result was a big fat no :shifty: It only returned the correct format for the mesh with 1 texture coordinate defined as evidenced from the returned data (the bone weight and bone indicies data contained something other than 0,0,0,0) It was worth a try :yep:

Next thing is granny viewer reports VertexData. This vertex data contains descriptors defining the vertex data along with verticies for that vertex data group. Let's see what it does.....

EDIT:

I can't make the correct structure the function call requires.....All I get is garbage back......

TheDarkWraith
09-30-11, 10:32 PM
Here's the King George's AO texcoords extracted. (no granny2.dll was harmed during the extraction! :haha:).
http://i108.photobucket.com/albums/n12/privateer_2006/GR2%20Stuff/KG_AO_UVs.jpg


ok I don't know much about AO maps but I'm learning. That image above looks more like a .dds file. Are you saying the second set of texture coordinates are in fact a Vector3 array? It appears that triangles are being defined in that picture.....or is that a 2D render of the verticies texture coordinates? :06:

skwasjer
10-01-11, 03:28 AM
It's simply a render of the uv map for AO (vector2 array).

You have to define the right vertex structure. When more uv maps are defined on a model, a vertex structure has extra texcoords:

Vector3 Position;
Vector3 Normal;
Vector2 UV;
Vector2 UV_AO;

In shader code you decide when to use and what you do with it (and not in program code). In the same way you need to provide bi/tangent normals for bump mapping. And of course need to pass the appropriate textures to the shader pipeline. See my shader for an example...

Hint:
VS_OUTPUT RenderSceneVS( float4 vPos : POSITION,
float3 vNormal : NORMAL,
float2 vTex0 : TEXCOORD0,
float2 vTex1 : TEXCOORD1,
uniform bool bWireFrame )

skwasjer
10-01-11, 03:42 AM
If you bought the SH5 game you have a license to all the files contained in it. As long as I don't modify any dlls or exe there is no legal ground for anyone to stand on. Furthermore since the app asks you to point it to your granny2.dll file it is using your licensed copy of it.
So you're saying you could take any program it's core files, reverse engineer it or use libraries from it, but as long as you don't distribute those files (since the user has them already) you are in the clear... Trust me, that won't stand in court. Anywhere. Even I 'touched' illegal grounds by simply looking at SH4's .ACT files but at least I did not use any game libraries...

Now if RAD doesn't care, good for you and SH5, but that doesn't make it legal.

But anyways, this is an old discussion I don't care getting into...

Madox58
10-01-11, 07:51 AM
ok, I think I found something interesting in the King GeorgeV.gr2 file itself:

000176E0 01 01 01 01 01 01 01 01 00 00 00 00 50 6F 73 69 ............Posi
000176F0 74 69 6F 6E 00 00 00 00 4E 6F 72 6D 61 6C 00 00 tion....Normal..
00017700 54 61 6E 67 65 6E 74 00 42 69 6E 6F 72 6D 61 6C Tangent.Binormal
00017710 00 00 00 00 54 65 78 74 75 72 65 43 6F 6F 72 64 ....TextureCoord
00017720 69 6E 61 74 65 73 30 00 54 65 78 74 75 72 65 43 inates0.TextureC
00017730 6F 6F 72 64 69 6E 61 74 65 73 31 oordinates1

Basically it tells me the vertex layout:
Position
Normal
Tangent
Binormal
TextureCoordinates0
TextureCoordinates1



Most Models in SH5 use 64 bytes to define the data for one vertex.
MOST but not all!!
Look at the Large Costal Gun and you'll see a 76 byte data structure!!
It has DiffuseColor0 before the first set of Texcoords.
That throws 12 bytes in but I have no idea why that's there.
:hmmm:
Open that GR2 with your program and since your useing the granny2.dll I would expect it to render properly.

I had to add to my script to export the vertex data to account for this extra info.
Basiclly I just ignore it for now.

Also, if you open the gun with Goblin and click to view wireframe?
Only the base will show in wireframe mode.
The Barrel and Turret won't. So the DiffuseColor0 is doing something at least in Goblin.

Alex
10-01-11, 10:32 AM
Let me tell you that I'm lost in admiration for the amount of knowledge that a select few have gathered in the shadows on some subjects related to this game.

:huh:

But let's get back on topic now. :|\\

skwasjer
10-01-11, 11:10 AM
Most Models in SH5 use 64 bytes to define the data for one vertex.
MOST but not all!!
Look at the Large Costal Gun and you'll see a 76 byte data structure!!
It has DiffuseColor0 before the first set of Texcoords.
That throws 12 bytes in but I have no idea why that's there.
:hmmm:
Open that GR2 with your program and since your useing the granny2.dll I would expect it to render properly.

I had to add to my script to export the vertex data to account for this extra info.
Basiclly I just ignore it for now.

Also, if you open the gun with Goblin and click to view wireframe?
Only the base will show in wireframe mode.
The Barrel and Turret won't. So the DiffuseColor0 is doing something at least in Goblin.
It can indeed be simply for editting/viewing/debugging purposes. Remember that SH3/4 had many 'dev-leftovers' too in the game files. But it can also be a base color for lighting. I really have no idea why so I'm just throwing out ideas I know from memory/earlier experience. You might get a clue from the shader files. Just check all vertex shaders and their input structures and see if you can 'match' the input with the vertex data that you get from GR2. If it's somewhere in there you can deduce what it's for by interpreting the shader code. If it's nowhere to be found you can probably simply ditch it... It's how I learned that uv3/4 in DAT-files are obsolete data.

TheDarkWraith
10-01-11, 12:23 PM
Most Models in SH5 use 64 bytes to define the data for one vertex.
MOST but not all!!
Look at the Large Costal Gun and you'll see a 76 byte data structure!!
It has DiffuseColor0 before the first set of Texcoords.
That throws 12 bytes in but I have no idea why that's there.
:hmmm:
Open that GR2 with your program and since your useing the granny2.dll I would expect it to render properly.

Yes it does because it only reads one texture coordinate. There is no granny vertex format defined that has this other channel:

http://www.subsim.com/radioroom/picture.php?albumid=553&pictureid=4959

If you use Microsoft's PE dumper and look at the exports you'll see all the granny vertex formats defined. They are kind of encrypted in their wording but you can make it out. i.e.: PNT332 would be position, normal, texture where position is 3 reals, normal is 3 reals, and texture is 2 reals.

Viewing this in wireframe is fine because I'm controlling the rendering and just setting the wireframe renderstate.

I've come to the conclusion that the game (and Goblin editor) doesn't really use the granny2.dll to 'read' the whole GR2 file. It only uses it to get information when it needs it. This would explain why it can access the other texture coordinates and other color information contained in the verticies.

Here are two vertex formats I know:
PWNT3432 - position (3 reals), Bone data (bone indicies - 4 ints, bone weights - 4 ints), normal (3 reals), texture coordinates (2 reals)
PWNGBT343332 - position (3 reals), Bone data (bone indicies - 4 ints, bone weights - 4 ints), normal (3 reals), tangent (3 reals), binormal (3 reals), texture coordinates (2 reals)

The Granny viewer is an excellent source of information. It tells you what the data type is for each value it reads right there on the screen!

skwasjer
10-01-11, 01:49 PM
From Granny SDK feature page: http://www.radgametools.com/granny/sdk.html

- programmatically access all maps, including specular, diffuse, ambient, self-illumination, bump, displacement, refraction, reflection, and many others

I've come to the conclusion that the game (and Goblin editor) doesn't really use the granny2.dll to 'read' the whole GR2 file. It only uses it to get information when it needs it. This would explain why it can access the other texture coordinates and other color information contained in the verticies.

Yes, a(ny) file never has to be completely loaded. The beauty of pointers. Files generally start with some sort of TOC header to aid in this.
No, in that the game will bypass the granny library to get other data from GR2. That would be utterly idiotic. The game has to get the data in some way at some point and it definately uses Granny for it.

Anvart
10-01-11, 02:33 PM
...
And SH5 does not do the CRC check.
Had SH5 used the CRC check?
We'd be screwed big time!!
Unless you fell back to an older granny2.dll
:03:
... but no probs to calculate it... and you know it. :O:
******************************************
small intrigue:

http://img8.imageshack.us/img8/885/gr2crcsh5.jpg

Madox58
10-01-11, 03:30 PM
Uh Oh!!!
:o

skwasjer
10-01-11, 03:35 PM
In 3... 2... 1...

TheDarkWraith
10-01-11, 04:38 PM
Looks like some people are having some wrong impressions here and we need to clear these up.

I do not imbed or include any version of any software with what I have created. It's a unique, one-off design from information I have gathered.

The app is useless unless the end-user points it to a granny2.dll. Thus I have no ties to any software but my own. Freedom of information baby, gotta love the USA's freedom of speech right.

Now I may abandon having the user point it to a granny2.dll once we completely map out the gr2 file structure. Like I said I know about 75% of the structure already, it's the remaining 25% that needs to be decoded. Work is already well underway on it from various sources. I do have to say the 010 Hex editor app is a priceless piece of software. It's structure editor is a god-send when mapping out a file.

Ok now back to business :D

Madox58
10-01-11, 05:44 PM
I do agree that 010 is a fantastic Tool!
:rock:

Well worth the $49.95 spent.
I now run the 3.2.2 version.
I consider it 'THE' Editor if you mean business!
:03:

TheDarkWraith
10-01-11, 07:02 PM
I do agree that 010 is a fantastic Tool!
:rock:

Well worth the $49.95 spent.
I now run the 3.2.2 version.
I consider it 'THE' Editor if you mean business!
:03:

Cost me $150 :o Money well spent though!

I've got another major update coming to the template file. Almost have the whole material section mapped out completely - extended data and all :D

that last update I sent I found a hack that works temporarily until the data can be defined more correctly

Madox58
10-01-11, 07:08 PM
Anvart has broken the CRC issue by the way.
:rock:

$150?
Commercial is $129.95 and the Upgrade/Maintenance is $39.95 for commercial.
How did you get a $150.00 figure?

TheDarkWraith
10-01-11, 08:01 PM
Anvart has broken the CRC issue by the way.
:rock:

$150?
Commercial is $129.95 and the Upgrade/Maintenance is $39.95 for commercial.
How did you get a $150.00 figure?

You're right it was $129.95 :oops:

Ran into a stumbling block with the materials. If a material has no texture but has maps defined I can't find a hack to continue on :damn: I can fully read materials with textures and without but these that have maps defined introduce some bytes that I can't figure out.

Madox58
10-01-11, 08:03 PM
You're right it was $129.95 :oops:

Ran into a stumbling block with the materials. If a material has no texture but has maps defined I can't find a hack to continue on :damn:

What GR2 are you looking at that causes the issue?
And I take it the animations issue was solved about the AirCraft stuff?

TheDarkWraith
10-01-11, 08:04 PM
What GR2 are you looking at that causes the issue?

Junkers_Ju-88_B. I'll send the revised template so you can see for yourself.

The struct MATERIAL_EXTENDED_DATA_WITH_TEXTURE matextdatawithtexture[2] should actually be struct MATERIAL_EXTENDED_DATA_WITHOUT_TEXTURE matextdatawithtexture[2]. Since that one is screwed up everything following it is messed up.

Madox58
10-01-11, 08:07 PM
Stupid AirCraft!!
What section in the GrannyViewer?
Sorry to be so slow today but I'm on some major meds for pain right now.
Brain is not working very well.
:haha:

TheDarkWraith
10-01-11, 08:14 PM
Stupid AirCraft!!
What section in the GrannyViewer?
Sorry to be so slow today but I'm on some major meds for pain right now.
Brain is not working very well.
:haha:

I sent you a PM with the info. I haven't added the typedef for map yet (it will be a typedef of the without texture structure just to make it easier to read in editor)....

Madox58
10-01-11, 08:22 PM
Got it.
I hope you understand my jest in the return PM.
:D
I'm not a drug user so the pain meds are REALLY giving me a good time right about now.
And Pink Floyd won't turn down the light show!!
:har:

TheDarkWraith
10-01-11, 08:24 PM
Got it.
I hope you understand my jest in the return PM.
:D
I'm not a drug user so the pain meds are REALLY giving me a good time right about now.
:har:

Sure did. It was the prop not the glass.
We need to update the template with Anvart's findings and anyone else's findings for that matter. We could have a community made gr2 map :yep:

You'll see the hack I'm using to get the materials. If we can remove the hack and read the data correctly then it will probably solve the problem.

I'm only 792 bytes away from the bones :yeah: :haha: (in fact I'm closer once this little issue is sorted)

Madox58
10-01-11, 09:09 PM
I have to go lay down or something.
There's this little goofy guy that keeps bugging me and I'm not sure if it's one of my Cats or a figmnet of my imgination due to the pain meds.
:doh:
If I've offended anyone today?
At least I can blame it on the drugs this time.
:haha:
Most of the time it's just me being an arse.
:D

Regards all!
I'm off to the never ending light show for tonight!!
:rock:

TheDarkWraith
10-02-11, 01:19 AM
that revised template file has more issues with the materials. Tried in on a another battleship and it's all hosed. Good thing is I have corrected some of it (had to make some new structs) but now I have to figure out the layout with multiple maps. Those mysterious bytes I figured out what they were.

Alex
10-02-11, 04:34 AM
@ Privateer :
http://img853.imageshack.us/img853/4814/tumblrlf38lehjhe1qe44aq.jpg

http://i9.photobucket.com/albums/a75/Panzer_Kamerad/smileys/orcs/laughyork.gif

@ TheDarkWraith : Not hijacking your thread, just making some fun of J, hehe. :03:

JU_88
10-02-11, 08:49 AM
Junkers_Ju-88_B. I'll send the revised template so you can see for yourself.

The struct MATERIAL_EXTENDED_DATA_WITH_TEXTURE matextdatawithtexture[2] should actually be struct MATERIAL_EXTENDED_DATA_WITHOUT_TEXTURE matextdatawithtexture[2]. Since that one is screwed up everything following it is messed up.

If later down the line you would like proper JU-88A and JU-188 models rather than that stock JU88/188 mashup, just drop me a PM as I have them ready to go, no pressure or anything though, :D

Madox58
10-02-11, 04:24 PM
Feeling a bit better today so I looked at the problem.
I see what's going on but I'll wait for an upgraded template from you as you seem to see the problem also.

I did add Anvarts fixes to the last copy you sent me.
It's some fixes to the crap I had, changed floats and such to UINT.
Also a better check on if it's a valid GR2 loaded.
:up:

To stay in safe areas with RAD, it's better that we keep the Templates between the 3 of us for now.
I'd hate to see a release that would allow just anyone to work just any GR2 files out there!
That's not my goal by any means.
And to do so will most probably get a demand to stop from RAD.

If we reach a level where a Hard coded Tool can be created?
We can add a check that searchs out the paths used for textures as one way to contain it to SH5 GR2 files only.

We have a temporary OK to mess with the GR2 files at this time.
If We screw up and don't work in good faith with RAD?
That can and probably would be withdrawn!

TheDarkWraith
10-10-11, 08:43 PM
started recoding the app so as to not use the granny2.dll. It can currently read the fileheader, infoheader, sections, and art tool info. It can also successfully write them back to the file along with all the pointers needed for them (major accomplishment). I just started decoding how the skeleton(s), bone(s), and model(s) sections are laid out in the GR2 files. I figured out all the pointers and how they work for those items now I just have to code it.
All in all the GR2 file is not overly difficult to 'read'. If you remember that everything is laid out in sections and pointers are used to access those sections (and more pointers are used for items in the section) then you can successfully 'read' it. It just gets very confusing when you have a pointer referencing another pointer that can possibly reference another pointer.
~95% of the pointers are located at the end of the file.

Those pointers have the following configuration (from what I've seen so far):
first 4 bytes: offset in section (from start of section). This usually points to a value, a place for a pointer to go, or start of something (bone, model, skeleton, etc.)
second 4 bytes: seems to be some kind of description/identifier/accessor. Usually this value is 0x0. Have seen it be 0x6 but don't know what that value means
third 4 bytes: offset in section (from start of section). This usually points to text (Strings). Can point to start of something (bone, model, skeleton, etc.)

If you use privateer's template file for 010 editor you can get the start of the pointers from SectionInfo[0] Long Another_Pointer (has comment of 'Will explain at a later date').

If you don't use the 010 editor then the pointer address (start of the pointers) can be found at 0x84 in almost all of SH5's GR2 files.

I recommend using the 1X1_version01.GR2 file located in \data\Library\Patch_1x1 for investigating/mapping out the GR2 format. It's a 'simple' GR2 file to read. If you use that file then the start of the pointers is at 0x2EC0.

I was updating the GR2 template file for 010 editor with this information but it became too complicated to do. Even if I were to successfully update the template file I would have to turn around and take that 'code' and recode it for C#. In the end it was easier to just write everything in C#.

tonschk
10-11-11, 06:59 AM
TheDarkWraith :rock:

Privateer :rock:

Subsim community :rock:

Great.

:sunny:


:DL:salute::yeah::rock::up:

Anvart
10-11-11, 11:32 AM
...
~95% of the pointers are located at the end of the file.

Those pointers have the following configuration...
first 4 bytes: offset in section (from start of section). This usually points to a value, a place for a pointer to go, or start of something (bone, model, skeleton, etc.)
second 4 bytes: seems to be some kind of description/identifier/accessor. Usually this value is 0x0. Have seen it be 0x6 but don't know what that value means
third 4 bytes: offset in section (from start of section). This usually points to text (Strings). Can point to start of something (bone, model, skeleton, etc.)
...
:O:
You did not write anything new ...
Where full template of parsing? :hmmm:
...
I agree, it's easier at once to write code in C ... C#...
but the template will help to other modders (programmers) to write better code... may be... :03:

TheDarkWraith
10-11-11, 01:06 PM
Where full template of parsing? :hmmm:
...
I agree, it's easier at once to write code in C ... C#...
but the template will help to other modders (programmers) to write better code... may be... :03:

I fully agree with a full template helping other modders. The problem is you can't exactly write a full template due to the way the pointers work. You can't define the materials section until you know what all the pointers for the materials are doing. This is because some materials can have textures, no textures, or reference another material. I ran into this block when updating the template trying to define the materials. I couldn't write a 'template' for them that worked because I needed to know what the pointers for them did :x I had a template for the materials section that worked on one file but when tried on another file was totally hosed. Reason is due to not knowing what the pointers for that section said.

There is another problem with writing a full template and that deals with the art tool info section. All the names listed in the art tool info section is not the full list of names. Duplicate names are not put into this list BUT the pointers for the art tool info section will reveal that multiple names are being used. Hard to write a template for that.

These GR2 files are dynamic in nature, they are not static like .dat files. One can write a parser that reads a .dat file from start to finish very easily. This is not so with the GR2 files. There is a defined structure (that is dynamic in nature from file to file) in the GR2 file.

Anvart
10-11-11, 03:51 PM
...
The problem is you can't exactly write a full template due to the way the pointers work. You can't define the materials section until you know what all the pointers for the materials are doing. This is because some materials can have textures, no textures, or reference another material. I ran into this block when updating the template trying to define the materials. I couldn't write a 'template' for them that worked because I needed to know what the pointers for them did :x I had a template for the materials section that worked on one file but when tried on another file was totally hosed. Reason is due to not knowing what the pointers for that section said.
Yes, your template that I have seen will work correctly only with one file... may be, and then only partially.
You did not use all the features of scripting language of 010 editor...
Yes, the scripting language of editor is limited (limited analog of C), but it's enough to write a template... i think... and you absolutely did not use commands of going over... as FSeek and so on... and you must define and use all info of file header and not only...
and, at last, you have excellent Granny Viewer! :yep:

There is another problem with writing a full template and that deals with the art tool info section. All the names listed in the art tool info section is not the full list of names. Duplicate names are not put into this list BUT the pointers for the art tool info section will reveal that multiple names are being used. Hard to write a template for that.

These GR2 files are dynamic in nature, they are not static like .dat files. One can write a parser that reads a .dat file from start to finish very easily. This is not so with the GR2 files. There is a defined structure (that is dynamic in nature from file to file) in the GR2 file.
There is nothing supernatural... Did you write program in C? Yes... therefore, all as always... i think.
:salute:
Good luck.

Madox58
10-11-11, 07:47 PM
will work correctly only with one file... may be,

And there's 1794 GR2 files in SH5 with no Mods installed.

http://i108.photobucket.com/albums/n12/privateer_2006/GR2%20Stuff/GR2-Finder.jpg

TheDarkWraith
10-11-11, 11:58 PM
This will let you see what I'm doing so far: http://www.gamefront.com/files/20880484/AntiGranny_SubSim_zip

This is a C# code file for my AntiGranny class. You can include it in a project of yours to use it and see what it does. You'll have to remove all my references to the GR2EditorViewer class as this source file is used in my GR2 editor/viewer app currently. The AntiGranny class currently has two functions - ReadData and WriteData. Both of those functions take a string that denotes the filepath to the GR2 file (the same string should be passed to both).

I've defined write pointer data at beginning of file so that the pointers read in will be written to a text file after you call ReadData and WriteData with the filepath of the GR2 file.

After the call to WriteData it will write a GR2 file composed of the info it read-in from the GR2 file specified. This GR2 file (and the pointer data text files) can be found in \app path\GR2Testing.

I'm looking for patterns currently in the pointers and some can be seen. There is some form of pointer that defines a new section. I'm also trying to understand what all the pointers do (some you'll see are just plain pointers and some are pointers to data). Of course how I've defined what a style of pointer is could be entirely wrong. I'm just looking for patterns/associations currently to understand the file structure.

You'll notice that some arttool info data is not written into the new GR2 file (DocumentContents, Headers, etc.). This is because I'm not sure how those ever get read in. There was no pointer to that data in the first section's pointers. There was one pointer to the start of that data and that pointer reads in 3D Studio MAX. How it reads the data after that I haven't a clue.

Hopefully this will spur more interest and maybe somebody will see something I'm totally overlooking/missing :yep:

Let's see if we can get some open source type thing going on here :yeah:

There is some good info in that source file. I've figured out more of what's in the info header and in the sections header at the beginning of the GR2 files.

And yes I know the code file does not use properties for variable access and that one shouldn't pass every parameter to functions as references (ref) and so on and so forth. This was put together for information gathering/testing purposes and is in no way a final draft.

Anvart
10-12-11, 04:58 AM
...
Hopefully this will spur more interest and maybe somebody will see something I'm totally overlooking/missing :yep:
...
Unfortunately someone else's code (in classical form) does not stimulate any interest ... every "goes mad" by own way... by interesting may be only program tricks, who solve non-standard situations rationally.

Thanks in any case. :up:

Madox58
10-12-11, 06:52 AM
I really should learn C# someday but C and C++ is good enuff for me right now.

Here's some info I figured out working on the Quick GR2 Finder for another Game.

typedef struct { // Sectionsinfo
UINT Not_Sure<comment="Always seems to be zero">;

This is what it should be:

typedef struct { // Sectionsinfo
UINT FileSectionFormat<comment="0 = no compression 1 = Oodle0 compression (No longer used by RAD Game Tools but may be found in older files) 2 = Oodle1 compression">;

The Granny Change Log is full of useful information for filling in the Unknowns.

SH5 does not use compression that I have found.
But I've not checked all 1700+ files so I won't swear to that!

I may add this check to the GR2 Finder as an option at some point.
:hmmm:

There was something else I figured out looking at those other GR2 files but I forget what it was right now.

TheDarkWraith
10-12-11, 09:48 AM
I really should learn C# someday but C and C++ is good enuff for me right now.

C# is like C in many ways. You'll be able to read a C# source file quite easily.

In the template's section header there's an unknown we had marked where the value is always 0x4. This 0x4 is an alignment value. It specifies the alignment of the file. Being 0x4 then everything is aligned to 4 byte boundaries. You see this in the text embedded in the file. I could never figure out why some text had 1,2, or 3 null characters (0x0) after them until I figured this alignment value out. Now it makes perfect sense :yep:

Here are some excerpts from that C# code file dealing with some unknowns we had defined in the info header and section headers (the comments denote what I have found dealing with SH5 GR2 files):

// are comments in C#

here is the file header:
internalByte[] magicstring;
internalint fileliststartoffset; // from start of file
internalint unknown1;
internalint unknown2;
internalint unknown3;

here is the info header (not sure if rootobjecttype is correct in it's definition but the rootobjectoffset is correct):
internalint fileformatrevision;
internalint filesizeinbytes;
internalint crcvalue;
internalint bytesfromoffsettostartofsections; // from offset
internalint numberofsections;
internalint rootobjecttype; // defines which section root object is in ?
internalint rootobjectoffset; // defines offset from start of section above where root object is located ?
internalint unknown1;
internalint unknown2;
internaluint tag;
internalint[] unknown3; // 8 (bytes) of them

Here are the sections (compressed size and uncompressed size may not be in correct order - haven't found any SH5 GR2 files that are compressed):
internalint unknown; // always 0
internalint sectionfileoffset; // from start of file
internalint compressedsize; // compressed size and uncompressed size must be equal
internalint uncompressedsize; // compressed size and uncompressed size must be equal
internalint alignment; // usually alignment is 4 (everything aligned on 4 byte boundaries)
internalint startofdatafileoffset; // offset + sectionfileoffset = location
internalint startofdatafileoffset2; // offset + sectionfileoffset = location
internalint pointersfileoffset; // from start of file
internalint numberofpointers;
internalint pointertounknown; // usually points to end of file
internalint unknown2; // always 0

so in my sections where does this FileSectionFormat fall (is it unknown or unknown2) :06:

So far 6 people have downloaded the source file....no one has any comments/suggestions/ideas?

Anvart
10-12-11, 10:59 AM
I think no need to write about known things here.
... better to write personal messages...
Your "fantasy" look pretty funny...
Here we have to publish ready-made solutions - templates... i think.
:woot:

@privateer... you are right... but name must be more shortly.
e.g.:
enum Format : int
{NoCompression = 0, Oodle1Compression = 2};
... The names of the parent objects are complementing this short name.
...
@ TDW... your verbosity is tedious and poorly translated.

TheDarkWraith
10-12-11, 11:53 AM
I think no need to write about known things here.
... better to write personal messages...
Your "fantasy" look pretty funny...
Here we have to publish ready-made solutions - templates... i think.
:woot:

@privateer... you are right... but name must be more shortly.
@ TDW... you ignore a lot of important information..?
...
Guys, you're marking time...

What fantasy? You call it fantasy to try and understand something. Please Anvart not even you know the GR2 format. I'm showing what I'm doing in trying to understand the GR2 format. Maybe others will benefit from it.

What known things are you talking about? You don't want to share information with everyone? The sharing of any information regarding the GR2 format will only benefit everyone.

And what important information am I ignoring?

Found a little interesting discovery:

The first pointer in a GR2 file points to the first string in the embedded strings (which is usually 3D Studio MAX in SH5 GR2 files). I never found out how it reads the additional strings after that up to 'General'. But I think I found out how: the second pointer is an unknown of 0x6 and has an offsetinsectiondata of 0xA0. 0xA0 is 160 decimal. 160 decimal / 8 bytes = 20 and 20 is the exact amount of additional strings that need to be read in. Coincidence? Maybe but don't think so. Works on all SH5 GR2 files I've tried so far.

With that piece solved I can now dynamically write out the strings in the GR2 file (allowing user to change the strings read in).

TheDarkWraith
10-12-11, 02:07 PM
ran into a little trip up.....was writing the embedded strings into the new GR2 file dynamically (vice from pointer info read in to allow user to change the strings read in) and ran into problem of when multiple strings are being referenced by one string. I was just blindly writing the embedded strings into the file from the pointer data but since changing to this dynamic nature it has exposed a problem. The problem is starting with pointer 62 and on from section 0 pointers the pointers aren't 'writing' embedded strings - they are attaching embedded string info to pointer locations in the file.....:hmmm:

TheDarkWraith
10-12-11, 03:03 PM
fixed the problem. Needed to define a new pointer type that dealt with string references :up:

A new version of the C# AntiGranny code file can be found at post #1 :yeah:

tonschk
10-12-11, 03:06 PM
fixed the problem. Needed to define a new pointer type that dealt with string references :up:

A new version of the C# AntiGranny code file can be found at post #1 :yeah:

:DL :woot: Amazing :salute: :D :sunny: TheDarkWraith :yeah::rock: :up:

TheDarkWraith
10-12-11, 03:12 PM
:DL :woot: Amazing :salute: :D :sunny: TheDarkWraith :yeah::rock: :up:

It's not close to anything near amazing. I'm struggling trying to figure this beast out....but god do I love a challenge :yeah:

The art tool section (with it's embedded strings) seems to be the hardest part of this beast to tackle so far. I'm halfway through the art tool section now :DL

As I'm writing it now it will be able to create new GR2 files from scratch. If I can write a new GR2 file from scratch then editing existing ones should be a walk in the park. When I say from scratch I mean you feed it a dat file and it creates a GR2 file from it.

Look over my AntiGranny code file. Make changes to it, experiment with it. The only way to figure something out is to take it apart, make some assumptions, and test....

Rongel
10-12-11, 03:53 PM
When I say from scratch I mean you feed it a dat file and it creates a GR2 file from it.Aargh! I don't understand much of this but that sounds just about perfect concerning the imported ships! :D

TheDarkWraith
10-12-11, 04:04 PM
Aargh! I don't understand much of this but that sounds just about perfect concerning the imported ships! :D

it's still a long way from being able to do that :yep:

Walked away from the computer and sat down to watch a movie and it hit me that there was an error in my code for the dynamic writing. Had to fix it :DL New version of the code file at post #1

tonschk
10-12-11, 04:19 PM
:DL New version of the code file at post #1

:DL Good News :woot: Thank you :yeah: :DL TheDarkWraith :sunny: :salute:

TheDarkWraith
10-12-11, 10:14 PM
found another error in the dynamic writing. This error was causing some pointer values to not be written correctly.

Updated the pointer writing so that when a pointer of type str is written it will automatically update all pointers that reference it (type str_reference) so that they point to right location in file.

updated version at post #1

TheDarkWraith
10-13-11, 07:34 PM
fixed some problems with the dynamic writing. Now it should be working perfectly on any SH5 GR2 file (I had tried it on the King George V and saw that it didn't work correctly).

This new version will now read the extended data strings from the GR2 file. If the extended data is userdefinedproperties:maxproperties it will also read in the values for those strings.

For kicks comment out the pointer_extended_data directive and then look at the resultant GR2 file made (you'll see gaps in the embedded strings - this is where the extended data resides). Try this with the King George V.

Just for a little fun there is a new directive change_exporter_version that will change the exporter revision number when viewed with GrannyViewer.

Using the source code as is without modification will write complete GR2 files that you can open with GrannyViewer to ensure they aren't 'broken' by the app writing the new file. How this works is the entire file is written as read and then the code writes over what it has read. This ensures the code is writing the new GR2 file correctly (by using GrannyViewer or Goblin).

The pointer data text files now also show the extended data strings (and data for them if userdefinedproperties:maxproperties)


New version available at post #1

TheDarkWraith
10-13-11, 11:00 PM
Sat down and really started looking at these pointers and what they were doing. Here's what I've come up with so far (and now I see why I was having so much trouble with the template for the materials :shifty:)

- The first 26 pointers are always the same except for:
pointer 10. This pointer points to start of art tool info data.
pointer to number of elements, number of elements value
4 bytes unknown
pointer to general, general value
pointer to mesh totals, mesh totals value
pointer to external dependencies, external dependencies value
pointer to scene totals, scene totals value
pointer to external dependencies, external dependencies value
pointer to objects, objects value
pointer to materials, materials value
pointer to used plug-ins, used plug-ins value
pointer to render data, render data value
- now if you take number of elements * 4 you'll end up at next chunk of data (skips all the elements pointers). Coincidentally this offset is the same offset given by first pointer after exporter info pointer
- the 4 pointers before the exporter info pointer are always the same
- first of the 4 pointers associates elements pointer to where the element pointers are located in file
- second of the 4 pointers associates document contents pointer with header pointer
- third of the 4 pointers associates extended data pointer with document contents pointer
- the last of the 4 pointers associates section start with art tool info
from art tool name pointer
art tool major revision
art tool minor revision
art tool pointer size
units per meter
origin (Vector 3)
right vector (Vector 3)
up vector (Vector 3)
back vector (Vector 3)
(if you skip 4 more bytes you're at the third of the 4 pointers)
- First pointer after the pointer that reads the Exporter info points to the location in file where the actual version info resides. You need to read 4 bytes (usually 0x0) first then you get the version info
- Next pointer after the pointer that reads the Exporter info points to the location in the file where the from art tool name is found
- if the GR2 file has textures then those pointers come next:
- next pointer points to location where pointer is stored for location of the textures in the file
this location where the textures are located:
take 4 * number of textures and those are the bytes to skip to get to first texture (those skipped bytes are pointers to those textures)
from filename
texture type
width
height
encoding
subformat
bytes per pixel
layout.shift for component (4 X 4 bytes)
layout.bits for component (4 X 4 bytes)
pointer to images
pointer to extended data
8 bytes uknown
- below repeats for number of textures:
next pointer points to the texture name in the embedded string
next pointer points to start of texture data in file
- next pointer marks the end of the textures and start of the materials
(there will be number of materials * 4 bytes before the first material - these bytes skipped are the pointers to each material)
now you can have a material with no texture, material with texture, etc. so next is:


Material with texture and no maps pointer:
next pointer points to first material
next pointer points to the texture the material uses
next pointer points to the something in the elements (mtl.dlt)
next pointer points to the bitmap string
next pointer points to the filename string
next pointer points to the typename string
next pointer points to the pointer for this materials extended data (with value of where extended data starts)
next pointer points to place in materials where pointer to this material resides (and places pointer to the material there)


- Material breakdowns:

Material with texture and no maps:
2 X 4 bytes unknown
pointer to material name in embedded strings
number of maps
pointer to texture
pointer to extended data
Clip U offset
Clip V offset
Clip U Width
Clip V Width
Jitter placement
UseJitter
Apply
CropPlace
filtering
MonoOutput
rgbOutput
AlphaSource
PreMultAlpha
pointer to bitmap string
pointer to filename string
StartTime
PlayBackRate
EndCondition
TieTimetoMatIDs
pointer to typename string
3X3 Matrix UVW transform
Vector3 UVW offset
UVW tiling
UVW Source
UVW Channel
Blur
BlurOffset
NoiseAmount
NoiseSize
NoiseLevel
NoisePhase
HideMapBack
UseRealWorldScale

TheDarkWraith
10-14-11, 07:29 PM
had lots of time today to work on this. Took a really long, hard look at the pointer data. Man it answered many questions I had....the saying goes 'the proof is in the pudding' except for this it's 'the proof is in the pointers'.

In order to do this hard, long look at the pointers I had to make a GR2 dumper to dump it. I've got it reading everything to just before it starts checking for textures:

The results generated are dynamic based on what it reads from the pointers. You just have to define some things about the pointers (already done in app code) then it's autonomous.

The 0xx (0xx) is offset in section (offset in file). If this format isn't shown then it's the offset in file shown.

Results from NBB_King_GeorgeV.gr2:

Current position in file is 0x0
Reading file header data starting at 0x0
Magic string=)ÞlÀº¤S+%õ·¥öfâî 0x10
File list start offset (from file beginning)=0x1C8 0x14 where the file list header starts
Unknown1=0x0 0x18
Unknown2=0x0 0x1C
Unknown3=0x0 0x20
Current position in file is 0x20

Reading info header data starting at 0x20
File format revision=0x7 0x24
File size in bytes=6763168 0x28
CRC value=0xD62ADCA2 0x2C
Bytes from offset to start of sections=0x48 0x30 bytes from start of this to first section
Number of sections=8 0x34
Root object type (?)=0x6 0x38
Root object offset (?)=0x3620 0x3C
Unknown1=0x0 0x40
Unknown2=0x0 0x44
Tag=0x80000032 0x48
Current position in file is 0x68

Reading section 0 (arttoolinfo) data starting at 0x68
Unknown=0x0 0x6C always 0x0
Section file offset=0x1C8 0x70 where this section starts in the file
Compressed size=101048 0x74 compressed size and uncompressed sizes should equal for SH5 GR2s
Uncompressed size=101048 0x78 compressed size and uncompressed sizes should equal for SH5 GR2s
Alignment=0x4 0x7C what the alignment boundary is in the file
Start of data fileoffset=0x14898 0x80 start of embedded strings
Start of data fileoffset2=0x14898 0x84 start of embedded strings
Pointers file offset=0x66ACE4 0x88 where the pointers for this section are located
Number of pointers=2229 0x8C
Pointer to unknown=0x6732A0 0x90
Unknown2=0x0 0x94
Current position in file is 0x94

Reading section 1 (unknown1) data starting at 0x94
Unknown=0x0 0x98 always 0x0
Section file offset=0x18C80 0x9C where this section starts in the file
Compressed size=5930432 0xA0 compressed size and uncompressed sizes should equal for SH5 GR2s
Uncompressed size=5930432 0xA4 compressed size and uncompressed sizes should equal for SH5 GR2s
Alignment=0x4 0xA8 what the alignment boundary is in the file
Start of data fileoffset=0x5A7DC0 0xAC start of embedded strings
Start of data fileoffset2=0x5A7DC0 0xB0 start of embedded strings
Pointers file offset=0x671560 0xB4 where the pointers for this section are located
Number of pointers=0 0xB8
Pointer to unknown=0x6732A0 0xBC
Unknown2=0x0 0xC0
Current position in file is 0xC0

Reading section 2 (unknown2) data starting at 0xC0
Unknown=0x0 0xC4 always 0x0
Section file offset=0x5C0A40 0xC8 where this section starts in the file
Compressed size=677508 0xCC compressed size and uncompressed sizes should equal for SH5 GR2s
Uncompressed size=677508 0xD0 compressed size and uncompressed sizes should equal for SH5 GR2s
Alignment=0x4 0xD4 what the alignment boundary is in the file
Start of data fileoffset=0xA5684 0xD8 start of embedded strings
Start of data fileoffset2=0xA5684 0xDC start of embedded strings
Pointers file offset=0x671560 0xE0 where the pointers for this section are located
Number of pointers=0 0xE4
Pointer to unknown=0x6732A0 0xE8
Unknown2=0x0 0xEC
Current position in file is 0xEC

Reading section 3 (unknown3) data starting at 0xEC
Unknown=0x0 0xF0 always 0x0
Section file offset=0x6660C4 0xF4 where this section starts in the file
Compressed size=0 0xF8 compressed size and uncompressed sizes should equal for SH5 GR2s
Uncompressed size=0 0xFC compressed size and uncompressed sizes should equal for SH5 GR2s
Alignment=0x4 0x100 what the alignment boundary is in the file
Start of data fileoffset=0x0 0x104 start of embedded strings
Start of data fileoffset2=0x0 0x108 start of embedded strings
Pointers file offset=0x671560 0x10C where the pointers for this section are located
Number of pointers=0 0x110
Pointer to unknown=0x6732A0 0x114
Unknown2=0x0 0x118
Current position in file is 0x118

Reading section 4 (unknown4) data starting at 0x118
Unknown=0x0 0x11C always 0x0
Section file offset=0x6660C4 0x120 where this section starts in the file
Compressed size=0 0x124 compressed size and uncompressed sizes should equal for SH5 GR2s
Uncompressed size=0 0x128 compressed size and uncompressed sizes should equal for SH5 GR2s
Alignment=0x4 0x12C what the alignment boundary is in the file
Start of data fileoffset=0x0 0x130 start of embedded strings
Start of data fileoffset2=0x0 0x134 start of embedded strings
Pointers file offset=0x671560 0x138 where the pointers for this section are located
Number of pointers=0 0x13C
Pointer to unknown=0x6732A0 0x140
Unknown2=0x0 0x144
Current position in file is 0x144

Reading section 5 (unknown5) data starting at 0x144
Unknown=0x0 0x148 always 0x0
Section file offset=0x6660C4 0x14C where this section starts in the file
Compressed size=0 0x150 compressed size and uncompressed sizes should equal for SH5 GR2s
Uncompressed size=0 0x154 compressed size and uncompressed sizes should equal for SH5 GR2s
Alignment=0x4 0x158 what the alignment boundary is in the file
Start of data fileoffset=0x0 0x15C start of embedded strings
Start of data fileoffset2=0x0 0x160 start of embedded strings
Pointers file offset=0x671560 0x164 where the pointers for this section are located
Number of pointers=0 0x168
Pointer to unknown=0x6732A0 0x16C
Unknown2=0x0 0x170
Current position in file is 0x170

Reading section 6 (unknown6) data starting at 0x170
Unknown=0x0 0x174 always 0x0
Section file offset=0x6660C4 0x178 where this section starts in the file
Compressed size=19488 0x17C compressed size and uncompressed sizes should equal for SH5 GR2s
Uncompressed size=19488 0x180 compressed size and uncompressed sizes should equal for SH5 GR2s
Alignment=0x4 0x184 what the alignment boundary is in the file
Start of data fileoffset=0x4C20 0x188 start of embedded strings
Start of data fileoffset2=0x4C20 0x18C start of embedded strings
Pointers file offset=0x671560 0x190 where the pointers for this section are located
Number of pointers=624 0x194
Pointer to unknown=0x6732A0 0x198
Unknown2=0x0 0x19C
Current position in file is 0x19C

Reading section 7 (unknown7) data starting at 0x19C
Unknown=0x0 0x1A0 always 0x0
Section file offset=0x66ACE4 0x1A4 where this section starts in the file
Compressed size=0 0x1A8 compressed size and uncompressed sizes should equal for SH5 GR2s
Uncompressed size=0 0x1AC compressed size and uncompressed sizes should equal for SH5 GR2s
Alignment=0x4 0x1B0 what the alignment boundary is in the file
Start of data fileoffset=0x0 0x1B4 start of embedded strings
Start of data fileoffset2=0x0 0x1B8 start of embedded strings
Pointers file offset=0x6732A0 0x1BC where the pointers for this section are located
Number of pointers=0 0x1C0
Pointer to unknown=0x6732A0 0x1C4
Unknown2=0x0 0x1C8
Current position in file is 0x1C8

File info offset at 0x8 (0x1D0)
Number of textures=8 0xC (0x1D4)
Number of materials=17 0x14 (0x1DC)
Number of skeletons=1 0x1C (0x1E4)
Number of vertex datas=47 0x24 (0x1EC)
Number of tritopologies=47 0x2C (0x1F4)
Number of meshes=47 0x34 (0x1FC)
Number of models=1 0x3C (0x204)
Number of trackgroups=0 0x44 (0x20C)
Number of animations=0 0x4C (0x214)
Number of unknown=0 0x54 (0x21C)
Current position in file is 0x220
Pointer 0 is type str with offsetinsectiondata of 0x5C (0x224) and unknown of 0x0 and offsetinsectionvalue of 0x14898 (0x14A60)
Pointer 0 updates the pointer to ArtToolInfo:FromArtTooFromName with pointer to embedded string for it

ArtToolInfo offset is 0x58 (0x220)
FromArtToolName=3D Studio MAX 0x5C (0x224) embedded string from 0x14898 (0x14A60)
ArtToolMajorRevision=10 0x60 (0x228)
ArtToolMinorRevision=0 0x64 (0x22C)
ArtToolPointerSize=0 0x68 (0x230)
UnitsPerMeter=0.100000 0x6C (0x234)
Origin=0.000000 0.000000 0.000000 0x70 (0x238)
RightVector=1.000000 0.000000 0.000000 0x7C (0x244)
UpVector=0.000000 1.000000 0.000000 0x88 (0x250)
BackVector=0.000000 0.000000 -1.000000 0x94 (0x25C)
Current position in file is 0x268
Pointer 1 is type pointer with offsetinsectiondata of 0xA0 (0x268) and unknown of 0x6 and offsetinsectionvalue of 0x0 (0x1C8)
Pointer 1 always points to ArtToolInfo:? pointer
Based on this pointer then:
ArtToolInfo:ExtendedData pointer is at 0xA4 (0x26C)
ArtToolInfo:ExtendedData::DocumentContents pointer is at 0xA8 (0x270)
ArtToolInfo:ExtendedData::DocumentContents:Headers pointer is at 0xAC (0x274)
ArtToolInfo:ExtendedData::DocumentContents:Element s number of elements is at 0xB0 (0x278)
ArtToolInfo:ExtendedData::DocumentContents:Element s pointer is at 0xB4 (0x27C)
ArtToolInfo:ExtendedData::DocumentContents:Headers data file offset=0xB8 (0x280)
Current position in file is 0x27C

These additional strings don't have pointers associated with them and are for the ArtToolInfo in GrannyViewer (0x14A70)
Additional string 0 is DocumentContents 0x148A8 (0x14A70)
Additional string 1 is Headers 0x148BC (0x14A84)
Additional string 2 is 0 0x148C4 (0x14A8C)
Additional string 3 is 1 0x148C8 (0x14A90)
Additional string 4 is 2 0x148CC (0x14A94)
Additional string 5 is 3 0x148D0 (0x14A98)
Additional string 6 is 4 0x148D4 (0x14A9C)
Additional string 7 is 5 0x148D8 (0x14AA0)
Additional string 8 is 6 0x148DC (0x14AA4)
Additional string 9 is 7 0x148E0 (0x14AA8)
Additional string 10 is 8 0x148E4 (0x14AAC)
Additional string 11 is 9 0x148E8 (0x14AB0)
Additional string 12 is 10 0x148EC (0x14AB4)
Additional string 13 is 11 0x148F0 (0x14AB8)
Additional string 14 is 12 0x148F4 (0x14ABC)
Additional string 15 is 13 0x148F8 (0x14AC0)
Additional string 16 is 14 0x148FC (0x14AC4)
Additional string 17 is 15 0x14900 (0x14AC8)
Additional string 18 is Elements 0x14904 (0x14ACC)
Additional string 19 is Value 0x14910 (0x14AD8)
Current position in file is 0x27C

The following strings are for the ArtToolInfo:ExtendedData::DocumentContents:Headers in GrannyViewer
Their file layout is pointer (4 bytes) then data (4 bytes)
Pointer 2 is type str with offsetinsectiondata of 0xB8 (0x280) and unknown of 0x0 and offsetinsectionvalue of 0x14918 (0x14AE0)
General=3 0xB8 (0x280)
Pointer 3 is type str with offsetinsectiondata of 0xC0 (0x288) and unknown of 0x0 and offsetinsectionvalue of 0x14920 (0x14AE8)
Mesh Totals=2 0xC0 (0x288)
Pointer 4 is type str with offsetinsectiondata of 0xC8 (0x290) and unknown of 0x0 and offsetinsectionvalue of 0x1492C (0x14AF4)
Scene Totals=7 0xC8 (0x290)
Pointer 5 is type str with offsetinsectiondata of 0xD0 (0x298) and unknown of 0x0 and offsetinsectionvalue of 0x1493C (0x14B04)
External Dependencies=13 0xD0 (0x298)
Pointer 6 is type str with offsetinsectiondata of 0xD8 (0x2A0) and unknown of 0x0 and offsetinsectionvalue of 0x14954 (0x14B1C)
Objects=97 0xD8 (0x2A0)
Pointer 7 is type str with offsetinsectiondata of 0xE0 (0x2A8) and unknown of 0x0 and offsetinsectionvalue of 0x1495C (0x14B24)
Materials=5 0xE0 (0x2A8)
Pointer 8 is type str with offsetinsectiondata of 0xE8 (0x2B0) and unknown of 0x0 and offsetinsectionvalue of 0x14968 (0x14B30)
Used Plug-Ins=19 0xE8 (0x2B0)
Pointer 9 is type str with offsetinsectiondata of 0xF0 (0x2B8) and unknown of 0x0 and offsetinsectionvalue of 0x14978 (0x14B40)
Render Data=13 0xF0 (0x2B8)
Current position in file is 0x2C0
Pointer 10 is type pointer_data with offsetinsectiondata of 0xAC (0x274) and unknown of 0x0 and offsetinsectionvalue of 0xB8 (0x280)
Pointer 10 updates ArtToolInfo:ExtendedData:DocumentContents:Headers pointer with pointer to where it's data is

number of ArtToolInfo:ExtendedData:DocumentContents:Elements =159 0xB0 (0x278)
Current position in file is 0x27C

Current file position adjusted back to after last header value read (0x2C0)

Elements data 0xF8 (0x2C0) number to read=159:
Pointer 11 is type str with offsetinsectiondata of 0xF8 (0x2C0) and unknown of 0x0 and offsetinsectionvalue of 0x14984 (0x14B4C)
3ds Max Version: 10.0 pointer=0xF8 (0x2C0) embedded string=0x14984 (0x14B4C)
Pointer 12 is type str with offsetinsectiondata of 0xFC (0x2C4) and unknown of 0x0 and offsetinsectionvalue of 0x1499C (0x14B64)
Uncompressed pointer=0xFC (0x2C4) embedded string=0x1499C (0x14B64)
Pointer 13 is type str with offsetinsectiondata of 0x100 (0x2C8) and unknown of 0x0 and offsetinsectionvalue of 0x149AC (0x14B74)
Build: Unknown pointer=0x100 (0x2C8) embedded string=0x149AC (0x14B74)
Pointer 14 is type str with offsetinsectiondata of 0x104 (0x2CC) and unknown of 0x0 and offsetinsectionvalue of 0x149BC (0x14B84)
Vertices: 38375 pointer=0x104 (0x2CC) embedded string=0x149BC (0x14B84)
Pointer 15 is type str with offsetinsectiondata of 0x108 (0x2D0) and unknown of 0x0 and offsetinsectionvalue of 0x149CC (0x14B94)
Faces: 30015 pointer=0x108 (0x2D0) embedded string=0x149CC (0x14B94)
Pointer 16 is type str with offsetinsectiondata of 0x10C (0x2D4) and unknown of 0x0 and offsetinsectionvalue of 0x149DC (0x14BA4)
Objects: 47 pointer=0x10C (0x2D4) embedded string=0x149DC (0x14BA4)
Pointer 17 is type str with offsetinsectiondata of 0x110 (0x2D8) and unknown of 0x0 and offsetinsectionvalue of 0x149E8 (0x14BB0)
Shapes: 0 pointer=0x110 (0x2D8) embedded string=0x149E8 (0x14BB0)
Pointer 18 is type str with offsetinsectiondata of 0x114 (0x2DC) and unknown of 0x0 and offsetinsectionvalue of 0x149F4 (0x14BBC)
Lights: 0 pointer=0x114 (0x2DC) embedded string=0x149F4 (0x14BBC)
Pointer 19 is type str with offsetinsectiondata of 0x118 (0x2E0) and unknown of 0x0 and offsetinsectionvalue of 0x14A00 (0x14BC8)
Cameras: 0 pointer=0x118 (0x2E0) embedded string=0x14A00 (0x14BC8)
Pointer 20 is type str with offsetinsectiondata of 0x11C (0x2E4) and unknown of 0x0 and offsetinsectionvalue of 0x14A0C (0x14BD4)
Helpers: 50 pointer=0x11C (0x2E4) embedded string=0x14A0C (0x14BD4)
Pointer 21 is type str with offsetinsectiondata of 0x120 (0x2E8) and unknown of 0x0 and offsetinsectionvalue of 0x14A18 (0x14BE0)
Space Warps: 0 pointer=0x120 (0x2E8) embedded string=0x14A18 (0x14BE0)
Pointer 22 is type str with offsetinsectiondata of 0x124 (0x2EC) and unknown of 0x0 and offsetinsectionvalue of 0x14A28 (0x14BF0)
Total: 97 pointer=0x124 (0x2EC) embedded string=0x14A28 (0x14BF0)
Pointer 23 is type str with offsetinsectiondata of 0x128 (0x2F0) and unknown of 0x0 and offsetinsectionvalue of 0x14A34 (0x14BFC)
3ds Max 2008 pointer=0x128 (0x2F0) embedded string=0x14A34 (0x14BFC)
Pointer 24 is type str_reference with offsetinsectiondata of 0x12C (0x2F4) and unknown of 0x0 and offsetinsectionvalue of 0x14A34 (0x14BFC)
3ds Max 2008 pointer=0x12C (0x2F4) embedded string=0x14A34 (0x14BFC)
Pointer 25 is type str_reference with offsetinsectiondata of 0x130 (0x2F8) and unknown of 0x0 and offsetinsectionvalue of 0x14A34 (0x14BFC)
3ds Max 2008 pointer=0x130 (0x2F8) embedded string=0x14A34 (0x14BFC)
Pointer 26 is type str_reference with offsetinsectiondata of 0x134 (0x2FC) and unknown of 0x0 and offsetinsectionvalue of 0x14A34 (0x14BFC)
3ds Max 2008 pointer=0x134 (0x2FC) embedded string=0x14A34 (0x14BFC)
Pointer 27 is type str with offsetinsectiondata of 0x138 (0x300) and unknown of 0x0 and offsetinsectionvalue of 0x14A44 (0x14C0C)
ship_t04.dds pointer=0x138 (0x300) embedded string=0x14A44 (0x14C0C)
Pointer 28 is type str with offsetinsectiondata of 0x13C (0x304) and unknown of 0x0 and offsetinsectionvalue of 0x14A54 (0x14C1C)
NBB_King_GeorgeV_AO01.dds pointer=0x13C (0x304) embedded string=0x14A54 (0x14C1C)
Pointer 29 is type str with offsetinsectiondata of 0x140 (0x308) and unknown of 0x0 and offsetinsectionvalue of 0x14A70 (0x14C38)
ship_n04.dds pointer=0x140 (0x308) embedded string=0x14A70 (0x14C38)
Pointer 30 is type str with offsetinsectiondata of 0x144 (0x30C) and unknown of 0x0 and offsetinsectionvalue of 0x14A80 (0x14C48)
ship_hull_t03.dds pointer=0x144 (0x30C) embedded string=0x14A80 (0x14C48)
Pointer 31 is type str_reference with offsetinsectiondata of 0x148 (0x310) and unknown of 0x0 and offsetinsectionvalue of 0x14A54 (0x14C1C)
NBB_King_GeorgeV_AO01.dds pointer=0x148 (0x310) embedded string=0x14A54 (0x14C1C)
Pointer 32 is type str with offsetinsectiondata of 0x14C (0x314) and unknown of 0x0 and offsetinsectionvalue of 0x14A94 (0x14C5C)
ship_hull_n02.dds pointer=0x14C (0x314) embedded string=0x14A94 (0x14C5C)
Pointer 33 is type str with offsetinsectiondata of 0x150 (0x318) and unknown of 0x0 and offsetinsectionvalue of 0x14AA8 (0x14C70)
boats_texture.dds pointer=0x150 (0x318) embedded string=0x14AA8 (0x14C70)
Pointer 34 is type str with offsetinsectiondata of 0x154 (0x31C) and unknown of 0x0 and offsetinsectionvalue of 0x14ABC (0x14C84)
boats_ao.dds pointer=0x154 (0x31C) embedded string=0x14ABC (0x14C84)
Pointer 35 is type str with offsetinsectiondata of 0x158 (0x320) and unknown of 0x0 and offsetinsectionvalue of 0x14ACC (0x14C94)
boats_normal.dds pointer=0x158 (0x320) embedded string=0x14ACC (0x14C94)
Pointer 36 is type str with offsetinsectiondata of 0x15C (0x324) and unknown of 0x0 and offsetinsectionvalue of 0x14AE0 (0x14CA8)
NBB_King_GeorgeV pointer=0x15C (0x324) embedded string=0x14AE0 (0x14CA8)
Pointer 37 is type str with offsetinsectiondata of 0x160 (0x328) and unknown of 0x0 and offsetinsectionvalue of 0x14AF4 (0x14CBC)
NBB_King_GeorgeV_hull pointer=0x160 (0x328) embedded string=0x14AF4 (0x14CBC)
Pointer 38 is type str with offsetinsectiondata of 0x164 (0x32C) and unknown of 0x0 and offsetinsectionvalue of 0x14B0C (0x14CD4)
NBB_King_GeorgeV_mast01 pointer=0x164 (0x32C) embedded string=0x14B0C (0x14CD4)
Pointer 39 is type str with offsetinsectiondata of 0x168 (0x330) and unknown of 0x0 and offsetinsectionvalue of 0x14B24 (0x14CEC)
NBB_King_GeorgeV_cables01 pointer=0x168 (0x330) embedded string=0x14B24 (0x14CEC)
Pointer 40 is type str with offsetinsectiondata of 0x16C (0x334) and unknown of 0x0 and offsetinsectionvalue of 0x14B40 (0x14D08)
DMG_col_NBB_King_GeorgeV_mast01 pointer=0x16C (0x334) embedded string=0x14B40 (0x14D08)
Pointer 41 is type str with offsetinsectiondata of 0x170 (0x338) and unknown of 0x0 and offsetinsectionvalue of 0x14B60 (0x14D28)
Reflect_NBB_King_GeorgeV_mast01 pointer=0x170 (0x338) embedded string=0x14B60 (0x14D28)
Pointer 42 is type str with offsetinsectiondata of 0x174 (0x33C) and unknown of 0x0 and offsetinsectionvalue of 0x14B80 (0x14D48)
LNK@1x1_version01#01 pointer=0x174 (0x33C) embedded string=0x14B80 (0x14D48)
Pointer 43 is type str with offsetinsectiondata of 0x178 (0x340) and unknown of 0x0 and offsetinsectionvalue of 0x14B98 (0x14D60)
cfg#FLG_NBB_King_GeorgeV pointer=0x178 (0x340) embedded string=0x14B98 (0x14D60)
Pointer 44 is type str with offsetinsectiondata of 0x17C (0x344) and unknown of 0x0 and offsetinsectionvalue of 0x14BB4 (0x14D7C)
NBB_King_GeorgeV_funnel01 pointer=0x17C (0x344) embedded string=0x14BB4 (0x14D7C)
Pointer 45 is type str with offsetinsectiondata of 0x180 (0x348) and unknown of 0x0 and offsetinsectionvalue of 0x14BD0 (0x14D98)
DMG_col_NBB_King_GeorgeV_cos01 pointer=0x180 (0x348) embedded string=0x14BD0 (0x14D98)
Pointer 46 is type str with offsetinsectiondata of 0x184 (0x34C) and unknown of 0x0 and offsetinsectionvalue of 0x14BF0 (0x14DB8)
Reflect_NBB_King_GeorgeV_funnel01 pointer=0x184 (0x34C) embedded string=0x14BF0 (0x14DB8)
Pointer 47 is type str with offsetinsectiondata of 0x188 (0x350) and unknown of 0x0 and offsetinsectionvalue of 0x14C14 (0x14DDC)
NBB_King_GeorgeV_crane01 pointer=0x188 (0x350) embedded string=0x14C14 (0x14DDC)
Pointer 48 is type str with offsetinsectiondata of 0x18C (0x354) and unknown of 0x0 and offsetinsectionvalue of 0x14C30 (0x14DF8)
NBB_King_GeorgeV_crane02 pointer=0x18C (0x354) embedded string=0x14C30 (0x14DF8)
Pointer 49 is type str with offsetinsectiondata of 0x190 (0x358) and unknown of 0x0 and offsetinsectionvalue of 0x14C4C (0x14E14)
NBB_King_GeorgeV_funnel02 pointer=0x190 (0x358) embedded string=0x14C4C (0x14E14)
Pointer 50 is type str with offsetinsectiondata of 0x194 (0x35C) and unknown of 0x0 and offsetinsectionvalue of 0x14C68 (0x14E30)
DMG_col_NBB_King_GeorgeV_cos02 pointer=0x194 (0x35C) embedded string=0x14C68 (0x14E30)
Pointer 51 is type str with offsetinsectiondata of 0x198 (0x360) and unknown of 0x0 and offsetinsectionvalue of 0x14C88 (0x14E50)
Reflect_NBB_King_GeorgeV_funnel02 pointer=0x198 (0x360) embedded string=0x14C88 (0x14E50)
Pointer 52 is type str with offsetinsectiondata of 0x19C (0x364) and unknown of 0x0 and offsetinsectionvalue of 0x14CAC (0x14E74)
NBB_King_GeorgeV_mast02 pointer=0x19C (0x364) embedded string=0x14CAC (0x14E74)
Pointer 53 is type str with offsetinsectiondata of 0x1A0 (0x368) and unknown of 0x0 and offsetinsectionvalue of 0x14CC4 (0x14E8C)
NBB_King_GeorgeV_cables02 pointer=0x1A0 (0x368) embedded string=0x14CC4 (0x14E8C)
Pointer 54 is type str with offsetinsectiondata of 0x1A4 (0x36C) and unknown of 0x0 and offsetinsectionvalue of 0x14CE0 (0x14EA8)
DMG_col_NBB_King_GeorgeV_mast02 pointer=0x1A4 (0x36C) embedded string=0x14CE0 (0x14EA8)
Pointer 55 is type str with offsetinsectiondata of 0x1A8 (0x370) and unknown of 0x0 and offsetinsectionvalue of 0x14D00 (0x14EC8)
Reflect_NBB_King_GeorgeV_mast02 pointer=0x1A8 (0x370) embedded string=0x14D00 (0x14EC8)
Pointer 56 is type str with offsetinsectiondata of 0x1AC (0x374) and unknown of 0x0 and offsetinsectionvalue of 0x14D20 (0x14EE8)
DMG_col_NBB_King_GeorgeV_hull pointer=0x1AC (0x374) embedded string=0x14D20 (0x14EE8)
Pointer 57 is type str with offsetinsectiondata of 0x1B0 (0x378) and unknown of 0x0 and offsetinsectionvalue of 0x14D40 (0x14F08)
NBB_King_GeorgeV_elice01 pointer=0x1B0 (0x378) embedded string=0x14D40 (0x14F08)
Pointer 58 is type str with offsetinsectiondata of 0x1B4 (0x37C) and unknown of 0x0 and offsetinsectionvalue of 0x14D5C (0x14F24)
aud_propeller01_NBB_King_GeorgeV pointer=0x1B4 (0x37C) embedded string=0x14D5C (0x14F24)
Pointer 59 is type str with offsetinsectiondata of 0x1B8 (0x380) and unknown of 0x0 and offsetinsectionvalue of 0x14D80 (0x14F48)
DMG_Col_NBB_King_GeorgeV_propeller01 pointer=0x1B8 (0x380) embedded string=0x14D80 (0x14F48)
Pointer 60 is type str with offsetinsectiondata of 0x1BC (0x384) and unknown of 0x0 and offsetinsectionvalue of 0x14DA8 (0x14F70)
NBB_King_GeorgeV_elice02 pointer=0x1BC (0x384) embedded string=0x14DA8 (0x14F70)
Pointer 61 is type str with offsetinsectiondata of 0x1C0 (0x388) and unknown of 0x0 and offsetinsectionvalue of 0x14DC4 (0x14F8C)
aud_propeller02_NBB_King_GeorgeV pointer=0x1C0 (0x388) embedded string=0x14DC4 (0x14F8C)
Pointer 62 is type str with offsetinsectiondata of 0x1C4 (0x38C) and unknown of 0x0 and offsetinsectionvalue of 0x14DE8 (0x14FB0)
DMG_Col_NBB_King_GeorgeV_propeller02 pointer=0x1C4 (0x38C) embedded string=0x14DE8 (0x14FB0)
Pointer 63 is type str with offsetinsectiondata of 0x1C8 (0x390) and unknown of 0x0 and offsetinsectionvalue of 0x14E10 (0x14FD8)
NBB_King_GeorgeV_elice03 pointer=0x1C8 (0x390) embedded string=0x14E10 (0x14FD8)
Pointer 64 is type str with offsetinsectiondata of 0x1CC (0x394) and unknown of 0x0 and offsetinsectionvalue of 0x14E2C (0x14FF4)
aud_propeller03_NBB_King_GeorgeV pointer=0x1CC (0x394) embedded string=0x14E2C (0x14FF4)
Pointer 65 is type str with offsetinsectiondata of 0x1D0 (0x398) and unknown of 0x0 and offsetinsectionvalue of 0x14E50 (0x15018)
DMG_Col_NBB_King_GeorgeV_propeller03 pointer=0x1D0 (0x398) embedded string=0x14E50 (0x15018)
Pointer 66 is type str with offsetinsectiondata of 0x1D4 (0x39C) and unknown of 0x0 and offsetinsectionvalue of 0x14E78 (0x15040)
NBB_King_GeorgeV_elice04 pointer=0x1D4 (0x39C) embedded string=0x14E78 (0x15040)
Pointer 67 is type str with offsetinsectiondata of 0x1D8 (0x3A0) and unknown of 0x0 and offsetinsectionvalue of 0x14E94 (0x1505C)
aud_propeller04_NBB_King_GeorgeV pointer=0x1D8 (0x3A0) embedded string=0x14E94 (0x1505C)
Pointer 68 is type str with offsetinsectiondata of 0x1DC (0x3A4) and unknown of 0x0 and offsetinsectionvalue of 0x14EB8 (0x15080)
DMG_Col_NBB_King_GeorgeV_propeller04 pointer=0x1DC (0x3A4) embedded string=0x14EB8 (0x15080)
Pointer 69 is type str with offsetinsectiondata of 0x1E0 (0x3A8) and unknown of 0x0 and offsetinsectionvalue of 0x14EE0 (0x150A8)
NBB_King_GeorgeV_rudder pointer=0x1E0 (0x3A8) embedded string=0x14EE0 (0x150A8)
Pointer 70 is type str with offsetinsectiondata of 0x1E4 (0x3AC) and unknown of 0x0 and offsetinsectionvalue of 0x14EF8 (0x150C0)
DMG_Col_NBB_King_GeorgeV_rudder pointer=0x1E4 (0x3AC) embedded string=0x14EF8 (0x150C0)
Pointer 71 is type str with offsetinsectiondata of 0x1E8 (0x3B0) and unknown of 0x0 and offsetinsectionvalue of 0x14F18 (0x150E0)
NBB_King_GeorgeV_boat04 pointer=0x1E8 (0x3B0) embedded string=0x14F18 (0x150E0)
Pointer 72 is type str with offsetinsectiondata of 0x1EC (0x3B4) and unknown of 0x0 and offsetinsectionvalue of 0x14F30 (0x150F8)
DMG_col_NBB_King_GeorgeV_boat04 pointer=0x1EC (0x3B4) embedded string=0x14F30 (0x150F8)
Pointer 73 is type str with offsetinsectiondata of 0x1F0 (0x3B8) and unknown of 0x0 and offsetinsectionvalue of 0x14F50 (0x15118)
NBB_King_GeorgeV_boat01 pointer=0x1F0 (0x3B8) embedded string=0x14F50 (0x15118)
Pointer 74 is type str with offsetinsectiondata of 0x1F4 (0x3BC) and unknown of 0x0 and offsetinsectionvalue of 0x14F68 (0x15130)
DMG_col_NBB_King_GeorgeV_boat01 pointer=0x1F4 (0x3BC) embedded string=0x14F68 (0x15130)
Pointer 75 is type str with offsetinsectiondata of 0x1F8 (0x3C0) and unknown of 0x0 and offsetinsectionvalue of 0x14F88 (0x15150)
NBB_King_GeorgeV_boat03 pointer=0x1F8 (0x3C0) embedded string=0x14F88 (0x15150)
Pointer 76 is type str with offsetinsectiondata of 0x1FC (0x3C4) and unknown of 0x0 and offsetinsectionvalue of 0x14FA0 (0x15168)
DMG_col_NBB_King_GeorgeV_boat03 pointer=0x1FC (0x3C4) embedded string=0x14FA0 (0x15168)
Pointer 77 is type str with offsetinsectiondata of 0x200 (0x3C8) and unknown of 0x0 and offsetinsectionvalue of 0x14FC0 (0x15188)
NBB_King_GeorgeV_boat02 pointer=0x200 (0x3C8) embedded string=0x14FC0 (0x15188)
Pointer 78 is type str with offsetinsectiondata of 0x204 (0x3CC) and unknown of 0x0 and offsetinsectionvalue of 0x14FD8 (0x151A0)
DMG_col_NBB_King_GeorgeV_boat02 pointer=0x204 (0x3CC) embedded string=0x14FD8 (0x151A0)
Pointer 79 is type str with offsetinsectiondata of 0x208 (0x3D0) and unknown of 0x0 and offsetinsectionvalue of 0x14FF8 (0x151C0)
NBB_King_GeorgeV_boat05 pointer=0x208 (0x3D0) embedded string=0x14FF8 (0x151C0)
Pointer 80 is type str with offsetinsectiondata of 0x20C (0x3D4) and unknown of 0x0 and offsetinsectionvalue of 0x15010 (0x151D8)
NBB_King_GeorgeV_boat07 pointer=0x20C (0x3D4) embedded string=0x15010 (0x151D8)
Pointer 81 is type str with offsetinsectiondata of 0x210 (0x3D8) and unknown of 0x0 and offsetinsectionvalue of 0x15028 (0x151F0)
aud_propeller_NBB_King_GeorgeV pointer=0x210 (0x3D8) embedded string=0x15028 (0x151F0)
Pointer 82 is type str with offsetinsectiondata of 0x214 (0x3DC) and unknown of 0x0 and offsetinsectionvalue of 0x15048 (0x15210)
aud_fore_NBB_King_GeorgeV pointer=0x214 (0x3DC) embedded string=0x15048 (0x15210)
Pointer 83 is type str with offsetinsectiondata of 0x218 (0x3E0) and unknown of 0x0 and offsetinsectionvalue of 0x15064 (0x1522C)
aud_engine_NBB_King_GeorgeV pointer=0x218 (0x3E0) embedded string=0x15064 (0x1522C)
Pointer 84 is type str with offsetinsectiondata of 0x21C (0x3E4) and unknown of 0x0 and offsetinsectionvalue of 0x15080 (0x15248)
cfg#M01_NBB_King_GeorgeV pointer=0x21C (0x3E4) embedded string=0x15080 (0x15248)
Pointer 85 is type str with offsetinsectiondata of 0x220 (0x3E8) and unknown of 0x0 and offsetinsectionvalue of 0x1509C (0x15264)
cfg#M02_NBB_King_GeorgeV pointer=0x220 (0x3E8) embedded string=0x1509C (0x15264)
Pointer 86 is type str with offsetinsectiondata of 0x224 (0x3EC) and unknown of 0x0 and offsetinsectionvalue of 0x150B8 (0x15280)
cfg#M03_NBB_King_GeorgeV pointer=0x224 (0x3EC) embedded string=0x150B8 (0x15280)
Pointer 87 is type str with offsetinsectiondata of 0x228 (0x3F0) and unknown of 0x0 and offsetinsectionvalue of 0x150D4 (0x1529C)
cfg#S02_NBB_King_GeorgeV pointer=0x228 (0x3F0) embedded string=0x150D4 (0x1529C)
Pointer 88 is type str with offsetinsectiondata of 0x22C (0x3F4) and unknown of 0x0 and offsetinsectionvalue of 0x150F0 (0x152B8)
cfg#S03_NBB_King_GeorgeV pointer=0x22C (0x3F4) embedded string=0x150F0 (0x152B8)
Pointer 89 is type str with offsetinsectiondata of 0x230 (0x3F8) and unknown of 0x0 and offsetinsectionvalue of 0x1510C (0x152D4)
cfg#S06_NBB_King_GeorgeV pointer=0x230 (0x3F8) embedded string=0x1510C (0x152D4)
Pointer 90 is type str with offsetinsectiondata of 0x234 (0x3FC) and unknown of 0x0 and offsetinsectionvalue of 0x15128 (0x152F0)
cfg#S05_NBB_King_GeorgeV pointer=0x234 (0x3FC) embedded string=0x15128 (0x152F0)
Pointer 91 is type str with offsetinsectiondata of 0x238 (0x400) and unknown of 0x0 and offsetinsectionvalue of 0x15144 (0x1530C)
cfg#S04_NBB_King_GeorgeV pointer=0x238 (0x400) embedded string=0x15144 (0x1530C)
Pointer 92 is type str with offsetinsectiondata of 0x23C (0x404) and unknown of 0x0 and offsetinsectionvalue of 0x15160 (0x15328)
cfg#S01_NBB_King_GeorgeV pointer=0x23C (0x404) embedded string=0x15160 (0x15328)
Pointer 93 is type str with offsetinsectiondata of 0x240 (0x408) and unknown of 0x0 and offsetinsectionvalue of 0x1517C (0x15344)
cfg#A05_NBB_King_GeorgeV pointer=0x240 (0x408) embedded string=0x1517C (0x15344)
Pointer 94 is type str with offsetinsectiondata of 0x244 (0x40C) and unknown of 0x0 and offsetinsectionvalue of 0x15198 (0x15360)
cfg#A06_NBB_King_GeorgeV pointer=0x244 (0x40C) embedded string=0x15198 (0x15360)
Pointer 95 is type str with offsetinsectiondata of 0x248 (0x410) and unknown of 0x0 and offsetinsectionvalue of 0x151B4 (0x1537C)
cfg#N01_NBB_King_GeorgeV pointer=0x248 (0x410) embedded string=0x151B4 (0x1537C)
Pointer 96 is type str with offsetinsectiondata of 0x24C (0x414) and unknown of 0x0 and offsetinsectionvalue of 0x151D0 (0x15398)
cfg#H01_NBB_King_GeorgeV pointer=0x24C (0x414) embedded string=0x151D0 (0x15398)
Pointer 97 is type str with offsetinsectiondata of 0x250 (0x418) and unknown of 0x0 and offsetinsectionvalue of 0x151EC (0x153B4)
NBB_King_GeorgeV_siajB pointer=0x250 (0x418) embedded string=0x151EC (0x153B4)
Pointer 98 is type str with offsetinsectiondata of 0x254 (0x41C) and unknown of 0x0 and offsetinsectionvalue of 0x15204 (0x153CC)
NBB_King_GeorgeV_siajF pointer=0x254 (0x41C) embedded string=0x15204 (0x153CC)
Pointer 99 is type str with offsetinsectiondata of 0x258 (0x420) and unknown of 0x0 and offsetinsectionvalue of 0x1521C (0x153E4)
NBB_King_GeorgeV_ShipWake pointer=0x258 (0x420) embedded string=0x1521C (0x153E4)
Pointer 100 is type str with offsetinsectiondata of 0x25C (0x424) and unknown of 0x0 and offsetinsectionvalue of 0x15238 (0x15400)
cfg#A01_NBB_King_GeorgeV pointer=0x25C (0x424) embedded string=0x15238 (0x15400)
Pointer 101 is type str with offsetinsectiondata of 0x260 (0x428) and unknown of 0x0 and offsetinsectionvalue of 0x15254 (0x1541C)
cfg#A02_NBB_King_GeorgeV pointer=0x260 (0x428) embedded string=0x15254 (0x1541C)
Pointer 102 is type str with offsetinsectiondata of 0x264 (0x42C) and unknown of 0x0 and offsetinsectionvalue of 0x15270 (0x15438)
cfg#A04_NBB_King_GeorgeV pointer=0x264 (0x42C) embedded string=0x15270 (0x15438)
Pointer 103 is type str with offsetinsectiondata of 0x268 (0x430) and unknown of 0x0 and offsetinsectionvalue of 0x1528C (0x15454)
cfg#A03_NBB_King_GeorgeV pointer=0x268 (0x430) embedded string=0x1528C (0x15454)
Pointer 104 is type str with offsetinsectiondata of 0x26C (0x434) and unknown of 0x0 and offsetinsectionvalue of 0x152A8 (0x15470)
cfg#A07_NBB_King_GeorgeV pointer=0x26C (0x434) embedded string=0x152A8 (0x15470)
Pointer 105 is type str with offsetinsectiondata of 0x270 (0x438) and unknown of 0x0 and offsetinsectionvalue of 0x152C4 (0x1548C)
cfg#L03_NBB_King_GeorgeV pointer=0x270 (0x438) embedded string=0x152C4 (0x1548C)
Pointer 106 is type str with offsetinsectiondata of 0x274 (0x43C) and unknown of 0x0 and offsetinsectionvalue of 0x152E0 (0x154A8)
cfg#L04_NBB_King_GeorgeV pointer=0x274 (0x43C) embedded string=0x152E0 (0x154A8)
Pointer 107 is type str with offsetinsectiondata of 0x278 (0x440) and unknown of 0x0 and offsetinsectionvalue of 0x152FC (0x154C4)
cfg#C01_NBB_King_GeorgeV pointer=0x278 (0x440) embedded string=0x152FC (0x154C4)
Pointer 108 is type str with offsetinsectiondata of 0x27C (0x444) and unknown of 0x0 and offsetinsectionvalue of 0x15318 (0x154E0)
cfg#A10_NBB_King_GeorgeV pointer=0x27C (0x444) embedded string=0x15318 (0x154E0)
Pointer 109 is type str with offsetinsectiondata of 0x280 (0x448) and unknown of 0x0 and offsetinsectionvalue of 0x15334 (0x154FC)
cfg#A09_NBB_King_GeorgeV pointer=0x280 (0x448) embedded string=0x15334 (0x154FC)
Pointer 110 is type str with offsetinsectiondata of 0x284 (0x44C) and unknown of 0x0 and offsetinsectionvalue of 0x15350 (0x15518)
cfg#L05_NBB_King_GeorgeV pointer=0x284 (0x44C) embedded string=0x15350 (0x15518)
Pointer 111 is type str with offsetinsectiondata of 0x288 (0x450) and unknown of 0x0 and offsetinsectionvalue of 0x1536C (0x15534)
cfg#L06_NBB_King_GeorgeV pointer=0x288 (0x450) embedded string=0x1536C (0x15534)
Pointer 112 is type str with offsetinsectiondata of 0x28C (0x454) and unknown of 0x0 and offsetinsectionvalue of 0x15388 (0x15550)
cfg#L01_NBB_King_GeorgeV pointer=0x28C (0x454) embedded string=0x15388 (0x15550)
Pointer 113 is type str with offsetinsectiondata of 0x290 (0x458) and unknown of 0x0 and offsetinsectionvalue of 0x153A4 (0x1556C)
cfg#L02_NBB_King_GeorgeV pointer=0x290 (0x458) embedded string=0x153A4 (0x1556C)
Pointer 114 is type str with offsetinsectiondata of 0x294 (0x45C) and unknown of 0x0 and offsetinsectionvalue of 0x153C0 (0x15588)
cfg#S07_NBB_King_GeorgeV pointer=0x294 (0x45C) embedded string=0x153C0 (0x15588)
Pointer 115 is type str with offsetinsectiondata of 0x298 (0x460) and unknown of 0x0 and offsetinsectionvalue of 0x153DC (0x155A4)
cfg#S08_NBB_King_GeorgeV pointer=0x298 (0x460) embedded string=0x153DC (0x155A4)
Pointer 116 is type str with offsetinsectiondata of 0x29C (0x464) and unknown of 0x0 and offsetinsectionvalue of 0x153F8 (0x155C0)
cfg#X01_NBB_King_GeorgeV pointer=0x29C (0x464) embedded string=0x153F8 (0x155C0)
Pointer 117 is type str with offsetinsectiondata of 0x2A0 (0x468) and unknown of 0x0 and offsetinsectionvalue of 0x15414 (0x155DC)
cfg#X02_NBB_King_GeorgeV pointer=0x2A0 (0x468) embedded string=0x15414 (0x155DC)
Pointer 118 is type str with offsetinsectiondata of 0x2A4 (0x46C) and unknown of 0x0 and offsetinsectionvalue of 0x15430 (0x155F8)
cfg#A08_NBB_King_GeorgeV pointer=0x2A4 (0x46C) embedded string=0x15430 (0x155F8)
Pointer 119 is type str with offsetinsectiondata of 0x2A8 (0x470) and unknown of 0x0 and offsetinsectionvalue of 0x1544C (0x15614)
cfg#A12_NBB_King_GeorgeV pointer=0x2A8 (0x470) embedded string=0x1544C (0x15614)
Pointer 120 is type str with offsetinsectiondata of 0x2AC (0x474) and unknown of 0x0 and offsetinsectionvalue of 0x15468 (0x15630)
cfg#A13_NBB_King_GeorgeV pointer=0x2AC (0x474) embedded string=0x15468 (0x15630)
Pointer 121 is type str with offsetinsectiondata of 0x2B0 (0x478) and unknown of 0x0 and offsetinsectionvalue of 0x15484 (0x1564C)
cfg#A14_NBB_King_GeorgeV pointer=0x2B0 (0x478) embedded string=0x15484 (0x1564C)
Pointer 122 is type str with offsetinsectiondata of 0x2B4 (0x47C) and unknown of 0x0 and offsetinsectionvalue of 0x154A0 (0x15668)
cfg#A11_NBB_King_GeorgeV pointer=0x2B4 (0x47C) embedded string=0x154A0 (0x15668)
Pointer 123 is type str with offsetinsectiondata of 0x2B8 (0x480) and unknown of 0x0 and offsetinsectionvalue of 0x154BC (0x15684)
Reflect_NBB_King_GeorgeV_hull pointer=0x2B8 (0x480) embedded string=0x154BC (0x15684)
Pointer 124 is type str with offsetinsectiondata of 0x2BC (0x484) and unknown of 0x0 and offsetinsectionvalue of 0x154DC (0x156A4)
cfg#O01_NBB_King_GeorgeV pointer=0x2BC (0x484) embedded string=0x154DC (0x156A4)
Pointer 125 is type str with offsetinsectiondata of 0x2C0 (0x488) and unknown of 0x0 and offsetinsectionvalue of 0x154F8 (0x156C0)
LNK@1x10_version01#01 pointer=0x2C0 (0x488) embedded string=0x154F8 (0x156C0)
Pointer 126 is type str with offsetinsectiondata of 0x2C4 (0x48C) and unknown of 0x0 and offsetinsectionvalue of 0x15510 (0x156D8)
LNK@1x10x6_version01#01 pointer=0x2C4 (0x48C) embedded string=0x15510 (0x156D8)
Pointer 127 is type str with offsetinsectiondata of 0x2C8 (0x490) and unknown of 0x0 and offsetinsectionvalue of 0x15528 (0x156F0)
LNK@1x20_version01#01 pointer=0x2C8 (0x490) embedded string=0x15528 (0x156F0)
Pointer 128 is type str with offsetinsectiondata of 0x2CC (0x494) and unknown of 0x0 and offsetinsectionvalue of 0x15540 (0x15708)
LNK@1x50_version01#01 pointer=0x2CC (0x494) embedded string=0x15540 (0x15708)
Pointer 129 is type str with offsetinsectiondata of 0x2D0 (0x498) and unknown of 0x0 and offsetinsectionvalue of 0x15558 (0x15720)
LNK@2x2_version01#01 pointer=0x2D0 (0x498) embedded string=0x15558 (0x15720)
Pointer 130 is type str with offsetinsectiondata of 0x2D4 (0x49C) and unknown of 0x0 and offsetinsectionvalue of 0x15570 (0x15738)
LNK@1x20x10_version01#01 pointer=0x2D4 (0x49C) embedded string=0x15570 (0x15738)
Pointer 131 is type str with offsetinsectiondata of 0x2D8 (0x4A0) and unknown of 0x0 and offsetinsectionvalue of 0x1558C (0x15754)
LNK@1x10x6_version01#02 pointer=0x2D8 (0x4A0) embedded string=0x1558C (0x15754)
Pointer 132 is type str with offsetinsectiondata of 0x2DC (0x4A4) and unknown of 0x0 and offsetinsectionvalue of 0x155A4 (0x1576C)
Particle View 01 pointer=0x2DC (0x4A4) embedded string=0x155A4 (0x1576C)
Pointer 133 is type str with offsetinsectiondata of 0x2E0 (0x4A8) and unknown of 0x0 and offsetinsectionvalue of 0x155B8 (0x15780)
DMG pointer=0x2E0 (0x4A8) embedded string=0x155B8 (0x15780)
Pointer 134 is type str with offsetinsectiondata of 0x2E4 (0x4AC) and unknown of 0x0 and offsetinsectionvalue of 0x155BC (0x15784)
NCL_Bartolomeo_tex pointer=0x2E4 (0x4AC) embedded string=0x155BC (0x15784)
Pointer 135 is type str with offsetinsectiondata of 0x2E8 (0x4B0) and unknown of 0x0 and offsetinsectionvalue of 0x155D0 (0x15798)
AO pointer=0x2E8 (0x4B0) embedded string=0x155D0 (0x15798)
Pointer 136 is type str with offsetinsectiondata of 0x2EC (0x4B4) and unknown of 0x0 and offsetinsectionvalue of 0x155D4 (0x1579C)
Boats pointer=0x2EC (0x4B4) embedded string=0x155D4 (0x1579C)
Pointer 137 is type str with offsetinsectiondata of 0x2F0 (0x4B8) and unknown of 0x0 and offsetinsectionvalue of 0x155DC (0x157A4)
Standard_3 pointer=0x2F0 (0x4B8) embedded string=0x155DC (0x157A4)
Pointer 138 is type str with offsetinsectiondata of 0x2F4 (0x4BC) and unknown of 0x0 and offsetinsectionvalue of 0x155E8 (0x157B0)
CustAttribContainer.dlo pointer=0x2F4 (0x4BC) embedded string=0x155E8 (0x157B0)
Pointer 139 is type str with offsetinsectiondata of 0x2F8 (0x4C0) and unknown of 0x0 and offsetinsectionvalue of 0x15600 (0x157C8)
ViewportManager.gup pointer=0x2F8 (0x4C0) embedded string=0x15600 (0x157C8)
Pointer 140 is type str with offsetinsectiondata of 0x2FC (0x4C4) and unknown of 0x0 and offsetinsectionvalue of 0x15614 (0x157DC)
mrMaterialAttribs.gup pointer=0x2FC (0x4C4) embedded string=0x15614 (0x157DC)
Pointer 141 is type str with offsetinsectiondata of 0x300 (0x4C8) and unknown of 0x0 and offsetinsectionvalue of 0x1562C (0x157F4)
mtlgen.dlt pointer=0x300 (0x4C8) embedded string=0x1562C (0x157F4)
Pointer 142 is type str with offsetinsectiondata of 0x304 (0x4CC) and unknown of 0x0 and offsetinsectionvalue of 0x15638 (0x15800)
mtl.dlt pointer=0x304 (0x4CC) embedded string=0x15638 (0x15800)
Pointer 143 is type str with offsetinsectiondata of 0x308 (0x4D0) and unknown of 0x0 and offsetinsectionvalue of 0x15640 (0x15808)
normalrender.dlt pointer=0x308 (0x4D0) embedded string=0x15640 (0x15808)
Pointer 144 is type str with offsetinsectiondata of 0x30C (0x4D4) and unknown of 0x0 and offsetinsectionvalue of 0x15654 (0x1581C)
samplers.dlh pointer=0x30C (0x4D4) embedded string=0x15654 (0x1581C)
Pointer 145 is type str with offsetinsectiondata of 0x310 (0x4D8) and unknown of 0x0 and offsetinsectionvalue of 0x15664 (0x1582C)
ctrl.dlc pointer=0x310 (0x4D8) embedded string=0x15664 (0x1582C)
Pointer 146 is type str with offsetinsectiondata of 0x314 (0x4DC) and unknown of 0x0 and offsetinsectionvalue of 0x15670 (0x15838)
EPoly.dlo pointer=0x314 (0x4DC) embedded string=0x15670 (0x15838)
Pointer 147 is type str with offsetinsectiondata of 0x318 (0x4E0) and unknown of 0x0 and offsetinsectionvalue of 0x1567C (0x15844)
particleview.dlo pointer=0x318 (0x4E0) embedded string=0x1567C (0x15844)
Pointer 148 is type str with offsetinsectiondata of 0x31C (0x4E4) and unknown of 0x0 and offsetinsectionvalue of 0x15690 (0x15858)
kernel.dlk pointer=0x31C (0x4E4) embedded string=0x15690 (0x15858)
Pointer 149 is type str with offsetinsectiondata of 0x320 (0x4E8) and unknown of 0x0 and offsetinsectionvalue of 0x1569C (0x15864)
rend.dlr pointer=0x320 (0x4E8) embedded string=0x1569C (0x15864)
Pointer 150 is type str with offsetinsectiondata of 0x324 (0x4EC) and unknown of 0x0 and offsetinsectionvalue of 0x156A8 (0x15870)
Ac*******s.dlu pointer=0x324 (0x4EC) embedded string=0x156A8 (0x15870)
Pointer 151 is type str with offsetinsectiondata of 0x328 (0x4F0) and unknown of 0x0 and offsetinsectionvalue of 0x156B8 (0x15880)
InstanceMgr.dlu pointer=0x328 (0x4F0) embedded string=0x156B8 (0x15880)
Pointer 152 is type str with offsetinsectiondata of 0x32C (0x4F4) and unknown of 0x0 and offsetinsectionvalue of 0x156C8 (0x15890)
SceneEffectLoader.dlu pointer=0x32C (0x4F4) embedded string=0x156C8 (0x15890)
Pointer 153 is type str with offsetinsectiondata of 0x330 (0x4F8) and unknown of 0x0 and offsetinsectionvalue of 0x156E0 (0x158A8)
reactor.dlc pointer=0x330 (0x4F8) embedded string=0x156E0 (0x158A8)
Pointer 154 is type str with offsetinsectiondata of 0x334 (0x4FC) and unknown of 0x0 and offsetinsectionvalue of 0x156EC (0x158B4)
ParamEditor.gup pointer=0x334 (0x4FC) embedded string=0x156EC (0x158B4)
Pointer 155 is type str with offsetinsectiondata of 0x338 (0x500) and unknown of 0x0 and offsetinsectionvalue of 0x156FC (0x158C4)
BitmapProxies.dlu pointer=0x338 (0x500) embedded string=0x156FC (0x158C4)
Pointer 156 is type str with offsetinsectiondata of 0x33C (0x504) and unknown of 0x0 and offsetinsectionvalue of 0x15710 (0x158D8)
biped.dlc pointer=0x33C (0x504) embedded string=0x15710 (0x158D8)
Pointer 157 is type str with offsetinsectiondata of 0x340 (0x508) and unknown of 0x0 and offsetinsectionvalue of 0x1571C (0x158E4)
User Name=CRus pointer=0x340 (0x508) embedded string=0x1571C (0x158E4)
Pointer 158 is type str with offsetinsectiondata of 0x344 (0x50C) and unknown of 0x0 and offsetinsectionvalue of 0x1572C (0x158F4)
Computer Name=BUC-WKS-PR110 pointer=0x344 (0x50C) embedded string=0x1572C (0x158F4)
Pointer 159 is type str with offsetinsectiondata of 0x348 (0x510) and unknown of 0x0 and offsetinsectionvalue of 0x15748 (0x15910)
Render Width=800 pointer=0x348 (0x510) embedded string=0x15748 (0x15910)
Pointer 160 is type str with offsetinsectiondata of 0x34C (0x514) and unknown of 0x0 and offsetinsectionvalue of 0x1575C (0x15924)
Render Height=600 pointer=0x34C (0x514) embedded string=0x1575C (0x15924)
Pointer 161 is type str with offsetinsectiondata of 0x350 (0x518) and unknown of 0x0 and offsetinsectionvalue of 0x15770 (0x15938)
Render Aspect=1.00 pointer=0x350 (0x518) embedded string=0x15770 (0x15938)
Pointer 162 is type str with offsetinsectiondata of 0x354 (0x51C) and unknown of 0x0 and offsetinsectionvalue of 0x15784 (0x1594C)
Renderer ClassIDA=1 pointer=0x354 (0x51C) embedded string=0x15784 (0x1594C)
Pointer 163 is type str with offsetinsectiondata of 0x358 (0x520) and unknown of 0x0 and offsetinsectionvalue of 0x15798 (0x15960)
Renderer ClassIDB=0 pointer=0x358 (0x520) embedded string=0x15798 (0x15960)
Pointer 164 is type str with offsetinsectiondata of 0x35C (0x524) and unknown of 0x0 and offsetinsectionvalue of 0x157AC (0x15974)
Renderer Name=Default Scanline Renderer pointer=0x35C (0x524) embedded string=0x157AC (0x15974)
Pointer 165 is type str with offsetinsectiondata of 0x360 (0x528) and unknown of 0x0 and offsetinsectionvalue of 0x157D4 (0x1599C)
Animation Start=0 pointer=0x360 (0x528) embedded string=0x157D4 (0x1599C)
Pointer 166 is type str with offsetinsectiondata of 0x364 (0x52C) and unknown of 0x0 and offsetinsectionvalue of 0x157E8 (0x159B0)
Animation End=0 pointer=0x364 (0x52C) embedded string=0x157E8 (0x159B0)
Pointer 167 is type str with offsetinsectiondata of 0x368 (0x530) and unknown of 0x0 and offsetinsectionvalue of 0x157F8 (0x159C0)
Render Flags=32 pointer=0x368 (0x530) embedded string=0x157F8 (0x159C0)
Pointer 168 is type str with offsetinsectiondata of 0x36C (0x534) and unknown of 0x0 and offsetinsectionvalue of 0x15808 (0x159D0)
Scene Flags=57032 pointer=0x36C (0x534) embedded string=0x15808 (0x159D0)
Pointer 169 is type str with offsetinsectiondata of 0x370 (0x538) and unknown of 0x0 and offsetinsectionvalue of 0x1581C (0x159E4)
RenderElements=1 pointer=0x370 (0x538) embedded string=0x1581C (0x159E4)
Pointer 170 is type pointer_data with offsetinsectiondata of 0xB4 (0x27C) and unknown of 0x0 and offsetinsectionvalue of 0xF8 (0x2C0)
Pointer 170 updates ArtToolInfo:ExtendedData:DocumentContents:Elements pointer with pointer to start of element pointers in file
Current position in file is 0x53C

Pointer 171 is type pointer_data with offsetinsectiondata of 0xA8 (0x270) and unknown of 0x0 and offsetinsectionvalue of 0xAC (0x274)
Pointer 171 associates ArtToolInfo:ExtendedData:DocumentContents with ArtToolInfo:ExtendedData:DocumentContents:Headers
Current position in file is 0x53C

Pointer 172 is type pointer_data with offsetinsectiondata of 0xA4 (0x26C) and unknown of 0x0 and offsetinsectionvalue of 0xA8 (0x270)
Pointer 172 associates ArtToolInfo:ExtendedData with ArtToolInfo:ExtendedData:DocumentContents
Current position in file is 0x53C

Pointer 173 is type pointer_data with offsetinsectiondata of 0x0 (0x1C8) and unknown of 0x0 and offsetinsectionvalue of 0x5C (0x224)
Pointer 173 associates start of section 0 with ArtToolInfo:FromArtToolName pointer
Current position in file is 0x53C

Pointer 174 is type str with offsetinsectiondata of 0x374 (0x53C) and unknown of 0x0 and offsetinsectionvalue of 0x15830 (0x159F8)
Pointer 174 points to the exporter info
Exporter info section offset is 0x53C (0x704)
ExporterName=Granny Standard Exporter, SDK version 2.8.3.0 0x374 (0x53C) embedded string from 0x15830 (0x159F8)
ExporterMajorRevision=2 0x378 (0x540)
ExporterMinorRevision=8 0x37C (0x544)
ExporterCustomization=0 0x380 (0x548)
ExporterBuildNumber=3 0x384 (0x54C)
Current position in file is 0x550

TheDarkWraith
10-15-11, 12:53 PM
new version of the C# code file available at post #1

TheDarkWraith
10-16-11, 01:17 AM
Today was a good day :D After hours upon hours of looking over these pointers in the GR2 file, comparing things to GrannyViewer, and a bit of dumb luck it finally hit me :rock: It all makes perfect sense now.

The contents of this file will tell all: http://www.megaupload.com/?d=Q0F2M1ZG

I have to figure out how to read the mesh binding pointers correctly and then I'll have access to the vertex datas, meshes, and everything related to the mesh bindings. I know where the pointers are I'm just not reading the correct offsets yet. You'll see in the file.

I found the pointers to the bones extended data and I can read them now I just have to write the code for reading it's pointers (the bones extended data is a pointer to another 'place' that has data and more pointers. It's these pointers that I have to decipher now which won't be too hard).

Haven't looked at the textures or materials but they will be easy to do since it all finally clicked.

Perserverance....don't ever give up :yeah:

All this was done WITHOUT using the granny2.dll. I'm reading the file via the code I have been posting here :woot:

:|\\

Trevally.
10-16-11, 03:29 AM
great work TDW :Kaleun_Party:

lesec74
10-16-11, 06:25 AM
hello trevally and tdw,

I know anything in GR2 file, can you explain sqimply what is it?your beautiful work for all the community is perhaps one day, a new playable sub?

sorry for my english

and many,many thanks:salute::yeah:

tonschk
10-16-11, 08:15 AM
Well done :DL :sunny: TheDarkWraith :rock:

TheDarkWraith
10-16-11, 01:17 PM
Got the mesh bindings sorted out:

Model found at 0x1477C (0x14944)
Model name=NBB_King_GeorgeV
Flags=0 0x14788 (0x14950)
Origin=0.000000, 0.000000, 0.000000 0x1478C (0x14954)
Rotation (quaternion)=0.000000, 0.000000, 0.000000, 1.000000 0x14798 (0x14960)
Scale=1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 0x147A8 (0x14970)
Number of mesh bindings=47 0x147CC (0x14994)
Mesh bindings start at 0x147DC (0x149A4)
Mesh binding 0 pointer (0x146D4) found at 0x147DC (0x149A4)
Mesh binding 1 pointer (0x14468) found at 0x147E0 (0x149A8)
Mesh binding 2 pointer (0x141FC) found at 0x147E4 (0x149AC)
Mesh binding 3 pointer (0x13F90) found at 0x147E8 (0x149B0)
Mesh binding 4 pointer (0x13D24) found at 0x147EC (0x149B4)
Mesh binding 5 pointer (0x13AB8) found at 0x147F0 (0x149B8)
Mesh binding 6 pointer (0x1384C) found at 0x147F4 (0x149BC)
Mesh binding 7 pointer (0x135E0) found at 0x147F8 (0x149C0)
Mesh binding 8 pointer (0x13374) found at 0x147FC (0x149C4)
Mesh binding 9 pointer (0x13108) found at 0x14800 (0x149C8)
Mesh binding 10 pointer (0x12E9C) found at 0x14804 (0x149CC)
Mesh binding 11 pointer (0x12C30) found at 0x14808 (0x149D0)
Mesh binding 12 pointer (0x129C4) found at 0x1480C (0x149D4)
Mesh binding 13 pointer (0x12758) found at 0x14810 (0x149D8)
Mesh binding 14 pointer (0x124EC) found at 0x14814 (0x149DC)
Mesh binding 15 pointer (0x12280) found at 0x14818 (0x149E0)
Mesh binding 16 pointer (0x12014) found at 0x1481C (0x149E4)
Mesh binding 17 pointer (0x11DA8) found at 0x14820 (0x149E8)
Mesh binding 18 pointer (0x11B3C) found at 0x14824 (0x149EC)
Mesh binding 19 pointer (0x118D0) found at 0x14828 (0x149F0)
Mesh binding 20 pointer (0x11664) found at 0x1482C (0x149F4)
Mesh binding 21 pointer (0x113F8) found at 0x14830 (0x149F8)
Mesh binding 22 pointer (0x1118C) found at 0x14834 (0x149FC)
Mesh binding 23 pointer (0x10F20) found at 0x14838 (0x14A00)
Mesh binding 24 pointer (0x10CB4) found at 0x1483C (0x14A04)
Mesh binding 25 pointer (0x10A48) found at 0x14840 (0x14A08)
Mesh binding 26 pointer (0x107DC) found at 0x14844 (0x14A0C)
Mesh binding 27 pointer (0x10570) found at 0x14848 (0x14A10)
Mesh binding 28 pointer (0x10304) found at 0x1484C (0x14A14)
Mesh binding 29 pointer (0x10098) found at 0x14850 (0x14A18)
Mesh binding 30 pointer (0xFE2C) found at 0x14854 (0x14A1C)
Mesh binding 31 pointer (0xFBC0) found at 0x14858 (0x14A20)
Mesh binding 32 pointer (0xF954) found at 0x1485C (0x14A24)
Mesh binding 33 pointer (0xF6E8) found at 0x14860 (0x14A28)
Mesh binding 34 pointer (0xF47C) found at 0x14864 (0x14A2C)
Mesh binding 35 pointer (0xF210) found at 0x14868 (0x14A30)
Mesh binding 36 pointer (0xEFA4) found at 0x1486C (0x14A34)
Mesh binding 37 pointer (0xED38) found at 0x14870 (0x14A38)
Mesh binding 38 pointer (0xEACC) found at 0x14874 (0x14A3C)
Mesh binding 39 pointer (0xE85C) found at 0x14878 (0x14A40)
Mesh binding 40 pointer (0xE5F0) found at 0x1487C (0x14A44)
Mesh binding 41 pointer (0xE384) found at 0x14880 (0x14A48)
Mesh binding 42 pointer (0xE118) found at 0x14884 (0x14A4C)
Mesh binding 43 pointer (0xDEAC) found at 0x14888 (0x14A50)
Mesh binding 44 pointer (0xDC40) found at 0x1488C (0x14A54)
Mesh binding 45 pointer (0xD9D4) found at 0x14890 (0x14A58)
Mesh binding 46 pointer (0xD768) found at 0x14894 (0x14A5C)
There is no extended data associated with this model

Now I have to write classes for mesh, Primary VertexData, Primary Topology (which is a tritopology group), materials, and textures and then I can finally release my viewer/editor so that everyone can test it.

Since it uses no external dll files (granny2.dll) RAD games (aka the maker of Granny) can kiss my you know what!! :rock: There's nothing they can do :arrgh!:

I do have to say that Privateer provided the information to overcome that last stumbling block I was having with reading/deciphering the GR2 file. I needed something, just one little tiny bit of information, that told me how to read the beginning of the file. The first version of the template for 010 editor gave me that last piece of the puzzle.

Now taking this GR2 file apart for it's information is pretty easy now. Editing it's contents (like the extended data for items, changing vertex positions, changing texture coordinate positions, and the likes) can be easily done. What will be very hard to do is adding new content to the file or removing content (say verticies for example). The reason is because of the pointers. The pointers are used to 'build' an item, menu, model, etc. There is a specific way it has to be done and it will take some time to figure out all the algorithms. This is where we need people to start looking it over/figuring out the algorithms. The more people working on this the faster it will be achieved.

I do have to say that I'm a little disappointed in the fact that no-one wanted to help in my little open-source project. There were quite a few that downloaded the source code but I never heard one comment/suggestion/etc. from them. I had a few comments that I was living in a 'fantasy' and the likes but I think those that made those comments will be eating their words soon (crow tastes good doesn't it?) Consider open-source project closed now in the fact that no new source code will be released.

Kaicokid
10-16-11, 04:13 PM
Well done DW.You (and Privateer) are keeping SH alive.http://www.subsim.com/radioroom/images/icons/icon7.gif I don't know anything about computer programming or modding but I bet there are many like me, who brought SH5 SOME time back only to find the game unplayable,following your efforts with MUCH interest.Hope to return to playing SH5 in the not to distant future.Thankyou.

Echolot
10-16-11, 04:25 PM
Well done DW.You (and Privateer) are keeping SH alive.http://www.subsim.com/radioroom/images/icons/icon7.gif I don't know anything about computer programming or modding but I bet there are many like me, who brought SH5 SOME time back only to find the game unplayable,following your efforts with MUCH interest.Hope to return to playing SH5 in the not to distant future.Thankyou.

Same here. Thank you TDW and Privateer, Anvart, Pintea and all involved poeple.

Keep up the good work.

Regards.

Echol:up:t.

THE_MASK
10-16-11, 04:36 PM
Well , i find it hard to mod a text file :O:
Your efforts are appreciated .

TheDarkWraith
10-17-11, 12:24 AM
Got tripped up with these pointers to pointers for awhile. After that was sorted out I wasn't using the correct section to read the vertex data so I was pulling my hair out for hours on that one :damn: That ate most of my time thus I'll have to finish coding the mesh class later. The mesh class does read the vertex data though:

.....
Bone 10 0xB70 (0xD38)
Bone found at 0xB70 (0xD38)
Bone name=Dmg_Col_LifeBoat
Parent index=1 0xB74 (0xD3C)
Flags=3 0xB78 (0xD40)
Origin=0.000000, -0.051135, 0.000000 0xB7C (0xD44)
Rotation (quaternion)=0.000000, 1.000000, 0.000000, 0.000000 0xB88 (0xD50)
Scale=1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 0xB98 (0xD60)
Inverse world transform=1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.051135 0.000000 1.000000 0xBBC (0xD84)
LOD error=0.999214 0xBFC (0xDC4)
Extended data found!

Mesh found at 0x149C (0x1664)
Mesh name=LifeBoat_Hull 0x149C (0x1664)

PrimaryVertexData found at 0x1138 (0x1300)
Unknown=0x0 0x1138 (0x1300)
Number of verticies=2385 0x113C (0x1304)
Verticies pointer points to 0x7440 (0x7608)
Number of vertex component names=6 0x1144 (0x130C)
VertexComponentNames pointer points to 0x1154 (0x131C)
Vertex component names:
Position 0x2F68 (0x3130)
Normal 0x2F74 (0x313C)
Tangent 0x2F7C (0x3144)
Binormal 0x2F84 (0x314C)
TextureCoordinates0 0x2F90 (0x3158)
TextureCoordinates1 0x2FA4 (0x316C)

Verticies:

Vertex 0 0x7440 (0xAC88)
Position: -0.094747 0.006515 -0.195843 0x7440 (0xAC88)
Normal: 0.000000 1.000000 0.000000 0x744C (0xAC94)
Tangent: 0.000000 0.000000 1.000000 0x7458 (0xACA0)
Binormal: -1.000000 0.000000 0.000000 0x7464 (0xACAC)
TextureCoordinates0: 0.974552 0.014070 0x7470 (0xACB8)
TextureCoordinates1: 0.000000 0.000000 0x7478 (0xACC0)

Vertex 1 0x7480 (0xACC8)
Position: -0.094747 0.006515 0.195843 0x7480 (0xACC8)
Normal: 0.000000 1.000000 0.000000 0x748C (0xACD4)
Tangent: 0.000000 0.000000 1.000000 0x7498 (0xACE0)
Binormal: -1.000000 0.000000 0.000000 0x74A4 (0xACEC)
TextureCoordinates0: 0.026402 0.014070 0x74B0 (0xACF8)
TextureCoordinates1: 0.000000 0.000000 0x74B8 (0xAD00)

Vertex 2 0x74C0 (0xAD08)
Position: 0.052104 0.025124 0.153895 0x74C0 (0xAD08)
Normal: -0.972281 0.233325 0.015127 0x74CC (0xAD14)
Tangent: 0.231642 0.952429 0.198043 0x74D8 (0xAD20)
Binormal: 0.031801 0.196058 -0.980077 0x74E4 (0xAD2C)
TextureCoordinates0: 0.845590 0.547377 0x74F0 (0xAD38)
TextureCoordinates1: 0.000000 0.000000 0x74F8 (0xAD40)

Vertex 3 0x7500 (0xAD48)
Position: 0.000000 0.006515 -0.195843 0x7500 (0xAD48)
Normal: 0.000000 1.000000 0.000000 0x750C (0xAD54)
Tangent: 0.000000 0.000000 1.000000 0x7518 (0xAD60)
Binormal: -1.000000 0.000000 0.000000 0x7524 (0xAD6C)
TextureCoordinates0: 0.974552 0.243417 0x7530 (0xAD78)
TextureCoordinates1: 0.000000 0.000000 0x7538 (0xAD80)
....

this was from the CMD_smallboat.gr2 at it's more managable to use while trying to sort this crap out.

:|\\

TheDarkWraith
10-17-11, 11:30 PM
well the moment of truth arrived.....

http://www.subsim.com/radioroom/picture.php?albumid=553&pictureid=5023

Success :rock: I read and parsed the GR2 file without the granny2.dll (or any DLL for that matter) or any other outside file. Did it strictly from reading the file itself. The pointers tell you everything you need to know. I haven't coded in the materials or textures yet that's why it's wireframe only. Will work on that tomorrow :D

Also have to code in reading the extended data for everything so one can edit/view it also. That'll probably be day after tomorrow. This extended data has stuff like jitter, blur, and some other stuff that I'm curious to play around with and see what it does in game :yep:

The indicies threw me for a loop for many hours. The pointer kept telling me they started at x offset but no matter what I couldn't find them. I kept finding the wrong data. After hours of this it finally hit me that they are probably like the vertex data and located in a different section. Yep, that was the case :damn:

There seems to be many different names that can be used for texture coordinates 0 and 1. If while using the app you load a model and it says unrecognized vertex component name please make a note of it and which GR2 model you were trying to view and send that information to me please. I currently have 2 defined for each.

So section 0 contains all the arttool info, file info, bindings, extended data, and texture and map info. Section 1 contains the vertex data. Section 2 contains the indicies. Haven't figured out what the other sections do yet. Maybe with the coding of the textures, materials, and extended data they will make themselves known.

I'm going to code in some 'debugger' type things into this. Things like being able to extract all the pointers and it tell you what they are, a file manifest that will include the offset address and physical address in the file of everything loaded by pointers, and some other ideas. This way one can see the information I used to make this possible.

The granny viewer is an SDK of sorts. It tells you the file structure, it tells you the structure of items, and it even tells you the data type of the items. Using that and the pointers you can find/make anything. You'll occassionally stumble into something where you expected to be reading a pointer but you see a hard coded int value in the file. I've come across this when granny viewer shows an item with (x) where x denotes the number of them. You'll find that you read the number of the item first, then you read a pointer that points you to where the items are. The end of that pointer then will have x amount of that type in succession. There are some other little annoyances that took some time to figure out but can't think of them currently.

The app is still using the fixed-function pipeline of DirectX for rendering. I'll convert it over to programmable pipeline (aka shaders) here soon. This will allow me to use the actual shaders of SH5 to do the rendering so we can see items just like in game (or near to it).

I really can't wait to code in the animations part of this. I really want to see the keyframes of these GR2 files. Actually I'm just very curious to 'see' how they do it.

:|\\

http://www.gamefront.com/files/20899823/GR2EditorViewer_zip

Let me know if you encounter any errors using it.

How to use:

left mouse click + mousemovement rotates 3D model
right mouse click + forward/backward of mouse moves in/out on 3D model
center mouse click + mouse movement changes camera focus point

marleymen
10-18-11, 03:42 AM
Thanks TDW. I downloaded it. Great job. Today is a new step to make this game unforgetable.

edit: Ok, i saw that i need to select my sh5 folder. Will test when I reinstall SH5.

tonschk
10-18-11, 04:34 AM
Great job. Today is a new step to make this game unforgetable.



:salute: I agree :DL, :D Many Many Thanks to :yeah: :salute: TheDarkWraith :sunny: :up::rock:

Echolot
10-18-11, 05:48 AM
:up:

Thank you TDW. Great work.

Regards.

Echol:ping:t.

Obelix
10-18-11, 06:32 AM
Hi TheDarkWraith!
When I start, issuing this message:
Details of the operational
(JIT) debugging instead of this dialog
box found at the end of this message.

************** Exception Text **************
System.FormatException: Input string was not valid.
in System.Number.StringToNumber (String str, NumberStyles options, NumberBuffer & number, NumberFormatInfo info, Boolean parseDecimal)
in System.Number.ParseDecimal (String value, NumberStyles options, NumberFormatInfo numfmt)
in System.Convert.ToDecimal (String value)
in TheDarkWraith.SilentHunter5.GR2EditorViewer.SetCfg FileEntries ()
in TheDarkWraith.SilentHunter5.GR2EditorViewer.GR2Edi torViewer_Load (Object sender, EventArgs e)
in System.Windows.Forms.Form.OnLoad (EventArgs e)
in System.Windows.Forms.Form.OnCreateControl ()
in System.Windows.Forms.Control.CreateControl (Boolean fIgnoreVisible)
in System.Windows.Forms.Control.CreateControl ()
in System.Windows.Forms.Control.WmShowWindow (Message & m)
at System.Windows.Forms.Control.WndProc (Message & m)
in System.Windows.Forms.ScrollableControl.WndProc (Message & m)
in System.Windows.Forms.ContainerControl.WndProc (Message & m)
in System.Windows.Forms.Form.WmShowWindow (Message & m)
in System.Windows.Forms.Form.WndProc (Message & m)
in System.Windows.Forms.Control.ControlNativeWindow.O nMessage (Message & m)
in System.Windows.Forms.Control.ControlNativeWindow.W ndProc (Message & m)
at System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** ************** Loaded assemblies
mscorlib
Assembly Version: 2.0.0.0
Version Win32: 2.0.50727.5448 (Win7SP1GDR.050727-5400)
CodeBase: file: / / / C: / Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
GR2EditorViewer
Assembly Version: 1.0.58.0
Version Win32: 1.0.58.0
CodeBase: file: / / / D: / Gocuments/Downloads/GR2EditorViewer/GR2EditorViewer.exe
----------------------------------------
System.Windows.Forms
Assembly Version: 2.0.0.0
Version Win32: 2.0.50727.5446 (Win7SP1GDR.050727-5400)
CodeBase:
----------------------------------------
System
Assembly Version: 2.0.0.0
Version Win32: 2.0.50727.5447 (Win7SP1GDR.050727-5400)
CodeBase: file: / / / C: / Windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
Assembly Version: 2.0.0.0
Version Win32: 2.0.50727.5420 (Win7SP1.050727-5400)
CodeBase: file: / / / C: / Windows/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Configuration
Assembly Version: 2.0.0.0
Version Win32: 2.0.50727.5420 (Win7SP1.050727-5400)
CodeBase:
----------------------------------------
System.Xml
Assembly Version: 2.0.0.0
Version Win32: 2.0.50727.5420 (Win7SP1.050727-5400)
CodeBase: file: / / / C: / Windows/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
Microsoft.DirectX.Direct3D
Assembly Version: 1.0.2902.0
Version Win32: 9.05.132.0000
CodeBase:
----------------------------------------
System.Core
Assembly Version: 3.5.0.0
Version Win32: 3.5.30729.5420 built by: Win7SP1
CodeBase: file: / / / C: / Windows/assembly/GAC_MSIL/System.Core/3.5.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
Microsoft.DirectX
Assembly Version: 1.0.2902.0
Version Win32: 5.04.00.2904
CodeBase: file: / / / C: / Windows/assembly/GAC/Microsoft.DirectX/1.0.2902.0__31bf3856ad364e35/Microsoft.DirectX.dll
----------------------------------------
Microsoft.DirectX.Direct3DX
Assembly Version: 1.0.2902.0
Version Win32: 5.04.00.3900
CodeBase:
----------------------------------------
mscorlib.resources
Assembly Version: 2.0.0.0
Version Win32: 2.0.50727.5448 (Win7SP1GDR.050727-5400)
CodeBase: file: / / / C: / Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
System.Windows.Forms.resources
Assembly Version: 2.0.0.0
Version Win32: 2.0.50727.5420 (Win7SP1.050727-5400)
CodeBase:
----------------------------------------

Operational Debugging ************** (JIT) **************
To connect the RAM (JIT) debugging file. Config this
application or computer (machine.config) must have
value jitDebugging, established in section system.windows.forms.
The application must also be compiled to include
debugging.

For example:

<configuration>
<system.windows.forms jitDebugging="true" />
</ Configuration>

When JIT debugging is enabled, any unhandled exception
sent to the debugger JIT, registered on the computer,
rather than be handled by this dialog box.
When I click "Ignore" the program runs
My system:
Win7 x64 sp1
Athlon II x2 255
4gb ram ddr3 ungaged mode
GeForce GTX240 1gb

Obelix
10-18-11, 07:44 AM
Can not open any files in the folder Submarines - when I open any file returns consistently two errors:
http://www.subsim.com/radioroom/picture.php?albumid=354&pictureid=5024
http://www.subsim.com/radioroom/picture.php?albumid=354&pictureid=5025
Only open files from the Sea.
From Dbgview:
00000000 0.00000000 [4008] Silent Hunter 5 GR2 Editor/Viewer v1.0.58.0 by TheDarkWraith
00000001 0.00000000 [4008]
00000002 0.03539610 [4008] D:\Gocuments\Downloads\GR2EditorViewer\GR2EditorVi ewer.cfg exists=True
00000003 0.03539610 [4008]
00000004 0.03548258 [4008] Reading in cfg file...
00000005 0.03548258 [4008]
00000006 0.03948099 [4008] Entry found: SH5InstallPath=D:\GAMES\U-Boats
00000007 0.03948099 [4008]
00000008 0.03955992 [4008] Entry found: ShowWorldOrigin=False
00000009 0.03955992 [4008]
00000010 0.03962601 [4008] Entry found: WorldOriginSize=5
00000011 0.03962601 [4008]
00000012 0.03969014 [4008] Entry found: WorldOriginOpacity=122
00000013 0.03969014 [4008]
00000014 0.03975591 [4008] Entry found: WorldOriginColor=-16711681
00000015 0.03975591 [4008]
00000016 0.03981970 [4008] Entry found: ShowWorldOriginLabel=False
00000017 0.03981970 [4008]
00000018 0.03988449 [4008] Entry found: WorldOriginLabelSize=7.5
00000019 0.03988449 [4008]
00000020 0.03994795 [4008] Entry found: WorldOriginLabelOpacity=122
00000021 0.03994795 [4008]
00000022 0.04002556 [4008] Entry found: WorldOriginLabelColor=-16711681
00000023 0.04002556 [4008]
00000024 0.04009034 [4008] Entry found: ShowWorldOriginAxis=True
00000025 0.04009034 [4008]
00000026 0.04015381 [4008] Entry found: WorldOriginAxisOpacity=122
00000027 0.04015381 [4008]
00000028 0.04021695 [4008] Entry found: ShowBoneOrigin=True
00000029 0.04021695 [4008]
00000030 0.04033500 [4008] Entry found: BoneOriginSize=5
00000031 0.04033500 [4008]
00000032 0.04041852 [4008] Entry found: BoneOriginOpacity=185
00000033 0.04041852 [4008]
00000034 0.04043694 [4008] Entry found: BoneOriginColor=-10185235
00000035 0.04043694 [4008]
00000036 0.04050403 [4008] Entry found: ShowBoneOriginLabel=True
00000037 0.04050403 [4008]
00000038 0.04058953 [4008] Entry found: BoneOriginLabelSize=7.5
00000039 0.04058953 [4008]
00000040 0.04078387 [4008] Entry found: BoneOriginLabelOpacity=185
00000041 0.04078387 [4008]
00000042 0.04082859 [4008] Entry found: BoneOriginLabelColor=-10185235
00000043 0.04082859 [4008]
00000044 0.04089436 [4008] Entry found: ShowBoneOriginAxis=True
00000045 0.04089436 [4008]
00000046 0.04093185 [4008] Entry found: BoneOriginAxisOpacity=122
00000047 0.04093185 [4008]
00000048 0.04099828 [4008] Entry found: ShowBones=True
00000049 0.04099828 [4008]
00000050 0.04103577 [4008] Entry found: ShowBoneInterconnects=True
00000051 0.04103577 [4008]
00000052 0.04108641 [4008] Entry found: CullMode=None
00000053 0.04108641 [4008]
00000054 0.04114856 [4008] Entry found: FillMode=solid_wire_point
00000055 0.04114856 [4008]
00000056 0.04118999 [4008] Entry found: ShadeMode=Gouraud
00000057 0.04118999 [4008]
00000058 0.04124623 [4008] Entry found: PointsSize=3.5
00000059 0.04124623 [4008]
00000060 0.04129259 [4008] Entry found: PointsColor=-65281
00000061 0.04129259 [4008]
00000062 0.04134883 [4008] Entry found: PointsOpacity=50
00000063 0.04134883 [4008]
00000064 0.04139651 [4008] Entry found: WireframeColor=-128
00000065 0.04139651 [4008]
00000066 0.04145833 [4008] Entry found: WireframeOpacity=50
00000067 0.04145833 [4008]
00000068 0.04149878 [4008] Entry found: SolidColor=-3673639
00000069 0.04149878 [4008]
00000070 0.04156060 [4008] Entry found: SolidOpacity=255
00000071 0.04156060 [4008]
00000072 0.04160171 [4008] Entry found: SolidIsTexture=False
00000073 0.04160171 [4008]
00000074 0.11525483 [4008] DirectX initialized
00000075 0.11525483 [4008]
00000076 0.14511977 [4008] SH5 install path set to D:\GAMES\U-Boats
00000077 0.14511977 [4008]
00000078 24.23274994 [4008] GR2 file path is D:\GAMES\U-Boats\data\Submarine\NSS_Undine\NSS_Undine.GR2
00000079 24.23274994 [4008]
00000080 24.25082970 [4008] Current position in file is 0x0
00000081 24.25227928 [4008]
00000082 24.25227928 [4008] Reading file header data starting at 0x0
00000083 24.25253105 [4008] Magic string=)?lA?¤S+%o·?ofai 0x10
00000084 24.25257301 [4008] File list start offset (from file beginning)=0x1C8 0x14 where the file list header starts
00000085 24.25260925 [4008] Unknown1=0x0 0x18
00000086 24.25264740 [4008] Unknown2=0x0 0x1C
00000087 24.25268173 [4008] Unknown3=0x0 0x20
00000088 24.25271606 [4008] Current position in file is 0x20
00000089 24.25441933 [4008]
00000090 24.25441933 [4008] Reading info header data starting at 0x20
00000091 24.25446129 [4008] File format revision=0x7 0x24
00000092 24.25449944 [4008] File size in bytes=1720964 0x28
00000093 24.25453377 [4008] CRC value=0xC52FD13B 0x2C
00000094 24.25457001 [4008] Bytes from offset to start of sections=0x48 0x30 bytes from start of this to first section
00000095 24.25460625 [4008] Number of sections=8 0x34
00000096 24.25464058 [4008] Root object type (?)=0x6 0x38
00000097 24.25467491 [4008] Root object offset (?)=0x0 0x3C
00000098 24.25470924 [4008] Unknown1=0x0 0x40
00000099 24.25474358 [4008] Unknown2=0x0 0x44
00000100 24.25478363 [4008] Tag=0x80000032 0x48
00000101 24.25482941 [4008] Current position in file is 0x68
00000102 24.25701141 [4008]
00000103 24.25701141 [4008] Reading section 0 (arttoolinfo) data starting at 0x68
00000104 24.25706100 [4008] Unknown=0x0 0x6C always 0x0
00000105 24.25709724 [4008] Section file offset=0x468C 0x70 where this section starts in the file
00000106 24.25713730 [4008] Compressed size=61184 0x74 compressed size and uncompressed sizes should equal for SH5 GR2s
00000107 24.25717163 [4008] Uncompressed size=61184 0x78 compressed size and uncompressed sizes should equal for SH5 GR2s
00000108 24.25720787 [4008] Alignment=0x4 0x7C what the alignment boundary is in the file
00000109 24.25724792 [4008] Start of data fileoffset=0xBD9C 0x80 start of data
00000110 24.25728989 [4008] Start of data fileoffset2=0xBD9C 0x84 start of data
00000111 24.25732613 [4008] Pointers file offset=0x1C8 0x88 where the pointers for this section are located
00000112 24.25736427 [4008] Number of pointers=1467 0x8C
00000113 24.25740051 [4008] Pointer to unknown=0x468C 0x90
00000114 24.25743675 [4008] Unknown2=0x0 0x94
00000115 24.25749016 [4008] ********* Incompatible GR2 file. Expected unknown pointer to have value of GR2 file size in section header 0 *********
00000116 24.25749016 [4008]
00000117 26.47792053 [4008] ********* Unable to parse D:\GAMES\U-Boats\data\Submarine\NSS_Undine\NSS_Undine.GR2 *********
00000118 26.47792053 [4008]
00000119 27.17979431 [4008] D:\GAMES\U-Boats\data\Submarine\NSS_Undine\NSS_Undine.GR2 closed
00000120 27.17979431 [4008]

TheDarkWraith
10-18-11, 08:35 AM
Can not open any files in the folder Submarines - when I open any file returns consistently two errors:
http://www.subsim.com/radioroom/picture.php?albumid=354&pictureid=5024
00000103 24.25701141 [4008] Reading section 0 (arttoolinfo) data starting at 0x68
00000104 24.25706100 [4008] Unknown=0x0 0x6C always 0x0
00000105 24.25709724 [4008] Section file offset=0x468C 0x70 where this section starts in the file
00000106 24.25713730 [4008] Compressed size=61184 0x74 compressed size and uncompressed sizes should equal for SH5 GR2s
00000107 24.25717163 [4008] Uncompressed size=61184 0x78 compressed size and uncompressed sizes should equal for SH5 GR2s
00000108 24.25720787 [4008] Alignment=0x4 0x7C what the alignment boundary is in the file
00000109 24.25724792 [4008] Start of data fileoffset=0xBD9C 0x80 start of data
00000110 24.25728989 [4008] Start of data fileoffset2=0xBD9C 0x84 start of data
00000111 24.25732613 [4008] Pointers file offset=0x1C8 0x88 where the pointers for this section are located
00000112 24.25736427 [4008] Number of pointers=1467 0x8C
00000113 24.25740051 [4008] Pointer to unknown=0x468C 0x90
00000114 24.25743675 [4008] Unknown2=0x0 0x94
00000115 24.25749016 [4008] ********* Incompatible GR2 file. Expected unknown pointer to have value of GR2 file size in section header 0 *********

Thanks for the report :up: The first problem you reported is due to culture specifics biting me in the you know what again. Easy fix. This problem is a little more involved as I don't know what Unknown2 is doing. I'll have to figure this out now.

Have you tried it on anything in \data\Sea? Worked on many of the ships I tried it on there. I'll open up the NSS_Undine using VS 2008 and look at its pointers and see what's going on.

TheDarkWraith
10-18-11, 09:02 AM
There's always a special one somewhere.....the NSS_Undine is laid out differently than other GR2 files I've seen. It defines it's pointers for section 0 where the file info header should be. I see from the section descriptions that it says it was going to do this but I never took something like that into account. I figured all GR2 would have their info header located at 0x1C8 in the file :shifty: That's what you get for assuming!!

I'll have to make some changes.....

Obelix
10-18-11, 09:08 AM
Have you tried it on anything in \data\Sea? Worked on many of the ships I tried it on there....
I tried to open the folder Sea. All opened normally, but Nelson was this:
http://www.subsim.com/radioroom/picture.php?albumid=354&pictureid=5026
http://www.subsim.com/radioroom/picture.php?albumid=354&pictureid=5027
http://www.subsim.com/radioroom/picture.php?albumid=354&pictureid=5028
From last screen:
Index out of range. The index must be positive, but its size can not exceed the size of the collection.
Parameter name: index

Log DbgView:
00000000 0.00000000 [3980] GR2 file path is D:\GAMES\U-Boats\data\Sea\NBB_Nelson\NBB_Nelson.GR2
00000001 0.00000000 [3980]
00000002 0.00350120 [3980] Current position in file is 0x0
00000003 0.00352389 [3980]
00000004 0.00352389 [3980] Reading file header data starting at 0x0
00000005 0.00359097 [3980] Magic string=)?lA?¤S+%o·?ofai 0x10
00000006 0.00360807 [3980] File list start offset (from file beginning)=0x1C8 0x14 where the file list header starts
00000007 0.00363734 [3980] Unknown1=0x0 0x18
00000008 0.00367680 [3980] Unknown2=0x0 0x1C
00000009 0.00379453 [3980] Unknown3=0x0 0x20
00000010 0.00381393 [3980] Current position in file is 0x20
00000011 0.00384123 [3980]
00000012 0.00384123 [3980] Reading info header data starting at 0x20
00000013 0.00386589 [3980] File format revision=0x7 0x24
00000014 0.00405366 [3980] File size in bytes=9243412 0x28
00000015 0.00408062 [3980] CRC value=0x542724E6 0x2C
00000016 0.00417928 [3980] Bytes from offset to start of sections=0x48 0x30 bytes from start of this to first section
00000017 0.00419769 [3980] Number of sections=8 0x34
00000018 0.00422597 [3980] Root object type (?)=0x6 0x38
00000019 0.00425228 [3980] Root object offset (?)=0x3720 0x3C
00000020 0.00427727 [3980] Unknown1=0x0 0x40
00000021 0.00430128 [3980] Unknown2=0x0 0x44
00000022 0.00432627 [3980] Tag=0x80000032 0x48
00000023 0.00436211 [3980] Current position in file is 0x68
00000024 0.00446406 [3980]
00000025 0.00446406 [3980] Reading section 0 (arttoolinfo) data starting at 0x68
00000026 0.00448181 [3980] Unknown=0x0 0x6C always 0x0
00000027 0.00451108 [3980] Section file offset=0x1C8 0x70 where this section starts in the file
00000028 0.00453574 [3980] Compressed size=117580 0x74 compressed size and uncompressed sizes should equal for SH5 GR2s
00000029 0.00456238 [3980] Uncompressed size=117580 0x78 compressed size and uncompressed sizes should equal for SH5 GR2s
00000030 0.00458737 [3980] Alignment=0x4 0x7C what the alignment boundary is in the file
00000031 0.00461204 [3980] Start of data fileoffset=0x18CC4 0x80 start of data
00000032 0.00463604 [3980] Start of data fileoffset2=0x18CC4 0x84 start of data
00000033 0.00466794 [3980] Pointers file offset=0x8C74D8 0x88 where the pointers for this section are located
00000034 0.00478468 [3980] Number of pointers=2574 0x8C
00000035 0.00480013 [3980] Pointer to unknown=0x8D0B14 0x90
00000036 0.00482611 [3980] Unknown2=0x0 0x94
00000037 0.00486788 [3980] Current position in file is 0x94
00000038 0.00492213 [3980]
00000039 0.00492213 [3980] Reading section 1 (vertex_data) data starting at 0x94
00000040 0.00494778 [3980] Unknown=0x0 0x98 always 0x0
00000041 0.00497311 [3980] Section file offset=0x1CD14 0x9C where this section starts in the file
00000042 0.00499843 [3980] Compressed size=8155008 0xA0 compressed size and uncompressed sizes should equal for SH5 GR2s
00000043 0.00502309 [3980] Uncompressed size=8155008 0xA4 compressed size and uncompressed sizes should equal for SH5 GR2s
00000044 0.00504808 [3980] Alignment=0x20 0xA8 what the alignment boundary is in the file
00000045 0.00507275 [3980] Start of data fileoffset=0x7C6F80 0xAC start of data
00000046 0.00509708 [3980] Start of data fileoffset2=0x7C6F80 0xB0 start of data
00000047 0.00512141 [3980] Pointers file offset=0x8CED80 0xB4 where the pointers for this section are located
00000048 0.00514673 [3980] Number of pointers=0 0xB8
00000049 0.00517074 [3980] Pointer to unknown=0x8D0B14 0xBC
00000050 0.00519508 [3980] Unknown2=0x0 0xC0
00000051 0.00522105 [3980] Current position in file is 0xC0
00000052 0.00525065 [3980]
00000053 0.00525065 [3980] Reading section 2 (indicies) data starting at 0xC0
00000054 0.00527498 [3980] Unknown=0x0 0xC4 always 0x0
00000055 0.00529965 [3980] Section file offset=0x7E3C94 0xC8 where this section starts in the file
00000056 0.00536311 [3980] Compressed size=912228 0xCC compressed size and uncompressed sizes should equal for SH5 GR2s
00000057 0.00539370 [3980] Uncompressed size=912228 0xD0 compressed size and uncompressed sizes should equal for SH5 GR2s
00000058 0.00541935 [3980] Alignment=0x4 0xD4 what the alignment boundary is in the file
00000059 0.00544368 [3980] Start of data fileoffset=0xDEB64 0xD8 start of data
00000060 0.00546802 [3980] Start of data fileoffset2=0xDEB64 0xDC start of data
00000061 0.00549235 [3980] Pointers file offset=0x8CED80 0xE0 where the pointers for this section are located
00000062 0.00551636 [3980] Number of pointers=0 0xE4
00000063 0.00554036 [3980] Pointer to unknown=0x8D0B14 0xE8
00000064 0.00556437 [3980] Unknown2=0x0 0xEC
00000065 0.00559133 [3980] Current position in file is 0xEC
00000066 0.00562159 [3980]
00000067 0.00562159 [3980] Reading section 3 (unknown3) data starting at 0xEC
00000068 0.00564691 [3980] Unknown=0x0 0xF0 always 0x0
00000069 0.00567387 [3980] Section file offset=0x8C27F8 0xF4 where this section starts in the file
00000070 0.00569854 [3980] Compressed size=0 0xF8 compressed size and uncompressed sizes should equal for SH5 GR2s
00000071 0.00572320 [3980] Uncompressed size=0 0xFC compressed size and uncompressed sizes should equal for SH5 GR2s
00000072 0.00574753 [3980] Alignment=0x20 0x100 what the alignment boundary is in the file
00000073 0.00577187 [3980] Start of data fileoffset=0x0 0x104 start of data
00000074 0.00579620 [3980] Start of data fileoffset2=0x0 0x108 start of data
00000075 0.00582086 [3980] Pointers file offset=0x8CED80 0x10C where the pointers for this section are located
00000076 0.00584684 [3980] Number of pointers=0 0x110
00000077 0.00587184 [3980] Pointer to unknown=0x8D0B14 0x114
00000078 0.00589617 [3980] Unknown2=0x0 0x118
00000079 0.00592248 [3980] Current position in file is 0x118
00000080 0.00595076 [3980]
00000081 0.00595076 [3980] Reading section 4 (unknown4) data starting at 0x118
00000082 0.00597542 [3980] Unknown=0x0 0x11C always 0x0
00000083 0.00599976 [3980] Section file offset=0x8C27F8 0x120 where this section starts in the file
00000084 0.00602442 [3980] Compressed size=0 0x124 compressed size and uncompressed sizes should equal for SH5 GR2s
00000085 0.00604941 [3980] Uncompressed size=0 0x128 compressed size and uncompressed sizes should equal for SH5 GR2s
00000086 0.00607375 [3980] Alignment=0x4 0x12C what the alignment boundary is in the file
00000087 0.00609907 [3980] Start of data fileoffset=0x0 0x130 start of data
00000088 0.00612340 [3980] Start of data fileoffset2=0x0 0x134 start of data
00000089 0.00614774 [3980] Pointers file offset=0x8CED80 0x138 where the pointers for this section are located
00000090 0.00617207 [3980] Number of pointers=0 0x13C
00000091 0.00619608 [3980] Pointer to unknown=0x8D0B14 0x140
00000092 0.00622041 [3980] Unknown2=0x0 0x144
00000093 0.00624672 [3980] Current position in file is 0x144
00000094 0.00627533 [3980]
00000095 0.00627533 [3980] Reading section 5 (unknown5) data starting at 0x144
00000096 0.00629966 [3980] Unknown=0x0 0x148 always 0x0
00000097 0.00632531 [3980] Section file offset=0x8C27F8 0x14C where this section starts in the file
00000098 0.00635195 [3980] Compressed size=0 0x150 compressed size and uncompressed sizes should equal for SH5 GR2s
00000099 0.00637661 [3980] Uncompressed size=0 0x154 compressed size and uncompressed sizes should equal for SH5 GR2s
00000100 0.00640095 [3980] Alignment=0x4 0x158 what the alignment boundary is in the file
00000101 0.00642528 [3980] Start of data fileoffset=0x0 0x15C start of data
00000102 0.00644929 [3980] Start of data fileoffset2=0x0 0x160 start of data
00000103 0.00647329 [3980] Pointers file offset=0x8CED80 0x164 where the pointers for this section are located
00000104 0.00649763 [3980] Number of pointers=0 0x168
00000105 0.00652163 [3980] Pointer to unknown=0x8D0B14 0x16C
00000106 0.00654662 [3980] Unknown2=0x0 0x170
00000107 0.00657260 [3980] Current position in file is 0x170
00000108 0.00660154 [3980]
00000109 0.00660154 [3980] Reading section 6 (unknown6) data starting at 0x170
00000110 0.00662555 [3980] Unknown=0x0 0x174 always 0x0
00000111 0.00665021 [3980] Section file offset=0x8C27F8 0x178 where this section starts in the file
00000112 0.00667553 [3980] Compressed size=19680 0x17C compressed size and uncompressed sizes should equal for SH5 GR2s
00000113 0.00670052 [3980] Uncompressed size=19680 0x180 compressed size and uncompressed sizes should equal for SH5 GR2s
00000114 0.00672519 [3980] Alignment=0x4 0x184 what the alignment boundary is in the file
00000115 0.00674952 [3980] Start of data fileoffset=0x4CE0 0x188 start of data
00000116 0.00677484 [3980] Start of data fileoffset2=0x4CE0 0x18C start of data
00000117 0.00680115 [3980] Pointers file offset=0x8CED80 0x190 where the pointers for this section are located
00000118 0.00682515 [3980] Number of pointers=631 0x194
00000119 0.00684916 [3980] Pointer to unknown=0x8D0B14 0x198
00000120 0.00687317 [3980] Unknown2=0x0 0x19C
00000121 0.00689914 [3980] Current position in file is 0x19C
00000122 0.00692808 [3980]
00000123 0.00692808 [3980] Reading section 7 (unknown7) data starting at 0x19C
00000124 0.00695209 [3980] Unknown=0x0 0x1A0 always 0x0
00000125 0.00697675 [3980] Section file offset=0x8C74D8 0x1A4 where this section starts in the file
00000126 0.00700240 [3980] Compressed size=0 0x1A8 compressed size and uncompressed sizes should equal for SH5 GR2s
00000127 0.00702706 [3980] Uncompressed size=0 0x1AC compressed size and uncompressed sizes should equal for SH5 GR2s
00000128 0.00705140 [3980] Alignment=0x4 0x1B0 what the alignment boundary is in the file
00000129 0.00707573 [3980] Start of data fileoffset=0x0 0x1B4 start of data
00000130 0.00710007 [3980] Start of data fileoffset2=0x0 0x1B8 start of data
00000131 0.00712407 [3980] Pointers file offset=0x8D0B14 0x1BC where the pointers for this section are located
00000132 0.00714775 [3980] Number of pointers=0 0x1C0
00000133 0.00717208 [3980] Pointer to unknown=0x8D0B14 0x1C4
00000134 0.00719609 [3980] Unknown2=0x0 0x1C8
00000135 0.00722338 [3980] Current position in file is 0x1C8
00000136 0.00725594 [3980]
00000137 0.00725594 [3980] File info offset at 0x8 (0x1D0)
00000138 0.00729507 [3980] Number of textures=10 0xC (0x1D4)
00000139 0.00732204 [3980] Number of materials=21 0x14 (0x1DC)
00000140 0.00734703 [3980] Number of skeletons=1 0x1C (0x1E4)
00000141 0.00737169 [3980] Number of vertex datas=55 0x24 (0x1EC)
00000142 0.00739636 [3980] Number of tritopologies=55 0x2C (0x1F4)
00000143 0.00742102 [3980] Number of meshes=55 0x34 (0x1FC)
00000144 0.00744568 [3980] Number of models=1 0x3C (0x204)
00000145 0.00747166 [3980] Number of trackgroups=0 0x44 (0x20C)
00000146 0.00749632 [3980] Number of animations=0 0x4C (0x214)
00000147 0.00752099 [3980] Number of unknown=0 0x54 (0x21C)
00000148 0.00754499 [3980] Current position in file is 0x220
00000149 0.00764694 [3980] Pointer 0 updates the pointer to ArtToolInfo:FromArtTooFromName with pointer to embedded string for it
00000150 0.00766962 [3980]
00000151 0.00766962 [3980] ArtToolInfo offset is 0x58 (0x220)
00000152 0.00770481 [3980] FromArtToolName=3D Studio MAX 0x5C (0x224) embedded string from 0x18CC4 (0x18E8C)
00000153 0.00773013 [3980] ArtToolMajorRevision=10 0x60 (0x228)
00000154 0.00775480 [3980] ArtToolMinorRevision=0 0x64 (0x22C)
00000155 0.00778110 [3980] ArtToolPointerSize=32 0x68 (0x230)
00000156 0.00780807 [3980] UnitsPerMeter=0,100000 0x6C (0x234)
00000157 0.00783635 [3980] Origin=0,000000 0,000000 0,000000 0x70 (0x238)
00000158 0.00786233 [3980] RightVector=1,000000 0,000000 0,000000 0x7C (0x244)
00000159 0.00788765 [3980] UpVector=0,000000 1,000000 0,000000 0x88 (0x250)
00000160 0.00791363 [3980] BackVector=0,000000 0,000000 -1,000000 0x94 (0x25C)
00000161 0.00793697 [3980] Current position in file is 0x268
00000162 0.00796789 [3980] Pointer 1 always points to ArtToolInfo:? pointer
00000163 0.00799123 [3980] Based on this pointer then:
00000164 0.00801623 [3980] ArtToolInfo:ExtendedData pointer is at 0xA4 (0x26C)
00000165 0.00804122 [3980] ArtToolInfo:ExtendedData:DocumentContents pointer is at 0xA8 (0x270)
00000166 0.00806522 [3980] ArtToolInfo:ExtendedData:DocumentContents:Headers pointer is at 0xAC (0x274)
00000167 0.00808956 [3980] ArtToolInfo:ExtendedData:DocumentContents:Elements number of elements is at 0xB0 (0x278)
00000168 0.00811389 [3980] ArtToolInfo:ExtendedData:DocumentContents:Elements pointer is at 0xB4 (0x27C)
00000169 0.00813856 [3980]
00000170 0.00813856 [3980] ArtToolInfo:ExtendedData:DocumentContents:Headers data file offset=0xB8 (0x280)
00000171 0.00816223 [3980] Current position in file is 0x268
00000172 0.00818821 [3980]
00000173 0.00818821 [3980] These additional strings don't have pointers associated with them and are for the ArtToolInfo in GrannyViewer (0x18E9C)
00000174 0.00828095 [3980] Additional string 0 is DocumentContents 0x18CD4 (0x18E9C)
00000175 0.00832139 [3980] Additional string 1 is Headers 0x18CE8 (0x18EB0)
00000176 0.00835428 [3980] Additional string 2 is 0 0x18CF0 (0x18EB8)
00000177 0.00838683 [3980] Additional string 3 is 1 0x18CF4 (0x18EBC)
00000178 0.00841939 [3980] Additional string 4 is 2 0x18CF8 (0x18EC0)
00000179 0.00845194 [3980] Additional string 5 is 3 0x18CFC (0x18EC4)
00000180 0.00848516 [3980] Additional string 6 is 4 0x18D00 (0x18EC8)
00000181 0.00851771 [3980] Additional string 7 is 5 0x18D04 (0x18ECC)
00000182 0.00855093 [3980] Additional string 8 is 6 0x18D08 (0x18ED0)
00000183 0.00858348 [3980] Additional string 9 is 7 0x18D0C (0x18ED4)
00000184 0.00861735 [3980] Additional string 10 is 8 0x18D10 (0x18ED8)
00000185 0.00865024 [3980] Additional string 11 is 9 0x18D14 (0x18EDC)
00000186 0.00872752 [3980] Additional string 12 is 10 0x18D18 (0x18EE0)
00000187 0.00876270 [3980] Additional string 13 is 11 0x18D1C (0x18EE4)
00000188 0.00879855 [3980] Additional string 14 is 12 0x18D20 (0x18EE8)
00000189 0.00883439 [3980] Additional string 15 is 13 0x18D24 (0x18EEC)
00000190 0.00887188 [3980] Additional string 16 is 14 0x18D28 (0x18EF0)
00000191 0.00890772 [3980] Additional string 17 is 15 0x18D2C (0x18EF4)
00000192 0.00897152 [3980] Additional string 18 is Elements 0x18D30 (0x18EF8)
00000193 0.00900802 [3980] Additional string 19 is Value 0x18D3C (0x18F04)
00000194 0.00903203 [3980] Current position in file is 0x18F0C
00000195 0.00905537 [3980]
00000196 0.00905537 [3980] The following strings are for the ArtToolInfo:ExtendedData:DocumentContents:Headers in GrannyViewer
00000197 0.00907839 [3980] Their file layout is pointer (4 bytes) then data (4 bytes)
00000198 0.00915731 [3980] General=3 0xC0 (0x288)
00000199 0.00922506 [3980] Mesh Totals=2 0xC8 (0x290)
00000200 0.00930957 [3980] Scene Totals=7 0xD0 (0x298)
00000201 0.00941513 [3980] External Dependencies=16 0xD8 (0x2A0)
00000202 0.00946577 [3980] Objects=97 0xE0 (0x2A8)
00000203 0.00954272 [3980] Materials=7 0xE8 (0x2B0)
00000204 0.00962921 [3980] Used Plug-Ins=18 0xF0 (0x2B8)
00000205 0.00969234 [3980] Render Data=13 0xF8 (0x2C0)
00000206 0.00971668 [3980] Current position in file is 0x18F0C
00000207 0.00975680 [3980] Pointer 10 updates ArtToolInfo:ExtendedData:DocumentContents:Headers pointer with pointer to where it's data is
00000208 0.00978245 [3980] ********* Conflicting offsets specified for ArtToolInfo:ExtendedData:DocumentContents:Headers data file offset *********
00000209 0.00978245 [3980]
00000210 12.90938377 [824] ScriptUI: 3[0]: 0.119187 (FlexServer performance info) 0.100 seconds to load C:\Program Files\Adobe\Adobe Photoshop CS5.1 (64 Bit)\Plug-ins\Extensions
00000211 13.13961887 [824] ScriptUI: 5[0]: 0.349444 (FlexServer performance info) 0.200 seconds for server SWF to initialize
00000212 13.22388458 [824] ScriptUI: 8[0]: 0.433704 (FlexServer performance info) 0.100 seconds to load C:\Program Files\Adobe\Adobe Photoshop CS5.1 (64 Bit)\Plug-ins\Extensions\ScriptUIFlexPhotoshop.swf
00000213 40.01392365 [3980] number of ArtToolInfo:ExtendedData:DocumentContents:Elements =163 0xB8 (0x280)
00000214 40.01399994 [3980] Current position in file is 0x284
00000215 40.01403427 [3980]
00000216 40.01403427 [3980] Current file position adjusted back to after last header value read (0x18F98)
00000217 40.01408386 [3980]
00000218 40.01408386 [3980] Elements data 0x18DD0 (0x18F98) number to read=163:
00000219 40.01427841 [3980] 3ds Max Version: 10.0 pointer=0x100 (0x2C8) embedded string=0x18DD0 (0x18F98)
00000220 40.01440430 [3980] Uncompressed pointer=0x104 (0x2CC) embedded string=0x18DE8 (0x18FB0)
00000221 40.01454544 [3980] Build: Unknown pointer=0x108 (0x2D0) embedded string=0x18DF8 (0x18FC0)
00000222 40.01468658 [3980] Vertices: 56695 pointer=0x10C (0x2D4) embedded string=0x18E08 (0x18FD0)
00000223 40.01482010 [3980] Faces: 42282 pointer=0x110 (0x2D8) embedded string=0x18E18 (0x18FE0)
00000224 40.01493454 [3980] Objects: 55 pointer=0x114 (0x2DC) embedded string=0x18E28 (0x18FF0)
00000225 40.01503754 [3980] Shapes: 0 pointer=0x118 (0x2E0) embedded string=0x18E34 (0x18FFC)
00000226 40.01516724 [3980] Lights: 0 pointer=0x11C (0x2E4) embedded string=0x18E40 (0x19008)
00000227 40.01528931 [3980] Cameras: 0 pointer=0x120 (0x2E8) embedded string=0x18E4C (0x19014)
00000228 40.01540375 [3980] Helpers: 42 pointer=0x124 (0x2EC) embedded string=0x18E58 (0x19020)
00000229 40.01554489 [3980] Space Warps: 0 pointer=0x128 (0x2F0) embedded string=0x18E64 (0x1902C)
00000230 40.01565552 [3980] Total: 97 pointer=0x12C (0x2F4) embedded string=0x18E74 (0x1903C)
00000231 40.01578522 [3980] 3ds Max 2008 pointer=0x130 (0x2F8) embedded string=0x18E80 (0x19048)
00000232 40.01590729 [3980] 3ds Max 2008 pointer=0x134 (0x2FC) embedded string=0x18E80 (0x19048)
00000233 40.01604080 [3980] 3ds Max 2008 pointer=0x138 (0x300) embedded string=0x18E80 (0x19048)
00000234 40.01616287 [3980] 3ds Max 2008 pointer=0x13C (0x304) embedded string=0x18E80 (0x19048)
00000235 40.01631165 [3980] ship_T04.dds pointer=0x140 (0x308) embedded string=0x18E90 (0x19058)
00000236 40.01645279 [3980] NBB_Nelson_AO02.dds pointer=0x144 (0x30C) embedded string=0x18EA0 (0x19068)
00000237 40.01657867 [3980] ship_N04.DDS pointer=0x148 (0x310) embedded string=0x18EB4 (0x1907C)
00000238 40.01672745 [3980] ship_hull_T03.dds pointer=0x14C (0x314) embedded string=0x18EC4 (0x1908C)
00000239 40.01688766 [3980] NBB_Nelson_AO02.dds pointer=0x150 (0x318) embedded string=0x18EA0 (0x19068)
00000240 40.01704788 [3980] ship_hull_N02.dds pointer=0x154 (0x31C) embedded string=0x18ED8 (0x190A0)
00000241 40.01719666 [3980] Boats_texture.dds pointer=0x158 (0x320) embedded string=0x18EEC (0x190B4)
00000242 40.01731873 [3980] boats_ao.dds pointer=0x15C (0x324) embedded string=0x18F00 (0x190C8)
00000243 40.01746750 [3980] Boats_normal.dds pointer=0x160 (0x328) embedded string=0x18F10 (0x190D8)
00000244 40.01759720 [3980] icicles.dds pointer=0x164 (0x32C) embedded string=0x18F24 (0x190EC)
00000245 40.01771164 [3980] icicles.dds pointer=0x168 (0x330) embedded string=0x18F24 (0x190EC)
00000246 40.01784897 [3980] icicles_n.dds pointer=0x16C (0x334) embedded string=0x18F30 (0x190F8)
00000247 40.01796722 [3980] NBB_Nelson pointer=0x170 (0x338) embedded string=0x18F40 (0x19108)
00000248 40.01810837 [3980] NBB_Nelson_hull pointer=0x174 (0x33C) embedded string=0x18F4C (0x19114)
00000249 40.01833725 [3980] Reflect_NBB_Nelson_hull pointer=0x178 (0x340) embedded string=0x18F5C (0x19124)
00000250 40.01847076 [3980] NBB_Nelson_propeller01 pointer=0x17C (0x344) embedded string=0x18F74 (0x1913C)
00000251 40.01868439 [3980] DMG_Col_NBB_Nelson_propeller01 pointer=0x180 (0x348) embedded string=0x18F8C (0x19154)
00000252 40.01888275 [3980] aud_propeller01_NBB_Nelson pointer=0x184 (0x34C) embedded string=0x18FAC (0x19174)
00000253 40.01905823 [3980] NBB_Nelson_propeller02 pointer=0x188 (0x350) embedded string=0x18FC8 (0x19190)
00000254 40.01927185 [3980] DMG_Col_NBB_Nelson_propeller02 pointer=0x18C (0x354) embedded string=0x18FE0 (0x191A8)
00000255 40.01947021 [3980] aud_propeller02_NBB_Nelson pointer=0x190 (0x358) embedded string=0x19000 (0x191C8)
00000256 40.01961899 [3980] NBB_Nelson_siajB pointer=0x194 (0x35C) embedded string=0x1901C (0x191E4)
00000257 40.01977158 [3980] NBB_Nelson_siajF pointer=0x198 (0x360) embedded string=0x19030 (0x191F8)
00000258 40.01991653 [3980] NBB_Nelson_siajF2 pointer=0x19C (0x364) embedded string=0x19044 (0x1920C)
00000259 40.02007675 [3980] cfg#FLG_NBB_Nelson pointer=0x1A0 (0x368) embedded string=0x19058 (0x19220)
00000260 40.02022552 [3980] NBB_Nelson_rudder pointer=0x1A4 (0x36C) embedded string=0x1906C (0x19234)
00000261 40.02041626 [3980] DMG_Col_NBB_Nelson_rudder pointer=0x1A8 (0x370) embedded string=0x19080 (0x19248)
00000262 40.02057648 [3980] cfg#M01_NBB_Nelson pointer=0x1AC (0x374) embedded string=0x1909C (0x19264)
00000263 40.02116776 [3980] cfg#M02_NBB_Nelson pointer=0x1B0 (0x378) embedded string=0x190B0 (0x19278)
00000264 40.02140045 [3980] cfg#M03_NBB_Nelson pointer=0x1B4 (0x37C) embedded string=0x190C4 (0x1928C)
00000265 40.02157974 [3980] cfg#S01_NBB_Nelson pointer=0x1B8 (0x380) embedded string=0x190D8 (0x192A0)
00000266 40.02175522 [3980] cfg#S02_NBB_Nelson pointer=0x1BC (0x384) embedded string=0x190EC (0x192B4)
00000267 40.02193069 [3980] cfg#S03_NBB_Nelson pointer=0x1C0 (0x388) embedded string=0x19100 (0x192C8)
00000268 40.02210236 [3980] cfg#S04_NBB_Nelson pointer=0x1C4 (0x38C) embedded string=0x19114 (0x192DC)
00000269 40.02228928 [3980] cfg#S05_NBB_Nelson pointer=0x1C8 (0x390) embedded string=0x19128 (0x192F0)
00000270 40.02233887 [3980] cfg#S06_NBB_Nelson pointer=0x1CC (0x394) embedded string=0x1913C (0x19304)
00000271 40.02250290 [3980] cfg#S07_NBB_Nelson pointer=0x1D0 (0x398) embedded string=0x19150 (0x19318)
00000272 40.02267075 [3980] cfg#S08_NBB_Nelson pointer=0x1D4 (0x39C) embedded string=0x19164 (0x1932C)
00000273 40.02282333 [3980] cfg#S09_NBB_Nelson pointer=0x1D8 (0x3A0) embedded string=0x19178 (0x19340)
00000274 40.02297592 [3980] cfg#S10_NBB_Nelson pointer=0x1DC (0x3A4) embedded string=0x1918C (0x19354)
00000275 40.02312851 [3980] cfg#S11_NBB_Nelson pointer=0x1E0 (0x3A8) embedded string=0x191A0 (0x19368)
00000276 40.02329636 [3980] cfg#S12_NBB_Nelson pointer=0x1E4 (0x3AC) embedded string=0x191B4 (0x1937C)
00000277 40.02343369 [3980] cfg#A01_NBB_Nelson pointer=0x1E8 (0x3B0) embedded string=0x191C8 (0x19390)
00000278 40.02361679 [3980] cfg#A02_NBB_Nelson pointer=0x1EC (0x3B4) embedded string=0x191DC (0x193A4)
00000279 40.02375412 [3980] cfg#A03_NBB_Nelson pointer=0x1F0 (0x3B8) embedded string=0x191F0 (0x193B8)
00000280 40.02391434 [3980] cfg#A04_NBB_Nelson pointer=0x1F4 (0x3BC) embedded string=0x19204 (0x193CC)
00000281 40.02406693 [3980] cfg#A05_NBB_Nelson pointer=0x1F8 (0x3C0) embedded string=0x19218 (0x193E0)
00000282 40.02421951 [3980] cfg#A06_NBB_Nelson pointer=0x1FC (0x3C4) embedded string=0x1922C (0x193F4)
00000283 40.08617020 [3980] cfg#L01_NBB_Nelson pointer=0x200 (0x3C8) embedded string=0x19240 (0x19408)
00000284 40.09091568 [3980] cfg#L02_NBB_Nelson pointer=0x204 (0x3CC) embedded string=0x19254 (0x1941C)
00000285 40.09514999 [3980] cfg#L03_NBB_Nelson pointer=0x208 (0x3D0) embedded string=0x19268 (0x19430)
00000286 40.09864426 [3980] cfg#L04_NBB_Nelson pointer=0x20C (0x3D4) embedded string=0x1927C (0x19444)
00000287 40.10206604 [3980] aud_engine_NBB_Nelson pointer=0x210 (0x3D8) embedded string=0x19290 (0x19458)
00000288 40.10541534 [3980] NBB_Nelson_shipWake pointer=0x214 (0x3DC) embedded string=0x192A8 (0x19470)
00000289 40.11172104 [3980] cfg#R01_NBB_Nelson pointer=0x218 (0x3E0) embedded string=0x192BC (0x19484)
00000290 40.11514664 [3980] cfg#R01_NBB_Nelson pointer=0x21C (0x3E4) embedded string=0x192BC (0x19484)
00000291 40.11862946 [3980] cfg#O01_NBB_Nelson pointer=0x220 (0x3E8) embedded string=0x192D0 (0x19498)
00000292 40.12195969 [3980] NBB_Nelson_boat01 pointer=0x224 (0x3EC) embedded string=0x192E4 (0x194AC)
00000293 40.12839508 [3980] DMG_Col_NBB_Nelson_boat01 pointer=0x228 (0x3F0) embedded string=0x192F8 (0x194C0)
00000294 40.13179398 [3980] NBB_Nelson_boat02 pointer=0x22C (0x3F4) embedded string=0x19314 (0x194DC)
00000295 40.13521576 [3980] DMG_Col_NBB_Nelson_boat02 pointer=0x230 (0x3F8) embedded string=0x19328 (0x194F0)
00000296 40.13859558 [3980] NBB_Nelson_boat03 pointer=0x234 (0x3FC) embedded string=0x19344 (0x1950C)
00000297 40.14508438 [3980] DMG_Col_NBB_Nelson_boat03 pointer=0x238 (0x400) embedded string=0x19358 (0x19520)
00000298 40.14850998 [3980] NBB_Nelson_boat04 pointer=0x23C (0x404) embedded string=0x19374 (0x1953C)
00000299 40.15200043 [3980] DMG_Col_NBB_Nelson_boat04 pointer=0x240 (0x408) embedded string=0x19388 (0x19550)
00000300 40.15533447 [3980] NBB_Nelson_boat05 pointer=0x244 (0x40C) embedded string=0x193A4 (0x1956C)
00000301 40.16191864 [3980] DMG_Col_NBB_Nelson_boat05 pointer=0x248 (0x410) embedded string=0x193B8 (0x19580)
00000302 40.16535950 [3980] NBB_Nelson_boat06 pointer=0x24C (0x414) embedded string=0x193D4 (0x1959C)
00000303 40.16908264 [3980] DMG_Col_NBB_Nelson_boat06 pointer=0x250 (0x418) embedded string=0x193E8 (0x195B0)
00000304 40.17233658 [3980] NBB_Nelson_boat07 pointer=0x254 (0x41C) embedded string=0x19404 (0x195CC)
00000305 40.17957687 [3980] DMG_Col_NBB_Nelson_boat07 pointer=0x258 (0x420) embedded string=0x19418 (0x195E0)
00000306 40.18309021 [3980] NBB_Nelson_boat08 pointer=0x25C (0x424) embedded string=0x19434 (0x195FC)
00000307 40.18925476 [3980] DMG_Col_NBB_Nelson_boat08 pointer=0x260 (0x428) embedded string=0x19448 (0x19610)
00000308 40.18950272 [3980] NBB_Nelson_boat09 pointer=0x264 (0x42C) embedded string=0x19464 (0x1962C)
00000309 40.18961716 [3980] DMG_Col_NBB_Nelson_boat09 pointer=0x268 (0x430) embedded string=0x19478 (0x19640)
00000310 40.18974686 [3980] NBB_Nelson_boat10 pointer=0x26C (0x434) embedded string=0x19494 (0x1965C)
00000311 40.18985748 [3980] DMG_Col_NBB_Nelson_boat10 pointer=0x270 (0x438) embedded string=0x194A8 (0x19670)
00000312 40.18998337 [3980] NBB_Nelson_boat11 pointer=0x274 (0x43C) embedded string=0x194C4 (0x1968C)
00000313 40.19010925 [3980] DMG_Col_NBB_Nelson_boat11 pointer=0x278 (0x440) embedded string=0x194D8 (0x196A0)
00000314 40.19020844 [3980] DMG_Col_NBB_Nelson_hull pointer=0x27C (0x444) embedded string=0x194F4 (0x196BC)
00000315 40.19033051 [3980] NBB_Nelson_mast pointer=0x280 (0x448) embedded string=0x1950C (0x196D4)
00000316 40.19045639 [3980] DMG_Col_NBB_Nelson_mast pointer=0x284 (0x44C) embedded string=0x1951C (0x196E4)
00000317 40.19054031 [3980] Reflect_NBB_Nelson_mast pointer=0x288 (0x450) embedded string=0x19534 (0x196FC)
00000318 40.19065094 [3980] _Ice_mast pointer=0x28C (0x454) embedded string=0x1954C (0x19714)
00000319 40.19074631 [3980] NBB_Nelson_cables01 pointer=0x290 (0x458) embedded string=0x19558 (0x19720)
00000320 40.19084930 [3980] _Ice_cables01 pointer=0x294 (0x45C) embedded string=0x1956C (0x19734)
00000321 40.19095993 [3980] NBB_Nelson_cabin pointer=0x298 (0x460) embedded string=0x1957C (0x19744)
00000322 40.19107437 [3980] cfg#H01_NBB_Nelson pointer=0x29C (0x464) embedded string=0x19590 (0x19758)
00000323 40.19118500 [3980] cfg#N01_NBB_Nelson pointer=0x2A0 (0x468) embedded string=0x195A4 (0x1976C)
00000324 40.19129944 [3980] cfg#C01_NBB_Nelson pointer=0x2A4 (0x46C) embedded string=0x195B8 (0x19780)
00000325 40.19142532 [3980] cfg#D01_NBB_Nelson pointer=0x2A8 (0x470) embedded string=0x195CC (0x19794)
00000326 40.19155121 [3980] DMG_Col_NBB_Nelson_cabin pointer=0x2AC (0x474) embedded string=0x195E0 (0x197A8)
00000327 40.19164276 [3980] Reflect_NBB_Nelson_cabin pointer=0x2B0 (0x478) embedded string=0x195FC (0x197C4)
00000328 40.19174576 [3980] _Ice_cabin pointer=0x2B4 (0x47C) embedded string=0x19618 (0x197E0)
00000329 40.19187546 [3980] NBB_Nelson_crane pointer=0x2B8 (0x480) embedded string=0x19624 (0x197EC)
00000330 40.19198990 [3980] DMG_Col_NBB_Nelson_crane pointer=0x2BC (0x484) embedded string=0x19638 (0x19800)
00000331 40.19212723 [3980] NBB_Nelson_funnel01 pointer=0x2C0 (0x488) embedded string=0x19654 (0x1981C)
00000332 40.19225693 [3980] DMG_Col_NBB_Nelson_funnel01 pointer=0x2C4 (0x48C) embedded string=0x19668 (0x19830)
00000333 40.19237518 [3980] Reflect_NBB_Nelson_funnel pointer=0x2C8 (0x490) embedded string=0x19684 (0x1984C)
00000334 40.19245911 [3980] aud_fore_NBB_Nelson pointer=0x2CC (0x494) embedded string=0x196A0 (0x19868)
00000335 40.19257736 [3980] _Ice_hull pointer=0x2D0 (0x498) embedded string=0x196B4 (0x1987C)
00000336 40.19270325 [3980] LNK@1x10_version01#01 pointer=0x2D4 (0x49C) embedded string=0x196C0 (0x19888)
00000337 40.19283295 [3980] LNK@1x1_version01#01 pointer=0x2D8 (0x4A0) embedded string=0x196D8 (0x198A0)
00000338 40.19295120 [3980] LNK@1x10x6_version01#01 pointer=0x2DC (0x4A4) embedded string=0x196F0 (0x198B8)
00000339 40.19307327 [3980] LNK@1x20_version01#01 pointer=0x2E0 (0x4A8) embedded string=0x19708 (0x198D0)
00000340 40.19318771 [3980] LNK@1x50_version01#01 pointer=0x2E4 (0x4AC) embedded string=0x19720 (0x198E8)
00000341 40.19341660 [3980] LNK@2x2_version01#01 pointer=0x2E8 (0x4B0) embedded string=0x19738 (0x19900)
00000342 40.19353485 [3980] LNK@1x20x10_version01#01 pointer=0x2EC (0x4B4) embedded string=0x19750 (0x19918)
00000343 40.19362259 [3980] LNK@1x1_version01#02 pointer=0x2F0 (0x4B8) embedded string=0x1976C (0x19934)
00000344 40.19368744 [3980] NBB_Nelson pointer=0x2F4 (0x4BC) embedded string=0x18F40 (0x19108)
00000345 40.19376373 [3980] DMG pointer=0x2F8 (0x4C0) embedded string=0x19784 (0x1994C)
00000346 40.19384766 [3980] Boats pointer=0x2FC (0x4C4) embedded string=0x19788 (0x19950)
00000347 40.19397736 [3980] AO pointer=0x300 (0x4C8) embedded string=0x19790 (0x19958)
00000348 40.21617889 [3980] Diffuse pointer=0x304 (0x4CC) embedded string=0x19794 (0x1995C)
00000349 40.24828339 [3980] Ice pointer=0x308 (0x4D0) embedded string=0x1979C (0x19964)
00000350 40.25246429 [3980] Standard_3 pointer=0x30C (0x4D4) embedded string=0x197A0 (0x19968)
00000351 40.25704575 [3980] CustAttribContainer.dlo pointer=0x310 (0x4D8) embedded string=0x197AC (0x19974)
00000352 40.26086044 [3980] ViewportManager.gup pointer=0x314 (0x4DC) embedded string=0x197C4 (0x1998C)
00000353 40.26507568 [3980] mrMaterialAttribs.gup pointer=0x318 (0x4E0) embedded string=0x197D8 (0x199A0)
00000354 40.26905823 [3980] mtlgen.dlt pointer=0x31C (0x4E4) embedded string=0x197F0 (0x199B8)
00000355 40.27348328 [3980] mtl.dlt pointer=0x320 (0x4E8) embedded string=0x197FC (0x199C4)
00000356 40.27721786 [3980] normalrender.dlt pointer=0x324 (0x4EC) embedded string=0x19804 (0x199CC)
00000357 40.27988052 [3980] samplers.dlh pointer=0x328 (0x4F0) embedded string=0x19818 (0x199E0)
00000358 40.28190994 [3980] ctrl.dlc pointer=0x32C (0x4F4) embedded string=0x19828 (0x199F0)
00000359 40.28390121 [3980] EPoly.dlo pointer=0x330 (0x4F8) embedded string=0x19834 (0x199FC)
00000360 40.28589249 [3980] kernel.dlk pointer=0x334 (0x4FC) embedded string=0x19840 (0x19A08)
00000361 40.28810501 [3980] rend.dlr pointer=0x338 (0x500) embedded string=0x1984C (0x19A14)
00000362 40.29000092 [3980] Ac*******s.dlu pointer=0x33C (0x504) embedded string=0x19858 (0x19A20)
00000363 40.29175949 [3980] InstanceMgr.dlu pointer=0x340 (0x508) embedded string=0x19868 (0x19A30)
00000364 40.29397202 [3980] biped.dlc pointer=0x344 (0x50C) embedded string=0x19878 (0x19A40)
00000365 40.29600525 [3980] reactor.dlc pointer=0x348 (0x510) embedded string=0x19884 (0x19A4C)
00000366 40.29837036 [3980] ParamEditor.gup pointer=0x34C (0x514) embedded string=0x19890 (0x19A58)
00000367 40.30043030 [3980] BitmapProxies.dlu pointer=0x350 (0x518) embedded string=0x198A0 (0x19A68)
00000368 40.30244827 [3980] SceneEffectLoader.dlu pointer=0x354 (0x51C) embedded string=0x198B4 (0x19A7C)
00000369 40.30489731 [3980] User Name=CRus pointer=0x358 (0x520) embedded string=0x198CC (0x19A94)
00000370 40.30683136 [3980] Computer Name=BUC-WKS-PR110 pointer=0x35C (0x524) embedded string=0x198DC (0x19AA4)
00000371 40.30878830 [3980] Render Width=640 pointer=0x360 (0x528) embedded string=0x198F8 (0x19AC0)
00000372 40.31040573 [3980] Render Height=480 pointer=0x364 (0x52C) embedded string=0x1990C (0x19AD4)
00000373 40.31200409 [3980] Render Aspect=1.00 pointer=0x368 (0x530) embedded string=0x19920 (0x19AE8)
00000374 40.31361389 [3980] Renderer ClassIDA=1 pointer=0x36C (0x534) embedded string=0x19934 (0x19AFC)
00000375 40.31521988 [3980] Renderer ClassIDB=0 pointer=0x370 (0x538) embedded string=0x19948 (0x19B10)
00000376 40.31684875 [3980] Renderer Name=Default Scanline Renderer pointer=0x374 (0x53C) embedded string=0x1995C (0x19B24)
00000377 40.31846619 [3980] Animation Start=0 pointer=0x378 (0x540) embedded string=0x19984 (0x19B4C)
00000378 40.32026672 [3980] Animation End=0 pointer=0x37C (0x544) embedded string=0x19998 (0x19B60)
00000379 40.32186890 [3980] Render Flags=32 pointer=0x380 (0x548) embedded string=0x199A8 (0x19B70)
00000380 40.32349396 [3980] Scene Flags=57032 pointer=0x384 (0x54C) embedded string=0x199B8 (0x19B80)
00000381 40.32505417 [3980] RenderElements=1 pointer=0x388 (0x550) embedded string=0x199CC (0x19B94)
00000382 40.32667923 [3980] pointer=0xBC (0x284) embedded string=0x100 (0x2C8)
00000383 40.32827377 [3980] pointer=0xA8 (0x270) embedded string=0xB4 (0x27C)
00000384 40.32991791 [3980] BB barci pointer=0x38C (0x554) embedded string=0x199E0 (0x19BA8)
00000385 40.33156586 [3980] DMG_Col_NBB_Nelson_boat07 pointer=0x3BC (0x584) embedded string=0x19418 (0x195E0)
00000386 40.33313370 [3980] DMG_Col_NBB_Nelson_boat02 pointer=0x3C0 (0x588) embedded string=0x19328 (0x194F0)
00000387 40.33494186 [3980] DMG_Col_NBB_Nelson_boat06 pointer=0x3C4 (0x58C) embedded string=0x193E8 (0x195B0)
00000388 40.33497238 [3980] DMG_Col_NBB_Nelson_boat04 pointer=0x3C8 (0x590) embedded string=0x19388 (0x19550)
00000389 40.33520889 [3980] DMG_Col_NBB_Nelson_boat11 pointer=0x3CC (0x594) embedded string=0x194D8 (0x196A0)
00000390 40.33548355 [3980] DMG_Col_NBB_Nelson_boat10 pointer=0x3D0 (0x598) embedded string=0x194A8 (0x19670)
00000391 40.33557510 [3980] DMG_Col_NBB_Nelson_boat01 pointer=0x3D4 (0x59C) embedded string=0x192F8 (0x194C0)
00000392 40.33570480 [3980] DMG_Col_NBB_Nelson_boat05 pointer=0x3D8 (0x5A0) embedded string=0x193B8 (0x19580)
00000393 40.33583069 [3980] DMG_Col_NBB_Nelson_boat09 pointer=0x3DC (0x5A4) embedded string=0x19478 (0x19640)
00000394 40.33594513 [3980] DMG_Col_NBB_Nelson_boat08 pointer=0x3E0 (0x5A8) embedded string=0x19448 (0x19610)
00000395 40.33597946 [3980] pointer=0x394 (0x55C) embedded string=0x3BC (0x584)
00000396 40.33604813 [3980] BB pointer=0x398 (0x560) embedded string=0x199EC (0x19BB4)
00000397 40.33616638 [3980] DMG_Col_NBB_Nelson_rudder pointer=0x3E4 (0x5AC) embedded string=0x19080 (0x19248)
00000398 40.33628464 [3980] DMG_Col_NBB_Nelson_boat01 pointer=0x3E8 (0x5B0) embedded string=0x192F8 (0x194C0)
00000399 40.33640289 [3980] DMG_Col_NBB_Nelson_boat02 pointer=0x3EC (0x5B4) embedded string=0x19328 (0x194F0)
00000400 40.33652115 [3980] DMG_Col_NBB_Nelson_boat03 pointer=0x3F0 (0x5B8) embedded string=0x19358 (0x19520)
00000401 40.33663940 [3980] DMG_Col_NBB_Nelson_boat04 pointer=0x3F4 (0x5BC) embedded string=0x19388 (0x19550)
00000402 40.33675385 [3980] DMG_Col_NBB_Nelson_boat05 pointer=0x3F8 (0x5C0) embedded string=0x193B8 (0x19580)
00000403 40.33686447 [3980] DMG_Col_NBB_Nelson_boat06 pointer=0x3FC (0x5C4) embedded string=0x193E8 (0x195B0)
00000404 40.33698654 [3980] DMG_Col_NBB_Nelson_boat07 pointer=0x400 (0x5C8) embedded string=0x19418 (0x195E0)
00000405 40.33710098 [3980] DMG_Col_NBB_Nelson_boat08 pointer=0x404 (0x5CC) embedded string=0x19448 (0x19610)
00000406 40.33721542 [3980] DMG_Col_NBB_Nelson_boat09 pointer=0x408 (0x5D0) embedded string=0x19478 (0x19640)
00000407 40.33766556 [3980] DMG_Col_NBB_Nelson_boat10 pointer=0x40C (0x5D4) embedded string=0x194A8 (0x19670)
00000408 40.33778763 [3980] DMG_Col_NBB_Nelson_boat11 pointer=0x410 (0x5D8) embedded string=0x194D8 (0x196A0)
00000409 40.33792114 [3980] DMG_Col_NBB_Nelson_funnel01 pointer=0x414 (0x5DC) embedded string=0x19668 (0x19830)
00000410 40.33803558 [3980] DMG_Col_NBB_Nelson_hull pointer=0x418 (0x5E0) embedded string=0x194F4 (0x196BC)
00000411 40.33814240 [3980] DMG_Col_NBB_Nelson_mast pointer=0x41C (0x5E4) embedded string=0x1951C (0x196E4)
00000412 40.33826828 [3980] DMG_Col_NBB_Nelson_propeller01 pointer=0x420 (0x5E8) embedded string=0x18F8C (0x19154)
00000413 40.33841324 [3980] DMG_Col_NBB_Nelson_propeller02 pointer=0x424 (0x5EC) embedded string=0x18FE0 (0x191A8)
00000414 40.33844376 [3980] pointer=0x3A0 (0x568) embedded string=0x3E4 (0x5AC)
00000415 40.33851242 [3980] B pointer=0x3A4 (0x56C) embedded string=0x199F0 (0x19BB8)
00000416 40.33862686 [3980] DMG_Col_NBB_Nelson_rudder pointer=0x428 (0x5F0) embedded string=0x19080 (0x19248)
00000417 40.33955002 [3980] DMG_Col_NBB_Nelson_boat01 pointer=0x42C (0x5F4) embedded string=0x192F8 (0x194C0)
00000418 40.33967590 [3980] DMG_Col_NBB_Nelson_boat02 pointer=0x430 (0x5F8) embedded string=0x19328 (0x194F0)
00000419 40.33979034 [3980] DMG_Col_NBB_Nelson_boat03 pointer=0x434 (0x5FC) embedded string=0x19358 (0x19520)
00000420 40.33991241 [3980] DMG_Col_NBB_Nelson_boat04 pointer=0x438 (0x600) embedded string=0x19388 (0x19550)
00000421 40.34002686 [3980] DMG_Col_NBB_Nelson_boat05 pointer=0x43C (0x604) embedded string=0x193B8 (0x19580)
00000422 40.34012985 [3980] DMG_Col_NBB_Nelson_boat06 pointer=0x440 (0x608) embedded string=0x193E8 (0x195B0)
00000423 40.34025955 [3980] DMG_Col_NBB_Nelson_boat07 pointer=0x444 (0x60C) embedded string=0x19418 (0x195E0)
00000424 40.34037781 [3980] DMG_Col_NBB_Nelson_boat08 pointer=0x448 (0x610) embedded string=0x19448 (0x19610)
00000425 40.34049225 [3980] DMG_Col_NBB_Nelson_boat09 pointer=0x44C (0x614) embedded string=0x19478 (0x19640)
00000426 40.34059906 [3980] DMG_Col_NBB_Nelson_boat10 pointer=0x450 (0x618) embedded string=0x194A8 (0x19670)
00000427 40.34072876 [3980] DMG_Col_NBB_Nelson_boat11 pointer=0x454 (0x61C) embedded string=0x194D8 (0x196A0)
00000428 40.34084702 [3980] DMG_Col_NBB_Nelson_funnel01 pointer=0x458 (0x620) embedded string=0x19668 (0x19830)
00000429 40.34095764 [3980] DMG_Col_NBB_Nelson_mast pointer=0x45C (0x624) embedded string=0x1951C (0x196E4)
00000430 40.34108353 [3980] DMG_Col_NBB_Nelson_propeller01 pointer=0x460 (0x628) embedded string=0x18F8C (0x19154)
00000431 40.34122086 [3980] DMG_Col_NBB_Nelson_propeller02 pointer=0x464 (0x62C) embedded string=0x18FE0 (0x191A8)
00000432 40.34132767 [3980] DMG_Col_NBB_Nelson_hull pointer=0x468 (0x630) embedded string=0x194F4 (0x196BC)
00000433 40.34144592 [3980] DMG_Col_NBB_Nelson_crane pointer=0x46C (0x634) embedded string=0x19638 (0x19800)
00000434 40.34155655 [3980] DMG_Col_NBB_Nelson_cabin pointer=0x470 (0x638) embedded string=0x195E0 (0x197A8)
00000435 40.34159470 [3980] pointer=0x3AC (0x574) embedded string=0x428 (0x5F0)
00000436 40.34165192 [3980] ref pointer=0x3B0 (0x578) embedded string=0x199F4 (0x19BBC)
00000437 40.34177017 [3980] Reflect_NBB_Nelson_cabin pointer=0x474 (0x63C) embedded string=0x195FC (0x197C4)
00000438 40.34188843 [3980] Reflect_NBB_Nelson_funnel pointer=0x478 (0x640) embedded string=0x19684 (0x1984C)
00000439 40.34199905 [3980] Reflect_NBB_Nelson_hull pointer=0x47C (0x644) embedded string=0x18F5C (0x19124)
00000440 40.34210587 [3980] Reflect_NBB_Nelson_mast pointer=0x480 (0x648) embedded string=0x19534 (0x196FC)
00000441 40.34214401 [3980] pointer=0x3B8 (0x580) embedded string=0x474 (0x63C)
00000442 40.34217453 [3980] pointer=0xB0 (0x278) embedded string=0x38C (0x554)
00000443 40.34221268 [3980] pointer=0xA4 (0x26C) embedded string=0xA8 (0x270)
00000444 40.34225464 [3980] pointer=0x0 (0x1C8) embedded string=0x5C (0x224)
00000445 40.34244919 [3980] Granny Standard Exporter, SDK version 2.8.30.0 pointer=0x484 (0x64C) embedded string=0x199F8 (0x19BC0)
00000446 40.34247208 [3980] pointer=0x4 (0x1CC) embedded string=0x484 (0x64C)
00000447 40.34273529 [3980] E:\SilentHunter5\Versiune\GraficSources\Ships\NBB_ Nelson\NBB_Nelson.max pointer=0x8 (0x1D0) embedded string=0x19A28 (0x19BF0)
00000448 40.34276199 [3980] pointer=0x10 (0x1D8) embedded string=0x4A0 (0x668)
00000449 40.34300613 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ic e\icicles_n.dds pointer=0x4C8 (0x690) embedded string=0x19A70 (0x19C38)
00000450 40.34303284 [3980] pointer=0x4A0 (0x668) embedded string=0x4C8 (0x690)
00000451 40.34327698 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ic e\icicles.dds pointer=0x514 (0x6DC) embedded string=0x19AB4 (0x19C7C)
00000452 40.34330750 [3980] pointer=0x4A4 (0x66C) embedded string=0x514 (0x6DC)
00000453 40.34356689 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ba rci\Boats_normal.dds pointer=0x560 (0x728) embedded string=0x19AF4 (0x19CBC)
00000454 40.34359360 [3980] pointer=0x4A8 (0x670) embedded string=0x560 (0x728)
00000455 40.34384537 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ba rci\boats_ao.dds pointer=0x5AC (0x774) embedded string=0x19B3C (0x19D04)
00000456 40.34387207 [3980] pointer=0x4AC (0x674) embedded string=0x5AC (0x774)
00000457 40.34413528 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ba rci\Boats_texture.dds pointer=0x5F8 (0x7C0) embedded string=0x19B80 (0x19D48)
00000458 40.34416580 [3980] pointer=0x4B0 (0x678) embedded string=0x5F8 (0x7C0)
00000459 40.34443665 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_hull_N02.dds pointer=0x644 (0x80C) embedded string=0x19BC8 (0x19D90)
00000460 40.34446716 [3980] pointer=0x4B4 (0x67C) embedded string=0x644 (0x80C)
00000461 40.34474182 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_hull_T03.dds pointer=0x690 (0x858) embedded string=0x19C14 (0x19DDC)
00000462 40.34476852 [3980] pointer=0x4B8 (0x680) embedded string=0x690 (0x858)
00000463 40.34502411 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_N04.DDS pointer=0x6DC (0x8A4) embedded string=0x19C60 (0x19E28)
00000464 40.34505463 [3980] pointer=0x4BC (0x684) embedded string=0x6DC (0x8A4)
00000465 40.34532928 [3980] E:\SilentHunter5\Versiune\GraficSources\Ships\NBB_ Nelson\NBB_Nelson_AO02.dds pointer=0x728 (0x8F0) embedded string=0x19CA8 (0x19E70)
00000466 40.34536362 [3980] pointer=0x4C0 (0x688) embedded string=0x728 (0x8F0)
00000467 40.34561920 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_T04.dds pointer=0x774 (0x93C) embedded string=0x19CF8 (0x19EC0)
00000468 40.34564590 [3980] pointer=0x4C4 (0x68C) embedded string=0x774 (0x93C)
00000469 40.34568787 [3980] pointer=0x18 (0x1E0) embedded string=0x7C0 (0x988)
00000470 40.34577560 [3980] Standard_3 pointer=0x814 (0x9DC) embedded string=0x197A0 (0x19968)
00000471 40.34579086 [3980] pointer=0x824 (0x9EC) embedded string=0x3C0 (0x588)
00000472 40.34586334 [3980] Blinn pointer=0x840 (0xA08) embedded string=0x1A25C (0x1A424)
00000473 40.34594727 [3980] Max 2.5 Star pointer=0x894 (0xA5C) embedded string=0x1A264 (0x1A42C)
00000474 40.34597397 [3980] pointer=0x8A8 (0xA70) embedded string=0x914 (0xADC)
00000475 40.34601212 [3980] pointer=0x8B0 (0xA78) embedded string=0x974 (0xB3C)
00000476 40.34605408 [3980] pointer=0x9E0 (0xBA8) embedded string=0x1A274 (0x1A43C)
00000477 40.34609222 [3980] pointer=0x8C4 (0xA8C) embedded string=0x9D4 (0xB9C)
00000478 40.34613037 [3980] pointer=0x8C8 (0xA90) embedded string=0x9E4 (0xBAC)
00000479 40.34621429 [3980] Standard pointer=0x8CC (0xA94) embedded string=0x1A278 (0x1A440)
00000480 40.34624100 [3980] pointer=0x828 (0x9F0) embedded string=0x82C (0x9F4)
00000481 40.34627914 [3980] pointer=0x7C0 (0x988) embedded string=0x814 (0x9DC)
00000482 40.34635544 [3980] Map #8 pointer=0xA54 (0xC1C) embedded string=0x1A284 (0x1A44C)
00000483 40.34638214 [3980] pointer=0xA60 (0xC28) embedded string=0x4C8 (0x690)
00000484 40.34641647 [3980] pointer=0xA64 (0xC2C) embedded string=0xE60 (0x1028)
00000485 40.34666061 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ic e\icicles_n.dds pointer=0xAA0 (0xC68) embedded string=0x19A70 (0x19C38)
00000486 40.34689331 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ic e\icicles_n.dds pointer=0xAA4 (0xC6C) embedded string=0x19A70 (0x19C38)
00000487 40.34694290 [3980] Bitmap pointer=0xAB8 (0xC80) embedded string=0x1A438 (0x1A600)
00000488 40.34698105 [3980] pointer=0xA68 (0xC30) embedded string=0xA6C (0xC34)
00000489 40.34702301 [3980] pointer=0x7C4 (0x98C) embedded string=0xA54 (0xC1C)
00000490 40.34709167 [3980] Opac pointer=0xB18 (0xCE0) embedded string=0x1A440 (0x1A608)
00000491 40.34711838 [3980] pointer=0xB24 (0xCEC) embedded string=0x514 (0x6DC)
00000492 40.34715271 [3980] pointer=0xB28 (0xCF0) embedded string=0xE60 (0x1028)
00000493 40.34738922 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ic e\icicles.dds pointer=0xB64 (0xD2C) embedded string=0x19AB4 (0x19C7C)
00000494 40.34761810 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ic e\icicles.dds pointer=0xB68 (0xD30) embedded string=0x19AB4 (0x19C7C)
00000495 40.34766769 [3980] Bitmap pointer=0xB7C (0xD44) embedded string=0x1A438 (0x1A600)
00000496 40.34770584 [3980] pointer=0xB2C (0xCF4) embedded string=0xB30 (0xCF8)
00000497 40.34774399 [3980] pointer=0x7C8 (0x990) embedded string=0xB18 (0xCE0)
00000498 40.34781265 [3980] Ice pointer=0xBDC (0xDA4) embedded string=0x1979C (0x19964)
00000499 40.34783936 [3980] pointer=0xBE8 (0xDB0) embedded string=0x514 (0x6DC)
00000500 40.34786987 [3980] pointer=0xBEC (0xDB4) embedded string=0xE60 (0x1028)
00000501 40.34811020 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ic e\icicles.dds pointer=0xC28 (0xDF0) embedded string=0x19AB4 (0x19C7C)
00000502 40.34833145 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ic e\icicles.dds pointer=0xC2C (0xDF4) embedded string=0x19AB4 (0x19C7C)
00000503 40.34838486 [3980] Bitmap pointer=0xC40 (0xE08) embedded string=0x1A438 (0x1A600)
00000504 40.34842300 [3980] pointer=0xBF0 (0xDB8) embedded string=0xBF4 (0xDBC)
00000505 40.34846115 [3980] pointer=0x7CC (0x994) embedded string=0xBDC (0xDA4)
00000506 40.34852982 [3980] Ice pointer=0xCA0 (0xE68) embedded string=0x1979C (0x19964)
00000507 40.34860229 [3980] Diffuse Color pointer=0xCB8 (0xE80) embedded string=0x1A1C8 (0x1A390)
00000508 40.34864044 [3980] pointer=0xCBC (0xE84) embedded string=0xBDC (0xDA4)
00000509 40.34872055 [3980] Opacity pointer=0xCC0 (0xE88) embedded string=0x19D90 (0x19F58)
00000510 40.34874725 [3980] pointer=0xCC4 (0xE8C) embedded string=0xB18 (0xCE0)
00000511 40.34881592 [3980] Bump pointer=0xCC8 (0xE90) embedded string=0x1A448 (0x1A610)
00000512 40.34884262 [3980] pointer=0xCCC (0xE94) embedded string=0xA54 (0xC1C)
00000513 40.34888077 [3980] pointer=0xCA8 (0xE70) embedded string=0xCB8 (0xE80)
00000514 40.34891129 [3980] pointer=0xCB0 (0xE78) embedded string=0x3C0 (0x588)
00000515 40.34898376 [3980] Blinn pointer=0xCE4 (0xEAC) embedded string=0x1A25C (0x1A424)
00000516 40.34905243 [3980] Max 2.5 Star pointer=0xD38 (0xF00) embedded string=0x1A264 (0x1A42C)
00000517 40.34909058 [3980] pointer=0xD4C (0xF14) embedded string=0xDB8 (0xF80)
00000518 40.34913254 [3980] pointer=0xD54 (0xF1C) embedded string=0xE18 (0xFE0)
00000519 40.34917068 [3980] pointer=0xE84 (0x104C) embedded string=0x1A274 (0x1A43C)
00000520 40.34921265 [3980] pointer=0xD68 (0xF30) embedded string=0xE78 (0x1040)
00000521 40.34924698 [3980] pointer=0xD6C (0xF34) embedded string=0xE88 (0x1050)
00000522 40.34931946 [3980] Standard pointer=0xD70 (0xF38) embedded string=0x1A278 (0x1A440)
00000523 40.34935760 [3980] pointer=0xCB4 (0xE7C) embedded string=0xCD0 (0xE98)
00000524 40.34939575 [3980] pointer=0x7D0 (0x998) embedded string=0xCA0 (0xE68)
00000525 40.34947205 [3980] Map #7 pointer=0xEF8 (0x10C0) embedded string=0x1A450 (0x1A618)
00000526 40.34949875 [3980] pointer=0xF04 (0x10CC) embedded string=0x560 (0x728)
00000527 40.34952927 [3980] pointer=0xF08 (0x10D0) embedded string=0xE60 (0x1028)
00000528 40.34978867 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ba rci\Boats_normal.dds pointer=0xF44 (0x110C) embedded string=0x19AF4 (0x19CBC)
00000529 40.35004044 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ba rci\Boats_normal.dds pointer=0xF48 (0x1110) embedded string=0x19AF4 (0x19CBC)
00000530 40.35009003 [3980] Bitmap pointer=0xF5C (0x1124) embedded string=0x1A438 (0x1A600)
00000531 40.35012817 [3980] pointer=0xF0C (0x10D4) embedded string=0xF10 (0x10D8)
00000532 40.35016632 [3980] pointer=0x7D4 (0x99C) embedded string=0xEF8 (0x10C0)
00000533 40.35025024 [3980] Boats_tex pointer=0xFBC (0x1184) embedded string=0x1A458 (0x1A620)
00000534 40.35038376 [3980] Additional Bumpmap pointer=0xFD4 (0x119C) embedded string=0x1A464 (0x1A62C)
00000535 40.35040665 [3980] pointer=0xFD8 (0x11A0) embedded string=0xEF8 (0x10C0)
00000536 40.35056686 [3980] pointer=0xFC4 (0x118C) embedded string=0xFD4 (0x119C)
00000537 40.35059357 [3980] pointer=0xFCC (0x1194) embedded string=0x12A0 (0x1468)
00000538 40.35069656 [3980] Normal Bump pointer=0xFFC (0x11C4) embedded string=0x1A4D4 (0x1A69C)
00000539 40.35072327 [3980] pointer=0xFD0 (0x1198) embedded string=0xFDC (0x11A4)
00000540 40.35076141 [3980] pointer=0x7D8 (0x9A0) embedded string=0xFBC (0x1184)
00000541 40.35083771 [3980] Map #5 pointer=0x1000 (0x11C8) embedded string=0x1A4E0 (0x1A6A8)
00000542 40.35086441 [3980] pointer=0x100C (0x11D4) embedded string=0x5AC (0x774)
00000543 40.35089874 [3980] pointer=0x1010 (0x11D8) embedded string=0xE60 (0x1028)
00000544 40.35114670 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ba rci\boats_ao.dds pointer=0x104C (0x1214) embedded string=0x19B3C (0x19D04)
00000545 40.35138702 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ba rci\boats_ao.dds pointer=0x1050 (0x1218) embedded string=0x19B3C (0x19D04)
00000546 40.35143661 [3980] Bitmap pointer=0x1064 (0x122C) embedded string=0x1A438 (0x1A600)
00000547 40.35147476 [3980] pointer=0x1014 (0x11DC) embedded string=0x1018 (0x11E0)
00000548 40.35151672 [3980] pointer=0x7DC (0x9A4) embedded string=0x1000 (0x11C8)
00000549 40.35159302 [3980] Map #4 pointer=0x10C4 (0x128C) embedded string=0x1A4E8 (0x1A6B0)
00000550 40.35161972 [3980] pointer=0x10D0 (0x1298) embedded string=0x5F8 (0x7C0)
00000551 40.35165024 [3980] pointer=0x10D4 (0x129C) embedded string=0xE60 (0x1028)
00000552 40.35191727 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ba rci\Boats_texture.dds pointer=0x1110 (0x12D8) embedded string=0x19B80 (0x19D48)
00000553 40.35216904 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Ba rci\Boats_texture.dds pointer=0x1114 (0x12DC) embedded string=0x19B80 (0x19D48)
00000554 40.35221863 [3980] Bitmap pointer=0x1128 (0x12F0) embedded string=0x1A438 (0x1A600)
00000555 40.35225677 [3980] pointer=0x10D8 (0x12A0) embedded string=0x10DC (0x12A4)
00000556 40.35229874 [3980] pointer=0x7E0 (0x9A8) embedded string=0x10C4 (0x128C)
00000557 40.35237503 [3980] Boats pointer=0x1188 (0x1350) embedded string=0x19788 (0x19950)
00000558 40.35245514 [3980] Diffuse Color pointer=0x11A0 (0x1368) embedded string=0x1A1C8 (0x1A390)
00000559 40.35248566 [3980] pointer=0x11A4 (0x136C) embedded string=0x10C4 (0x128C)
00000560 40.35259247 [3980] Self-Illumination pointer=0x11A8 (0x1370) embedded string=0x1A4F0 (0x1A6B8)
00000561 40.35261917 [3980] pointer=0x11AC (0x1374) embedded string=0x1000 (0x11C8)
00000562 40.35267258 [3980] Bump pointer=0x11B0 (0x1378) embedded string=0x1A448 (0x1A610)
00000563 40.35271454 [3980] pointer=0x11B4 (0x137C) embedded string=0xFBC (0x1184)
00000564 40.35275269 [3980] pointer=0x1190 (0x1358) embedded string=0x11A0 (0x1368)
00000565 40.35278320 [3980] pointer=0x1198 (0x1360) embedded string=0x3C0 (0x588)
00000566 40.35284805 [3980] Blinn pointer=0x11CC (0x1394) embedded string=0x1A25C (0x1A424)
00000567 40.35292435 [3980] Max 2.5 Star pointer=0x1220 (0x13E8) embedded string=0x1A264 (0x1A42C)
00000568 40.35296631 [3980] pointer=0x1234 (0x13FC) embedded string=0x12A0 (0x1468)
00000569 40.35300446 [3980] pointer=0x123C (0x1404) embedded string=0x1300 (0x14C8)
00000570 40.35304260 [3980] pointer=0x136C (0x1534) embedded string=0x1A274 (0x1A43C)
00000571 40.35308456 [3980] pointer=0x1250 (0x1418) embedded string=0x1360 (0x1528)
00000572 40.35312271 [3980] pointer=0x1254 (0x141C) embedded string=0x1370 (0x1538)
00000573 40.35319138 [3980] Standard pointer=0x1258 (0x1420) embedded string=0x1A278 (0x1A440)
00000574 40.35323334 [3980] pointer=0x119C (0x1364) embedded string=0x11B8 (0x1380)
00000575 40.35327148 [3980] pointer=0x7E4 (0x9AC) embedded string=0x1188 (0x1350)
00000576 40.35333252 [3980] DMG pointer=0x13E0 (0x15A8) embedded string=0x19784 (0x1994C)
00000577 40.35336304 [3980] pointer=0x13F0 (0x15B8) embedded string=0x3C0 (0x588)
00000578 40.35342407 [3980] Blinn pointer=0x140C (0x15D4) embedded string=0x1A25C (0x1A424)
00000579 40.35350037 [3980] Max 2.5 Star pointer=0x1460 (0x1628) embedded string=0x1A264 (0x1A42C)
00000580 40.35354233 [3980] pointer=0x1474 (0x163C) embedded string=0x14E0 (0x16A8)
00000581 40.35358047 [3980] pointer=0x147C (0x1644) embedded string=0x1540 (0x1708)
00000582 40.35361862 [3980] pointer=0x15AC (0x1774) embedded string=0x1A274 (0x1A43C)
00000583 40.35366058 [3980] pointer=0x1490 (0x1658) embedded string=0x15A0 (0x1768)
00000584 40.35369873 [3980] pointer=0x1494 (0x165C) embedded string=0x15B0 (0x1778)
00000585 40.35376358 [3980] Standard pointer=0x1498 (0x1660) embedded string=0x1A278 (0x1A440)
00000586 40.35380554 [3980] pointer=0x13F4 (0x15BC) embedded string=0x13F8 (0x15C0)
00000587 40.35384750 [3980] pointer=0x7E8 (0x9B0) embedded string=0x13E0 (0x15A8)
00000588 40.35402679 [3980] NM pointer=0x1620 (0x17E8) embedded string=0x1A504 (0x1A6CC)
00000589 40.35407639 [3980] pointer=0x162C (0x17F4) embedded string=0x644 (0x80C)
00000590 40.35408783 [3980] pointer=0x1630 (0x17F8) embedded string=0xE60 (0x1028)
00000591 40.35436630 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_hull_N02.dds pointer=0x166C (0x1834) embedded string=0x19BC8 (0x19D90)
00000592 40.35462570 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_hull_N02.dds pointer=0x1670 (0x1838) embedded string=0x19BC8 (0x19D90)
00000593 40.35467529 [3980] Bitmap pointer=0x1684 (0x184C) embedded string=0x1A438 (0x1A600)
00000594 40.35471344 [3980] pointer=0x1634 (0x17FC) embedded string=0x1638 (0x1800)
00000595 40.35475540 [3980] pointer=0x7EC (0x9B4) embedded string=0x1620 (0x17E8)
00000596 40.35482407 [3980] NM pointer=0x16E4 (0x18AC) embedded string=0x1A504 (0x1A6CC)
00000597 40.35491943 [3980] Additional Bumpmap pointer=0x16FC (0x18C4) embedded string=0x1A464 (0x1A62C)
00000598 40.35494614 [3980] pointer=0x1700 (0x18C8) embedded string=0x1620 (0x17E8)
00000599 40.35498428 [3980] pointer=0x16EC (0x18B4) embedded string=0x16FC (0x18C4)
00000600 40.35501862 [3980] pointer=0x16F4 (0x18BC) embedded string=0x12A0 (0x1468)
00000601 40.35511017 [3980] Normal Bump pointer=0x1724 (0x18EC) embedded string=0x1A4D4 (0x1A69C)
00000602 40.35513687 [3980] pointer=0x16F8 (0x18C0) embedded string=0x1704 (0x18CC)
00000603 40.35517883 [3980] pointer=0x7F0 (0x9B8) embedded string=0x16E4 (0x18AC)
00000604 40.35523987 [3980] AO pointer=0x1728 (0x18F0) embedded string=0x19790 (0x19958)
00000605 40.35527039 [3980] pointer=0x1734 (0x18FC) embedded string=0x728 (0x8F0)
00000606 40.35530090 [3980] pointer=0x1738 (0x1900) embedded string=0xE60 (0x1028)
00000607 40.35557938 [3980] E:\SilentHunter5\Versiune\GraficSources\Ships\NBB_ Nelson\NBB_Nelson_AO02.dds pointer=0x1774 (0x193C) embedded string=0x19CA8 (0x19E70)
00000608 40.35584259 [3980] E:\SilentHunter5\Versiune\GraficSources\Ships\NBB_ Nelson\NBB_Nelson_AO02.dds pointer=0x1778 (0x1940) embedded string=0x19CA8 (0x19E70)
00000609 40.35589600 [3980] Bitmap pointer=0x178C (0x1954) embedded string=0x1A438 (0x1A600)
00000610 40.35593414 [3980] pointer=0x173C (0x1904) embedded string=0x1740 (0x1908)
00000611 40.35597610 [3980] pointer=0x7F4 (0x9BC) embedded string=0x1728 (0x18F0)
00000612 40.35605240 [3980] Diffuse pointer=0x17EC (0x19B4) embedded string=0x19794 (0x1995C)
00000613 40.35607910 [3980] pointer=0x17F8 (0x19C0) embedded string=0x690 (0x858)
00000614 40.35611343 [3980] pointer=0x17FC (0x19C4) embedded string=0xE60 (0x1028)
00000615 40.35638428 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_hull_T03.dds pointer=0x1838 (0x1A00) embedded string=0x19C14 (0x19DDC)
00000616 40.35663605 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_hull_T03.dds pointer=0x183C (0x1A04) embedded string=0x19C14 (0x19DDC)
00000617 40.35668945 [3980] Bitmap pointer=0x1850 (0x1A18) embedded string=0x1A438 (0x1A600)
00000618 40.35673141 [3980] pointer=0x1800 (0x19C8) embedded string=0x1804 (0x19CC)
00000619 40.35677338 [3980] pointer=0x7F8 (0x9C0) embedded string=0x17EC (0x19B4)
00000620 40.35686493 [3980] cfg#TXR_Chila pointer=0x18B0 (0x1A78) embedded string=0x1A508 (0x1A6D0)
00000621 40.35695267 [3980] Diffuse Color pointer=0x18C8 (0x1A90) embedded string=0x1A1C8 (0x1A390)
00000622 40.35697556 [3980] pointer=0x18CC (0x1A94) embedded string=0x17EC (0x19B4)
00000623 40.35708618 [3980] Self-Illumination pointer=0x18D0 (0x1A98) embedded string=0x1A4F0 (0x1A6B8)
00000624 40.35711670 [3980] pointer=0x18D4 (0x1A9C) embedded string=0x1728 (0x18F0)
00000625 40.35717392 [3980] Bump pointer=0x18D8 (0x1AA0) embedded string=0x1A448 (0x1A610)
00000626 40.35721207 [3980] pointer=0x18DC (0x1AA4) embedded string=0x16E4 (0x18AC)
00000627 40.35725403 [3980] pointer=0x18B8 (0x1A80) embedded string=0x18C8 (0x1A90)
00000628 40.35728455 [3980] pointer=0x18C0 (0x1A88) embedded string=0x3C0 (0x588)
00000629 40.35734940 [3980] Blinn pointer=0x18F4 (0x1ABC) embedded string=0x1A25C (0x1A424)
00000630 40.35744095 [3980] Max 2.5 Star pointer=0x1948 (0x1B10) embedded string=0x1A264 (0x1A42C)
00000631 40.35746384 [3980] pointer=0x195C (0x1B24) embedded string=0x19C8 (0x1B90)
00000632 40.35750198 [3980] pointer=0x1964 (0x1B2C) embedded string=0x1A28 (0x1BF0)
00000633 40.35754395 [3980] pointer=0x1A94 (0x1C5C) embedded string=0x1A274 (0x1A43C)
00000634 40.35758591 [3980] pointer=0x1978 (0x1B40) embedded string=0x1A88 (0x1C50)
00000635 40.35762405 [3980] pointer=0x197C (0x1B44) embedded string=0x1A98 (0x1C60)
00000636 40.35770416 [3980] Standard pointer=0x1980 (0x1B48) embedded string=0x1A278 (0x1A440)
00000637 40.35773087 [3980] pointer=0x18C4 (0x1A8C) embedded string=0x18E0 (0x1AA8)
00000638 40.35777283 [3980] pointer=0x7FC (0x9C4) embedded string=0x18B0 (0x1A78)
00000639 40.35783386 [3980] NM pointer=0x1B08 (0x1CD0) embedded string=0x1A504 (0x1A6CC)
00000640 40.35786438 [3980] pointer=0x1B14 (0x1CDC) embedded string=0x6DC (0x8A4)
00000641 40.35789490 [3980] pointer=0x1B18 (0x1CE0) embedded string=0xE60 (0x1028)
00000642 40.35815048 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_N04.DDS pointer=0x1B54 (0x1D1C) embedded string=0x19C60 (0x19E28)
00000643 40.35839844 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_N04.DDS pointer=0x1B58 (0x1D20) embedded string=0x19C60 (0x19E28)
00000644 40.35844803 [3980] Bitmap pointer=0x1B6C (0x1D34) embedded string=0x1A438 (0x1A600)
00000645 40.35848618 [3980] pointer=0x1B1C (0x1CE4) embedded string=0x1B20 (0x1CE8)
00000646 40.35852814 [3980] pointer=0x800 (0x9C8) embedded string=0x1B08 (0x1CD0)
00000647 40.35859680 [3980] NM pointer=0x1BCC (0x1D94) embedded string=0x1A504 (0x1A6CC)
00000648 40.35868835 [3980] Additional Bumpmap pointer=0x1BE4 (0x1DAC) embedded string=0x1A464 (0x1A62C)
00000649 40.35871887 [3980] pointer=0x1BE8 (0x1DB0) embedded string=0x1B08 (0x1CD0)
00000650 40.35875702 [3980] pointer=0x1BD4 (0x1D9C) embedded string=0x1BE4 (0x1DAC)
00000651 40.35878754 [3980] pointer=0x1BDC (0x1DA4) embedded string=0x12A0 (0x1468)
00000652 40.35887909 [3980] Normal Bump pointer=0x1C0C (0x1DD4) embedded string=0x1A4D4 (0x1A69C)
00000653 40.35890579 [3980] pointer=0x1BE0 (0x1DA8) embedded string=0x1BEC (0x1DB4)
00000654 40.35894775 [3980] pointer=0x804 (0x9CC) embedded string=0x1BCC (0x1D94)
00000655 40.35900879 [3980] AO pointer=0x1C10 (0x1DD8) embedded string=0x19790 (0x19958)
00000656 40.35903931 [3980] pointer=0x1C1C (0x1DE4) embedded string=0x728 (0x8F0)
00000657 40.35906982 [3980] pointer=0x1C20 (0x1DE8) embedded string=0xE60 (0x1028)
00000658 40.35934067 [3980] E:\SilentHunter5\Versiune\GraficSources\Ships\NBB_ Nelson\NBB_Nelson_AO02.dds pointer=0x1C5C (0x1E24) embedded string=0x19CA8 (0x19E70)
00000659 40.35961151 [3980] E:\SilentHunter5\Versiune\GraficSources\Ships\NBB_ Nelson\NBB_Nelson_AO02.dds pointer=0x1C60 (0x1E28) embedded string=0x19CA8 (0x19E70)
00000660 40.35966492 [3980] Bitmap pointer=0x1C74 (0x1E3C) embedded string=0x1A438 (0x1A600)
00000661 40.35969925 [3980] pointer=0x1C24 (0x1DEC) embedded string=0x1C28 (0x1DF0)
00000662 40.35974121 [3980] pointer=0x808 (0x9D0) embedded string=0x1C10 (0x1DD8)
00000663 40.36016464 [3980] Diffuse pointer=0x1CD4 (0x1E9C) embedded string=0x19794 (0x1995C)
00000664 40.36019516 [3980] pointer=0x1CE0 (0x1EA8) embedded string=0x774 (0x93C)
00000665 40.36022568 [3980] pointer=0x1CE4 (0x1EAC) embedded string=0xE60 (0x1028)
00000666 40.36048508 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_T04.dds pointer=0x1D20 (0x1EE8) embedded string=0x19CF8 (0x19EC0)
00000667 40.36073303 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_T04.dds pointer=0x1D24 (0x1EEC) embedded string=0x19CF8 (0x19EC0)
00000668 40.36078262 [3980] Bitmap pointer=0x1D38 (0x1F00) embedded string=0x1A438 (0x1A600)
00000669 40.36082458 [3980] pointer=0x1CE8 (0x1EB0) embedded string=0x1CEC (0x1EB4)
00000670 40.36086273 [3980] pointer=0x80C (0x9D4) embedded string=0x1CD4 (0x1E9C)
00000671 40.36097717 [3980] cfg#TXR_Structuri pointer=0x1D98 (0x1F60) embedded string=0x1A518 (0x1A6E0)
00000672 40.36106110 [3980] Diffuse Color pointer=0x1DB0 (0x1F78) embedded string=0x1A1C8 (0x1A390)
00000673 40.36108780 [3980] pointer=0x1DB4 (0x1F7C) embedded string=0x1CD4 (0x1E9C)
00000674 40.36119461 [3980] Self-Illumination pointer=0x1DB8 (0x1F80) embedded string=0x1A4F0 (0x1A6B8)
00000675 40.36122131 [3980] pointer=0x1DBC (0x1F84) embedded string=0x1C10 (0x1DD8)
00000676 40.36130524 [3980] Bump pointer=0x1DC0 (0x1F88) embedded string=0x1A448 (0x1A610)
00000677 40.36132050 [3980] pointer=0x1DC4 (0x1F8C) embedded string=0x1BCC (0x1D94)
00000678 40.36136246 [3980] pointer=0x1DA0 (0x1F68) embedded string=0x1DB0 (0x1F78)
00000679 40.36139297 [3980] pointer=0x1DA8 (0x1F70) embedded string=0x3C0 (0x588)
00000680 40.36146927 [3980] Blinn pointer=0x1DDC (0x1FA4) embedded string=0x1A25C (0x1A424)
00000681 40.36154556 [3980] Max 2.5 Star pointer=0x1E30 (0x1FF8) embedded string=0x1A264 (0x1A42C)
00000682 40.36157608 [3980] pointer=0x1E44 (0x200C) embedded string=0x1EB0 (0x2078)
00000683 40.36161423 [3980] pointer=0x1E4C (0x2014) embedded string=0x1F10 (0x20D8)
00000684 40.36165619 [3980] pointer=0x1F7C (0x2144) embedded string=0x1A274 (0x1A43C)
00000685 40.36169434 [3980] pointer=0x1E60 (0x2028) embedded string=0x1F70 (0x2138)
00000686 40.36173248 [3980] pointer=0x1E64 (0x202C) embedded string=0x1F80 (0x2148)
00000687 40.36181259 [3980] Standard pointer=0x1E68 (0x2030) embedded string=0x1A278 (0x1A440)
00000688 40.36184311 [3980] pointer=0x1DAC (0x1F74) embedded string=0x1DC8 (0x1F90)
00000689 40.36188126 [3980] pointer=0x810 (0x9D8) embedded string=0x1D98 (0x1F60)
00000690 40.36191940 [3980] pointer=0x20 (0x1E8) embedded string=0x1FF0 (0x21B8)
00000691 40.36200714 [3980] NBB_Nelson pointer=0x1FF4 (0x21BC) embedded string=0x18F40 (0x19108)
00000692 40.36207199 [3980] NBB_Nelson pointer=0x200C (0x21D4) embedded string=0x18F40 (0x19108)
00000693 40.36209869 [3980] pointer=0x209C (0x2264) embedded string=0x13E0 (0x15A8)
00000694 40.36213684 [3980] pointer=0x59A4 (0x5B6C) embedded string=0x1A274 (0x1A43C)
00000695 40.36217880 [3980] pointer=0x59A8 (0x5B70) embedded string=0x1A6A4 (0x1A86C)
00000696 40.36222076 [3980] pointer=0x20A0 (0x2268) embedded string=0x59A4 (0x5B6C)
00000697 40.36231613 [3980] NBB_Nelson_hull pointer=0x20A4 (0x226C) embedded string=0x18F4C (0x19114)
00000698 40.36233902 [3980] pointer=0x2134 (0x22FC) embedded string=0x1700 (0x18C8)
00000699 40.36237717 [3980] pointer=0x5AF4 (0x5CBC) embedded string=0x1A274 (0x1A43C)
00000700 40.36251068 [3980] MapChannel:2 = -none-
00000701 40.36251068 [3980] pointer=0x5BC4 (0x5D8C) embedded string=0x1AFDC (0x1B1A4)
00000702 40.36253738 [3980] pointer=0x5BC8 (0x5D90) embedded string=0x1AFF4 (0x1B1BC)
00000703 40.36257935 [3980] pointer=0x2138 (0x2300) embedded string=0x59B8 (0x5B80)
00000704 40.36270142 [3980] Reflect_NBB_Nelson_hull pointer=0x213C (0x2304) embedded string=0x18F5C (0x19124)
00000705 40.36272049 [3980] pointer=0x21CC (0x2394) embedded string=0x1700 (0x18C8)
00000706 40.36276245 [3980] pointer=0x5D14 (0x5EDC) embedded string=0x1A274 (0x1A43C)
00000707 40.36289215 [3980] MapChannel:2 = -none-
00000708 40.36289215 [3980] pointer=0x5DE4 (0x5FAC) embedded string=0x1AFDC (0x1B1A4)
00000709 40.36293030 [3980] [ pointer=0x5DE8 (0x5FB0) embedded string=0x1B008 (0x1B1D0)
00000710 40.36296844 [3980] pointer=0x21D0 (0x2398) embedded string=0x5BD8 (0x5DA0)
00000711 40.36307144 [3980] NBB_Nelson_siajB pointer=0x21D4 (0x239C) embedded string=0x1901C (0x191E4)
00000712 40.36308670 [3980] pointer=0x2264 (0x242C) embedded string=0x13E0 (0x15A8)
00000713 40.36312866 [3980] pointer=0x5DF8 (0x5FC0) embedded string=0x1A274 (0x1A43C)
00000714 40.36317062 [3980] pointer=0x5DFC (0x5FC4) embedded string=0x1B01C (0x1B1E4)
00000715 40.36320877 [3980] pointer=0x2268 (0x2430) embedded string=0x5DF8 (0x5FC0)
00000716 40.36331177 [3980] NBB_Nelson_siajF pointer=0x226C (0x2434) embedded string=0x19030 (0x191F8)
00000717 40.36333466 [3980] pointer=0x22FC (0x24C4) embedded string=0x13E0 (0x15A8)
00000718 40.36337662 [3980] pointer=0x5E0C (0x5FD4) embedded string=0x1A274 (0x1A43C)
00000719 40.36341476 [3980] pointer=0x5E10 (0x5FD8) embedded string=0x1B030 (0x1B1F8)
00000720 40.36345291 [3980] pointer=0x2300 (0x24C8) embedded string=0x5E0C (0x5FD4)
00000721 40.36356354 [3980] NBB_Nelson_siajF2 pointer=0x2304 (0x24CC) embedded string=0x19044 (0x1920C)
00000722 40.36357880 [3980] pointer=0x2394 (0x255C) embedded string=0x13E0 (0x15A8)
00000723 40.36362076 [3980] pointer=0x5E20 (0x5FE8) embedded string=0x1A274 (0x1A43C)
00000724 40.36366272 [3980] pointer=0x5E24 (0x5FEC) embedded string=0x1B044 (0x1B20C)
00000725 40.36370468 [3980] pointer=0x2398 (0x2560) embedded string=0x5E20 (0x5FE8)
00000726 40.36380768 [3980] cfg#FLG_NBB_Nelson pointer=0x239C (0x2564) embedded string=0x19058 (0x19220)
00000727 40.36382675 [3980] pointer=0x242C (0x25F4) embedded string=0x13E0 (0x15A8)
00000728 40.36386871 [3980] pointer=0x5E34 (0x5FFC) embedded string=0x1A274 (0x1A43C)
00000729 40.36390686 [3980] pointer=0x5E38 (0x6000) embedded string=0x1B058 (0x1B220)
00000730 40.36394501 [3980] pointer=0x2430 (0x25F8) embedded string=0x5E34 (0x5FFC)
00000731 40.36405945 [3980] cfg#M01_NBB_Nelson pointer=0x2434 (0x25FC) embedded string=0x1909C (0x19264)
00000732 40.36407852 [3980] pointer=0x24C4 (0x268C) embedded string=0x13E0 (0x15A8)
00000733 40.36411667 [3980] pointer=0x5E48 (0x6010) embedded string=0x1A274 (0x1A43C)
00000734 40.36415863 [3980] pointer=0x5E4C (0x6014) embedded string=0x1B06C (0x1B234)
00000735 40.36419678 [3980] pointer=0x24C8 (0x2690) embedded string=0x5E48 (0x6010)
00000736 40.36430359 [3980] cfg#M02_NBB_Nelson pointer=0x24CC (0x2694) embedded string=0x190B0 (0x19278)
00000737 40.36432648 [3980] pointer=0x255C (0x2724) embedded string=0x13E0 (0x15A8)
00000738 40.36436844 [3980] pointer=0x5E5C (0x6024) embedded string=0x1A274 (0x1A43C)
00000739 40.36440659 [3980] pointer=0x5E60 (0x6028) embedded string=0x1B080 (0x1B248)
00000740 40.36444473 [3980] pointer=0x2560 (0x2728) embedded string=0x5E5C (0x6024)
00000741 40.36455917 [3980] cfg#M03_NBB_Nelson pointer=0x2564 (0x272C) embedded string=0x190C4 (0x1928C)
00000742 40.36457825 [3980] pointer=0x25F4 (0x27BC) embedded string=0x13E0 (0x15A8)
00000743 40.36462021 [3980] pointer=0x5E70 (0x6038) embedded string=0x1A274 (0x1A43C)
00000744 40.36465836 [3980] pointer=0x5E74 (0x603C) embedded string=0x1B094 (0x1B25C)
00000745 40.36469650 [3980] pointer=0x25F8 (0x27C0) embedded string=0x5E70 (0x6038)
00000746 40.36480713 [3980] cfg#S01_NBB_Nelson pointer=0x25FC (0x27C4) embedded string=0x190D8 (0x192A0)
00000747 40.36482620 [3980] pointer=0x268C (0x2854) embedded string=0x13E0 (0x15A8)
00000748 40.36486435 [3980] pointer=0x5E84 (0x604C) embedded string=0x1A274 (0x1A43C)
00000749 40.36490250 [3980] pointer=0x5E88 (0x6050) embedded string=0x1B0A8 (0x1B270)
00000750 40.36494446 [3980] pointer=0x2690 (0x2858) embedded string=0x5E84 (0x604C)
00000751 40.36505127 [3980] cfg#S02_NBB_Nelson pointer=0x2694 (0x285C) embedded string=0x190EC (0x192B4)
00000752 40.36507034 [3980] pointer=0x2724 (0x28EC) embedded string=0x13E0 (0x15A8)
00000753 40.36511230 [3980] pointer=0x5E98 (0x6060) embedded string=0x1A274 (0x1A43C)
00000754 40.36515045 [3980] pointer=0x5E9C (0x6064) embedded string=0x1B0BC (0x1B284)
00000755 40.36519241 [3980] pointer=0x2728 (0x28F0) embedded string=0x5E98 (0x6060)
00000756 40.36532593 [3980] cfg#S03_NBB_Nelson pointer=0x272C (0x28F4) embedded string=0x19100 (0x192C8)
00000757 40.36534119 [3980] pointer=0x27BC (0x2984) embedded string=0x13E0 (0x15A8)
00000758 40.36539841 [3980] pointer=0x5EAC (0x6074) embedded string=0x1A274 (0x1A43C)
00000759 40.36542892 [3980] pointer=0x5EB0 (0x6078) embedded string=0x1B0D0 (0x1B298)
00000760 40.36546707 [3980] pointer=0x27C0 (0x2988) embedded string=0x5EAC (0x6074)
00000761 40.36557770 [3980] cfg#S04_NBB_Nelson pointer=0x27C4 (0x298C) embedded string=0x19114 (0x192DC)
00000762 40.36561584 [3980] pointer=0x2854 (0x2A1C) embedded string=0x13E0 (0x15A8)
00000763 40.36578369 [3980] pointer=0x5EC0 (0x6088) embedded string=0x1A274 (0x1A43C)
00000764 40.36581421 [3980] pointer=0x5EC4 (0x608C) embedded string=0x1B0E4 (0x1B2AC)
00000765 40.36585617 [3980] pointer=0x2858 (0x2A20) embedded string=0x5EC0 (0x6088)
00000766 40.36597824 [3980] cfg#S05_NBB_Nelson pointer=0x285C (0x2A24) embedded string=0x19128 (0x192F0)
00000767 40.36599731 [3980] pointer=0x28EC (0x2AB4) embedded string=0x13E0 (0x15A8)
00000768 40.36603928 [3980] pointer=0x5ED4 (0x609C) embedded string=0x1A274 (0x1A43C)
00000769 40.36607742 [3980] pointer=0x5ED8 (0x60A0) embedded string=0x1B0F8 (0x1B2C0)
00000770 40.36611557 [3980] pointer=0x28F0 (0x2AB8) embedded string=0x5ED4 (0x609C)
00000771 40.36622620 [3980] cfg#S06_NBB_Nelson pointer=0x28F4 (0x2ABC) embedded string=0x1913C (0x19304)
00000772 40.36624908 [3980] pointer=0x2984 (0x2B4C) embedded string=0x13E0 (0x15A8)
00000773 40.36628723 [3980] pointer=0x5EE8 (0x60B0) embedded string=0x1A274 (0x1A43C)
00000774 40.36633301 [3980] pointer=0x5EEC (0x60B4) embedded string=0x1B10C (0x1B2D4)
00000775 40.36637115 [3980] pointer=0x2988 (0x2B50) embedded string=0x5EE8 (0x60B0)
00000776 40.36648178 [3980] cfg#S07_NBB_Nelson pointer=0x298C (0x2B54) embedded string=0x19150 (0x19318)
00000777 40.36649704 [3980] pointer=0x2A1C (0x2BE4) embedded string=0x13E0 (0x15A8)
00000778 40.36653900 [3980] pointer=0x5EFC (0x60C4) embedded string=0x1A274 (0x1A43C)
00000779 40.36660385 [3980] ********* Pointer data value read was blank @ line number 111340 *********
00000780 40.36660385 [3980]
00000781 66.86171722 [3980] ********* Exception occured. Exception is System.ArgumentOutOfRangeException: ***1048;***1085;***1076;***1077;***1082;***1089; ***1079;***1072; ***1087;***1088;***1077;***1076;***1077;***1083;** *1072;***1084;***1080; ***1076;***1080;***1072;***1087;***1072;***1079;** *1086;***1085;***1072;. ***1048;***1085;***1076;***1077;***1082;***1089; ***1076;***1086;***1083;***1078;***1077;***1085; ***1073;***1099;***1090;***1100; ***1087;***1086;***1083;***1086;***1078;***1080;** *1090;***1077;***1083;***1100;***1085;***1099;***1 084; ***1095;***1080;***1089;***1083;***1086;***1084;, ***1072; ***1077;***1075;***1086; ***1088;***1072;***1079;***1084;***1077;***1088; ***1085;***1077; ***1076;***1086;***1083;***1078;***1077;***1085; ***1087;***1088;***1077;***1074;***1099;***1096;** *1072;***1090;***1100; ***1088;***1072;***1079;***1084;***1077;***1088; ***1082;***1086;***1083;***1083;***1077;***1082;** *1094;***1080;***1080;.
00000782 66.86171722 [3980] ***1048;***1084;***1103; ***1087;***1072;***1088;***1072;***1084;***1077;** *1090;***1088;***1072;: index
00000783 66.86171722 [3980] ***1074; System.ThrowHelper.ThrowArgumentOutOfRangeExceptio n(ExceptionArgument argument, ExceptionResource resource)
00000784 66.86171722 [3980] ***1074; System.ThrowHelper.ThrowArgumentOutOfRangeExceptio n()
00000785 66.86171722 [3980] ***1074; System.Collections.Generic.List`1.get_Item(Int32 index)
00000786 66.86171722 [3980] ***1074; TheDarkWraith.SilentHunter5.GR2ArtToolInfo.ReadEle mentsData(GR2EditorViewer& gr2ev, BinaryReader& br, Int32& section0fileoffset, Int32& pointersfileoffset, Int32& numberofpointers, Int32& pointerstartindex, Int32& alignment, Int32& startoftxtdataoffset)
00000787 66.86171722 [3980] ***1074; TheDarkWraith.SilentHunter5.GR2File.ReadData(Devic e& device)
00000788 66.86171722 [3980] ***1074; TheDarkWraith.SilentHunter5.GR2File.ReadAndParseGR 2File(Device& device)
00000789 66.86171722 [3980] ***1074; TheDarkWraith.SilentHunter5.GR2EditorViewer.tsmiFi leOpen_Click(Object sender, EventArgs e) *********
00000790 66.86171722 [3980]
00000791 91.70246124 [3980] D:\GAMES\U-Boats\data\Sea\NBB_Nelson\NBB_Nelson.GR2 closed
00000792 91.70246124 [3980]

Obelix
10-18-11, 09:13 AM
E:\SilentHunter5\Versiune\GraficSources\_common\Ba rci\
But this I do not understand - why is registered this way? Granny Viewer is also trying to find some things along this path.:hmmm:
Or is it creates a virtual drive then?:06:

TheDarkWraith
10-18-11, 09:26 AM
But this I do not understand - why is registered this way? Granny Viewer is also trying to find some things along this path.:hmmm:
Or is it creates a virtual drive then?:06:

Where did this string come from? The from filename?

Obelix
10-18-11, 09:28 AM
Oops!:oops: At the end of the log display the Cyrillic properly. That's what it says:
00000779 40.36660385 [3980] ********* Pointer data value read was blank @ line number 111 340 *********
00000780 40.36660385 [3980]
00000781 66.86171722 [3980] ********* Exception occured. Exception is System.ArgumentOutOfRangeException: Index out of range. The index must be a positive number, and its size should not exceed the size of the collection.
00000782 66.86171722 [3980] Parameter name: index
00000783 66.86171722 [3980] in System.ThrowHelper.ThrowArgumentOutOfRangeExceptio n (ExceptionArgument argument,

Obelix
10-18-11, 09:38 AM
Where did this string come from? The from filename?
I thought from *. GR2 file.
http://www.subsim.com/radioroom/picture.php?albumid=354&pictureid=5029

TheDarkWraith
10-18-11, 09:39 AM
Oops!:oops: At the end of the log display the Cyrillic properly. That's what it says:
00000779 40.36660385 [3980] ********* Pointer data value read was blank @ line number 111 340 *********
00000780 40.36660385 [3980]
00000781 66.86171722 [3980] ********* Exception occured. Exception is System.ArgumentOutOfRangeException: Index out of range. The index must be a positive number, and its size should not exceed the size of the collection.
00000782 66.86171722 [3980] Parameter name: index
00000783 66.86171722 [3980] in System.ThrowHelper.ThrowArgumentOutOfRangeExceptio n (ExceptionArgument argument,

what unit was this?


There is one positive thing from this Undine:

[3172] GR2 file path is C:\Games\Ubisoft\Silent Hunter 5\data\Submarine\NSS_Undine\NSS_Undine.GR2
[3172]
[3172] Current position in file is 0x0
[3172]
[3172] Reading file header data starting at 0x0
[3172] Magic string=)ÞlÀº¤S+%õ·¥öfâî 0x10
[3172] File list start offset (from file beginning)=0x1C8 0x14 where the file list header starts
[3172] Unknown1=0x0 0x18
[3172] Unknown2=0x0 0x1C
[3172] Unknown3=0x0 0x20
[3172] Current position in file is 0x20
[3172]
[3172] Reading info header data starting at 0x20
[3172] File format revision=0x7 0x24
[3172] File size in bytes=1720964 0x28
[3172] CRC value=0xC52FD13B 0x2C
[3172] Bytes from offset to start of sections=0x48 0x30 bytes from start of this to first section
[3172] Number of sections=8 0x34
[3172] Root object type (?)=0x6 0x38
[3172] Root object offset (?)=0x0 0x3C
[3172] Unknown1=0x0 0x40
[3172] Unknown2=0x0 0x44
[3172] Tag=0x80000032 0x48
[3172] Current position in file is 0x68
[3172]
[3172] Reading section 0 (arttoolinfo) data starting at 0x68
[3172] Unknown=0x0 0x6C always 0x0
[3172] Section file offset=0x468C 0x70 where this section starts in the file
[3172] Compressed size=61184 0x74 compressed size and uncompressed sizes should equal for SH5 GR2s
[3172] Uncompressed size=61184 0x78 compressed size and uncompressed sizes should equal for SH5 GR2s
[3172] Alignment=0x4 0x7C what the alignment boundary is in the file
[3172] Start of data fileoffset=0xBD9C 0x80 start of data
[3172] Start of data fileoffset2=0xBD9C 0x84 start of data
[3172] Pointers file offset=0x1C8 0x88 where the pointers for this section are located
[3172] Number of pointers=1467 0x8C
[3172] Pointer to unknown=0x468C 0x90
[3172] Unknown2=0x0 0x94
[3172] Current position in file is 0x94

if you look at section 0 under number of pointers is Pointer to unknown. I now know what this pointer to unknown is! It's the point just after the pointers.....The pointers file offset is 0x1C8. NUmber of pointers is 1467. 1467 * 3 * 4 = 0x44C4. 0x44C4 + 0x1C8 = 0x468C. Exactly where pointer to unknown points :DL

TheDarkWraith
10-18-11, 09:41 AM
I thought from *. GR2 file.
http://www.subsim.com/radioroom/picture.php?albumid=354&pictureid=5029

that is the source file that was used to make this GR2 file. It's not creating any virtual drives or anything. This is just for informational purposes so one can see where the source of this GR2 came from. I'm purely speculating here but it makes perfect sense.

TheDarkWraith
10-18-11, 10:14 AM
wow this Undine has exposed a lot of problems with my code. Things that I thought were at certain places can change based on where the pointers start. Correcting this all now and should have new version available soon :up:

Obelix
10-18-11, 10:18 AM
what unit was this?

It's Nelson, from this post; ***1048;***1085;***1076;***1077;***1082;***1089; ***1079;***1072; ***1087;***1088;***1077;***1076;***1077;***1083;** *1072;***1084;***1080; ***1076;***1080;***1072;***1087;***1072;***1079;** *1086;***1085;***1072;. ***1048;***1085;***1076;***1077;***1082;***1089; ***1076;***1086;***1083;***1078;***1077;***1085; ***1073;***1099;***1090;***1100; ***1087;***1086;***1083;***1086;***1078;***1080;** *1090;***1077;***1083;***1100;***1085;***1099;***1 084; ***1095;***1080;***1089;***1083;***1086;***1084;, ***1072; ***1077;***1075;***1086; ***1088;***1072;***1079;***1084;***1077;***1088; ***1085;***1077; ***1076;***1086;***1083;***1078;***1077;***1085; ***1087;***1088;***1077;***1074;***1099;***1096;** *1072;***1090;***1100; ***1088;***1072;***1079;***1084;***1077;***1088; ***1082;***1086;***1083;***1083;***1077;***1082;** *1094;***1080;***1080;.
00000782 66.86171722 [3980] ***1048;***1084;***1103; ***1087;***1072;***1088;***1072;***1084;***1077;** *1090;***1088;***1072;: index
00000783 66.86171722 [3980] ***1074; System.ThrowHelper.ThrowArgumentOutOfRangeExceptio n(ExceptionArgument argument, ExceptionResource resource)
00000784 66.86171722 [3980] ***1074; System.ThrowHelper.ThrowArgumentOutOfRangeExceptio n()



that is the source file that was used to make this GR2 file. It's not creating any virtual drives or anything. This is just for informational purposes so one can see where the source of this GR2 came from. I'm purely speculating here but it makes perfect sense.
That is, the developers at Ubisoft are not cleaned up for a debris? :D
Then why GR2EditorViewer trying to find something on this path? This is noted in the Log.:06:
00000666 40.36048508 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_T04.dds pointer=0x1D20 (0x1EE8) embedded string=0x19CF8 (0x19EC0)
00000667 40.36073303 [3980] E:\SilentHunter5\Versiune\GraficSources\_common\Te xtures\ship_T04.dds pointer=0x1D24 (0x1EEC) embedded string=0x19CF8 (0x19EC0)

Obelix
10-18-11, 10:35 AM
wow this Undine has exposed a lot of problems with my code. Things that I thought were at certain places can change based on where the pointers start. Correcting this all now and should have new version available soon :up:

Sounds nice!:yeah:

TheDarkWraith
10-18-11, 10:56 AM
Then why GR2EditorViewer trying to find something on this path? This is noted in the Log.:06:

It's not trying to find something from that path. It's stating what the pointer is to that data.

That's more than likely from the embedded strings. There are pointers that point to this data. So what that was telling you is that the pointer located at 0x1D20 (actual file position of 0x1EE8) points to an embedded string. The pointers are confusing at first but when it clicks it all makes perfect sense.

Another strange thing from the Undine:

3D Studio MAX.DocumentContents.Headers.0.1.2.3.4.5.6.7.8.9.1 0.11.12.13.14.15.Elements.Value.

Notice something? There's only one null character per string and it's not aligned as per the stated alignment of the section (section 0). Interesting :hmmm: So now I have to figure out what says ignore alignment when reading embedded strings......

TheDarkWraith
10-18-11, 11:24 AM
okay that part is fixed about the checking to see if alignment needs to be ignored or not on embedded strings. Now I've come across another 'something new' that I need to look into (from Undine):

[4808] FromArtToolName=3D Studio MAX 0x5C (0x46E8) embedded string from 0xC378 (0x10A04)
[4808] ArtToolMajorRevision=10 0x60 (0x46EC)
[4808] ArtToolMinorRevision=0 0x64 (0x46F0)
[4808] ArtToolPointerSize=64 0x68 (0x46F4)
[4808] UnitsPerMeter=0.100000 0x6C (0x46F8)
[4808] Origin=0.000000 0.000000 0.000000 0x70 (0x46FC)
[4808] RightVector=1.000000 0.000000 0.000000 0x7C (0x4708)
[4808] UpVector=0.000000 1.000000 0.000000 0x88 (0x4714)
[4808] BackVector=0.000000 0.000000 -1.000000 0x94 (0x4720)

It's that ArtToolPointerSize=64. Always seen that as 0x0 :hmmm:

TheDarkWraith
10-18-11, 12:35 PM
and another something new for Undine: in granny viewer in ArtToolInfo:ExtendedData there are entries for Selection sets and layers. I'm not looking for those currently and thus is causing problems. Time to add this.

Madox58
10-18-11, 03:40 PM
Nice work so far Mate!
:salute:

Sorry I couldn't help you with the C# stuff.
It's Greek to me.
C is what I work in mostly, without the Net stuff.
So it hurts my head to try to follow along in a useable way.
:88)

I did send a link to a compressed GR2 file so you could see the compressed and non-compressed settings in the Section indexes.

I'll go through some old notes and see if I have some more useable information for you.
I'm sure there's some shoved in a drawer somewhere.
I'm a fantastic note taker, but a terrible note organizer!
I often find notes and wonder WTF they are for!
:haha:

I've been working on the Fast Finder for a different Game.
So most of my time has been spent there.
Thier problem is that all files are stored in a cache area as numbers.
Kind of like a Manifest number, and no extensions!
There are jpg's, png's, gr2's, xml's, and an unknown type slammed into this cache area!
Fast Finder allows one to drag the whole cache into it and then checks the files known headers to determine what is what.
It then allows a double click to open with a known application, saveing the list so one can open it and work as if just scanned, extremely fast file copying if one decides to copy the files to somewhere else, automatic renameing of the files if a list is provided with the number matched to a known 'Actual in Game Name of file', and more.
It also uses a plug-in system so the main application can be expanded in nearly anyway one wishes.

So you can see why I'm not around much right now.
:DL

Regards!!

TheDarkWraith
10-18-11, 06:34 PM
Maybe for people like Obelix you might find this interesting:

Like I posted above there are two new menu entries in Granny Viewer for the Undine: SelectionSets and Layers. I have no clue what their purpose is but regardless of purpose I need to be reading these from the file. So let's dig into this.....

Let's take a look at the first dozen or so pointers and see what's going on. Remember that part of dumb luck that I spoke about some posts back? It deals with how I decoded the pointers. I looked for patterns in them and noticed that every one whose second word (4 bytes) is a 0x6 usually denoted a section, change, or something different. So I set those as one type of pointer. Pointers that referenced embedded strings were type str and those pointers who in turn referenced those pointers were type str_reference. I also defined a type as pointer_data and pointer but I'd have to go back and look in my code to see what determines each. Point is I made a wild guess and it worked. Dumb luck to the extreme. You have the early versions of the source code that shows how I denoted what type of pointer they are. The really funny thing is that I had to include a hack to get some of the pointers to work correctly. And this hack worked also :rotfl2:

Looking at the debug output of the first dozen or so pointers shows:

[1572] Reading file header data starting at 0x0
[1572] Magic string=)ÞlÀº¤S+%õ·¥öfâî 0x10
[1572] Start of file data file offset (from file beginning)=0x1C8 0x14 where the file list header starts
[1572]
[1572] Reading section 0 (arttoolinfo) data starting at 0x68
[1572] Unknown=0x0 0x6C always 0x0
[1572] Section file offset=0x468C 0x70 where this section starts in the file
[1572] Compressed size=61184 0x74 compressed size and uncompressed sizes should equal for SH5 GR2s
[1572] Uncompressed size=61184 0x78 compressed size and uncompressed sizes should equal for SH5 GR2s
[1572] Alignment=0x4 0x7C what the alignment boundary is in the file
[1572] Start of data fileoffset=0xBD9C 0x80 start of data
[1572] Start of data fileoffset2=0xBD9C 0x84 start of data
[1572] Pointers file offset=0x1C8 0x88 where the pointers for this section are located
[1572] Number of pointers=1467 0x8C
[1572] End of pointers file offset=0x468C 0x90
[1572] Unknown2=0x0 0x94
[1572] Current position in file is 0x94
[1572]
[1572] Reading section 1 (vertex_data) data starting at 0x94
[1572] Unknown=0x0 0x98 always 0x0
[1572] Section file offset=0x1358C 0x9C where this section starts in the file
[1572] Compressed size=1368640 0xA0 compressed size and uncompressed sizes should equal for SH5 GR2s
[1572] Uncompressed size=1368640 0xA4 compressed size and uncompressed sizes should equal for SH5 GR2s
[1572] Alignment=0x20 0xA8 what the alignment boundary is in the file
[1572] Start of data fileoffset=0x14E240 0xAC start of data
[1572] Start of data fileoffset2=0x14E240 0xB0 start of data
[1572] Pointers file offset=0x1358C 0xB4 where the pointers for this section are located
[1572] Number of pointers=0 0xB8
[1572] End of pointers file offset=0x1358C 0xBC
[1572] Unknown2=0x0 0xC0

(snip)

[1572] Current position in file is 0xC0
[1572]
[1572] File info offset at 0x8 (0x4694)
[1572] Number of textures=5 0xC (0x4698)
[1572] Number of materials=11 0x14 (0x46A0)
[1572] Number of skeletons=1 0x1C (0x46A8)
[1572] Number of vertex datas=20 0x24 (0x46B0)
[1572] Number of tritopologies=20 0x2C (0x46B8)
[1572] Number of meshes=20 0x34 (0x46C0)
[1572] Number of models=1 0x3C (0x46C8)
[1572] Number of trackgroups=0 0x44 (0x46D0)
[1572] Number of animations=0 0x4C (0x46D8)
[1572] Number of unknown=0 0x54 (0x46E0)
[1572] Current position in file is 0x46E4
[1572] Pointer 0 is type str with offsetinsectiondata of 0x5C (0x46E8) and unknown of 0x0 and offsetinsectionvalue of 0xC378 (0x10A04)
[1572] Pointer 0 updates the pointer to ArtToolInfo:FromArtTooFromName with pointer to embedded string for it

So what do we know? From file header the first section starts at 0x1C8 in the file. Section 0 tells us that the section file offset is at 0x468C and start of pointers is at 0x1C8. So pointers come before data in this file (first thing that tripped me up - all the other GR2 files I've read had data before pointers). There are 1467 pointers for this section and the end of them resides at offset 0x468C. End of pointers equals start of section offset - Check. Let's double check this: file header said first section starts at 0x1C8. Section 0 Pointers start at 0x1C8. Check. There are 1467 pointers that contain 3 words (4 bytes) so 1467 * 3 * 4 = 0x44C4. Start of pointers 0x1C8 + size of pointers 0x44C4 = 0x468C. Section 0 said section file offset is at 0x468C. Check. Section 0 says size of this section is 0xEF00. Section 1 says it starts at 0x1358C. Start of section 1 0x1358C - start of section 0 0x1C8 = 0x133C4. This difference 0x133C4 - size of pointers 0x44C4 = 0xEF00. Check. So with the basic checks out of the way we can proceed.

Ha!! Just had a revelation while typing this! I couldn't figure out what to do with the:
[1572] Start of data fileoffset=0xBD9C 0x80 start of data
[1572] Start of data fileoffset2=0xBD9C 0x84 start of data

Those numbers (0xBD9C) were voodoo to me. But it just hit me after telling you all about the above how to use it! Funny how things work like that. If I take the section start offset 0x468C and add 0xBD9C to it I should be at start of embedded strings (0x10428). Now why I don't have to add the start of section (0x1C8) to this is just a quirk of the GR2 file I guess.....let's take a look:

00010428 41 72 74 54 6F 6F 6C 49 6E 66 6F 00 46 72 6F 6D ArtToolInfo.From
00010438 41 72 74 54 6F 6F 6C 4E 61 6D 65 00 41 72 74 54 ArtToolName.ArtT
00010448 6F 6F 6C 4D 61 6A 6F 72 52 65 76 69 73 69 6F 6E oolMajorRevision
00010458 00 41 72 74 54 6F 6F 6C 4D 69 6E 6F 72 52 65 76 .ArtToolMinorRev
00010468 69 73 69 6F 6E 00 ision.

Yep, confirmed. Cool. Now have to change my code in the way I was retrieving these embedded strings......Thinking back the section start offset is a physical location in the file not an offset. I didn't know if the 0xBD9C was an offset or physical address. Now I know it's an offset. So everything makes sense now as to why I didn't have to add 0x1C8 to the result. Now I have to go and confirm this with other GR2 files....Confirmed. Works like a charm!

[1572] Pointer 0 is type str with offsetinsectiondata of 0x5C (0x46E8) and unknown of 0x0 and offsetinsectionvalue of 0xC378 (0x10A04)
[1572] Pointer 0 updates the pointer to ArtToolInfo:FromArtTooFromName with pointer to embedded string for it

So how do I know this? Let's look at the pointers in a hex editor. Open up the undine GR2 with hex editor. Now section 0 said pointers start at 0x1C8. So let's navigate to 0x1C8.

000001C8 5C 00 00 00 00 00 00 00 78 C3 00 00 \.......x...

the first word (0x5C000000) is what I call offsetinsectiondata. The second word (0x00000000) is what I call unknown. The third word (0x78C30000) is what I call offsetinsectionvalue. You have to remember that these are OFFSETS not physical locations. To get physical location you have to add the section's file offset to it. Those not familiar with reading the Intel hex format will think that the 78C30000 is just that. Incorrect. Intel hex format is little-endian style so you have to read from right to left. The value is actually 0x0000C378 if you wanted to type it into windows calc to get decimal value (50040d). Great, so what does this mean? 0x5C could mean anything right? Yes it could BUT let's set the hex editor at 0xC378 + section 0 section file offset (0x468C). You should have hex editor at 0x10A04. Here's what it shows:

00010A04 33 44 20 53 74 75 64 69 6F 20 4D 41 58 00 44 6F 3D Studio MAX.Do
00010A14 63 75 6D 65 6E 74 43 6F 6E 74 65 6E 74 73 00 48 cumentContents.H
00010A24 65 61 64 65 72 73 00 30 eaders.0

Those not familiar with C or assembly won't recognize the significance of the 00 bytes. Those 00 bytes are null termination characters. They signify the end of a string in C and assembly. If we put this all together then pointer 0 is type of string pointer (str) that points to the embedded string 3D Studio MAX. So some will say big deal, it points to a string. This IS a big deal. It tells us much more than that!!! Fire up RAD Game tools GrannyViewer and open up the undine GR2 file in it. Click the file list tab at the bottom. In the box for undine right click and select View In Detail. What do we see? We see some entries for ArtToolInfo, ExporterInfo, etc. Once again some will say so what? Let's take a deeper look at this. Look at ArtToolInfo once again. Notice the struct * to the left of ArtToolInfo? Those not familiar with C++ won't recognize the significance of the * symbol. This means a pointer to a struct. What this tells me is that if I click the (click to view sub-structure) of ArtToolInfo it's going to tell me the layout for that struct. Let's click it. Hot damn, what do you know :DL We have a perfect definition of this structure. So where does this pointer 0 play into this? Well remember it pointed to an embedded string. The first entry in this new screen in granny is a pointer to a character array (C++ syntax for a string) and what do you know it says "3D Studio MAX". Kinda strange how that is the same value as to what pointer 0 points at isn't it? I'd be willing to bet then that if we set the hex editor at pointer 0's offsetinsectiondata + section 0 section file offset we will find this struct in the file. Let's see. Set hex editor to 0x5C + section 0 section file offset 0x468C. This makes 0x46E8. Let's see what we find:

000046E8 00 00 00 00 0A 00 00 00 00 00 00 00 40 00 00 00 ............@...
000046F8 CD CC CC 3D 00 00 00 00 00 00 00 00 00 00 00 00 ...=............
00004708 00 00 80 3F 00 00 00 00 00 00 00 00 00 00 00 00 ...?............
00004718 00 00 80 3F 00 00 00 00 00 00 00 00 00 00 00 00 ...?............
00004728 00 00 80 BF ....

Jackpot! The first 4 bytes are 0x0 because they are where the pointer to the embedded string "3D Studio MAX" resides. In the programming world pointers are usually 32 bits (4 bytes - 8 bits to a byte). GrannyViewer says next entry should be an int32 (4 bytes) and it describes the ArtToolMajorRevision. Well 0x0A000000 is 10 decimal. GrannyViewer says ArtToolMajorRevision is 10. Voila. That is why I say the GrannyViewer is an SDK of sorts. It tells you everything you need to know to read the GR2 file along with the pointer data. It defines the structures (for the most part, sometimes you have to stumble you way 4-8 bytes here or there to find a item) and within those structures it tells you the data type for each structure member.

If you skip 0x28 bytes from the last 'entry' for ArtToolInfo you will be at ArtToolInfo:ExtendedData:DocumentContents:Headers in GrannyViewer. It's this skipping of 0x28 - 0x10 (these 0x10 are known) bytes that is new to Undine that I have to figure out how to read. These 0x18 bytes are the SectionSets (2) and Layers(3) entries in GrannyViewer ArtToolInfo:ExtendedData:

0000472C 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 ................
0000473C 00 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 ................
0000474C 97 00 00 00 00 00 00 00 ........

Now I have a feeling that there is only 0x10 new bytes defined because: 0x4 bytes number of SectionSets (02000000), 0x4 bytes for pointer to those SectionSets in file (00000000), 0x4 bytes for number of Layers (03000000), and 0x4 bytes for pointer to those Layers in file (00000000). Grand total is 0x10 new bytes....I'm guessing here but am usually correct. This also means an assumption I made about where ArtToolInfo:ExtendedData:DocumentContents resides in the file is incorrect and I have to re-evaluate this.

The reading of the file header and sections I couldn't figure out because GrannyViewer didn't 'show' anything about them. It wasn't until Privateer released his first template for 010 editor that they were revealed. That was the missing piece of the puzzle I needed to put everything together :yeah:

More to come......

Madox58
10-18-11, 06:42 PM
Very well played Mate!
:yeah:

TheDarkWraith
10-18-11, 08:00 PM
another new finding:

If pointers come before data in the section then the next entry after Number of pointers in the Section data is End of pointers file offset. If pointers come after data in the section then that next entry is the file size in bytes. Just noticed this when I tried my fixes for Undine on the lifeboat (my app's error checking barked at me and said danger will robinson!) :up:

Updated my section class to display correct debug output for it too:

lifeboat:

[4984] GR2 file path is C:\Games\Ubisoft\Silent Hunter 5\data\Sea\CMD_small_boat\LifeBoat.GR2
[4984]
[4984] Current position in file is 0x0
[4984]
[4984] Reading file header data starting at 0x0
[4984] Magic string=)ÞlÀº¤S+%õ·¥öfâî 0x10
[4984] Start of file data file offset (from file beginning)=0x1C8 0x14 where the file list header starts
[4984] Unknown1=0x0 0x18
[4984] Unknown2=0x0 0x1C
[4984] Unknown3=0x0 0x20
[4984] Current position in file is 0x20
[4984]
[4984] Reading info header data starting at 0x20
[4984] File format revision=0x7 0x24
[4984] File size in bytes=238632 0x28
[4984] CRC value=0xA682FD63 0x2C
[4984] Bytes from offset to start of sections=0x48 0x30 bytes from start of this to first section
[4984] Number of sections=8 0x34
[4984] Root object type (?)=0x6 0x38
[4984] Root object offset (?)=0x3540 0x3C
[4984] Unknown1=0x0 0x40
[4984] Unknown2=0x0 0x44
[4984] Tag=0x80000032 0x48
[4984] Current position in file is 0x68
[4984]
[4984] Reading section 0 (arttoolinfo) data starting at 0x68
[4984] Unknown=0x0 0x6C always 0x0
[4984] Section file offset=0x1C8 0x70 where this section starts in the file
[4984] Compressed size=13952 0x74 compressed size and uncompressed sizes should equal for SH5 GR2s
[4984] Uncompressed size=13952 0x78 compressed size and uncompressed sizes should equal for SH5 GR2s
[4984] Alignment=0x4 0x7C what the alignment boundary is in the file
[4984] Start of data fileoffset=0x177C 0x80 start of data
[4984] Start of data fileoffset2=0x177C 0x84 start of data
[4984] Pointers file offset=0x37C68 0x88 where the pointers for this section are located
[4984] Number of pointers=229 0x8C
[4984] End of pointers file offset=0x3A428 0x90 where the pointers for the file end
[4984] Unknown2=0x0 0x94
[4984] Current position in file is 0x94
[4984]
[4984] Reading section 1 (vertex_data) data starting at 0x94
[4984] Unknown=0x0 0x98 always 0x0
[4984] Section file offset=0x3848 0x9C where this section starts in the file
[4984] Compressed size=182400 0xA0 compressed size and uncompressed sizes should equal for SH5 GR2s
[4984] Uncompressed size=182400 0xA4 compressed size and uncompressed sizes should equal for SH5 GR2s
[4984] Alignment=0x4 0xA8 what the alignment boundary is in the file
[4984] Start of data fileoffset=0x2C880 0xAC start of data
[4984] Start of data fileoffset2=0x2C880 0xB0 start of data
[4984] Pointers file offset=0x38724 0xB4 where the pointers for this section are located
[4984] Number of pointers=0 0xB8
[4984] End of pointers file offset=0x3A428 0xBC where the pointers for the file end
[4984] Unknown2=0x0 0xC0
[4984] Current position in file is 0xC0
(snip)


Undine:

[4612] GR2 file path is C:\Games\Ubisoft\Silent Hunter 5\data\Submarine\NSS_Undine\NSS_Undine.GR2
[4612]
[4612] Current position in file is 0x0
[4612]
[4612] Reading file header data starting at 0x0
[4612] Magic string=)ÞlÀº¤S+%õ·¥öfâî 0x10
[4612] Start of file data file offset (from file beginning)=0x1C8 0x14 where the file list header starts
[4612] Unknown1=0x0 0x18
[4612] Unknown2=0x0 0x1C
[4612] Unknown3=0x0 0x20
[4612] Current position in file is 0x20
[4612]
[4612] Reading info header data starting at 0x20
[4612] File format revision=0x7 0x24
[4612] File size in bytes=1720964 0x28
[4612] CRC value=0xC52FD13B 0x2C
[4612] Bytes from offset to start of sections=0x48 0x30 bytes from start of this to first section
[4612] Number of sections=8 0x34
[4612] Root object type (?)=0x6 0x38
[4612] Root object offset (?)=0x0 0x3C
[4612] Unknown1=0x0 0x40
[4612] Unknown2=0x0 0x44
[4612] Tag=0x80000032 0x48
[4612] Current position in file is 0x68
[4612]
[4612] Reading section 0 (arttoolinfo) data starting at 0x68
[4612] Unknown=0x0 0x6C always 0x0
[4612] Section file offset=0x468C 0x70 where this section starts in the file
[4612] Compressed size=61184 0x74 compressed size and uncompressed sizes should equal for SH5 GR2s
[4612] Uncompressed size=61184 0x78 compressed size and uncompressed sizes should equal for SH5 GR2s
[4612] Alignment=0x4 0x7C what the alignment boundary is in the file
[4612] Start of data fileoffset=0xBD9C 0x80 start of data
[4612] Start of data fileoffset2=0xBD9C 0x84 start of data
[4612] Pointers file offset=0x1C8 0x88 where the pointers for this section are located
[4612] Number of pointers=1467 0x8C
[4612] End of pointers file offset=0x468C 0x90 where the pointers for this section end
[4612] Unknown2=0x0 0x94
[4612] Current position in file is 0x94
[4612]
[4612] Reading section 1 (vertex_data) data starting at 0x94
[4612] Unknown=0x0 0x98 always 0x0
[4612] Section file offset=0x1358C 0x9C where this section starts in the file
[4612] Compressed size=1368640 0xA0 compressed size and uncompressed sizes should equal for SH5 GR2s
[4612] Uncompressed size=1368640 0xA4 compressed size and uncompressed sizes should equal for SH5 GR2s
[4612] Alignment=0x20 0xA8 what the alignment boundary is in the file
[4612] Start of data fileoffset=0x14E240 0xAC start of data
[4612] Start of data fileoffset2=0x14E240 0xB0 start of data
[4612] Pointers file offset=0x1358C 0xB4 where the pointers for this section are located
[4612] Number of pointers=0 0xB8
[4612] End of pointers file offset=0x1358C 0xBC where the pointers for the file end
[4612] Unknown2=0x0 0xC0
[4612] Current position in file is 0xC0
(snip)

Madox58
10-18-11, 08:32 PM
Oh, I forgot to thank you for the opening Credit also.
:salute:

TheDarkWraith
10-18-11, 08:39 PM
Oh, I forgot to thank you for the opening Credit also.
:salute:

you deserved it. I was stuck right there and couldn't figure it out for the life of me :up:

Madox58
10-18-11, 09:20 PM
There is alot of those WTF moments in the GR2 files.
I don't see them as dynamic.
They follow rules.
Those rules are changed IF a file is modified AFTER being created.
But at that point they follow the RULES.

What I mean is>>>>>>>>>>>
A file is exported from say 3DS Max.
It has our base meshes and such.
Now I want to ADD meshes.
I know there is code to do so in the Software that comes with the Granny system.
But once you do that?
Add stuff or correct stuff?
I'm not a 100% clear on what it messes with.
I do know it changes many pointers.

TheDarkWraith
10-18-11, 11:34 PM
The beauty of it is the pointers. Figure out the algorithm and it'll be no problem at all. It'll take time to do but anything can be cracked with enough time :yep: The more people working on it the faster it's cracked.

The website GR2Decode or something like that is someone I'm going to reach out to and anyone else that has been working on GR2 files. See if I can't stir up some enthusiasm. The QuArK people are another good one to reach out to.

TheDarkWraith
10-19-11, 03:33 AM
just found a big bug in my code that prevented it from reading all of a section's pointers. I was pulling my hair out trying to figure out why some pointers weren't pointing to these new entries for Undine in GrannyViewer. They had to be there. When I went and compared the pointers I had to what was contained in the file they didn't match. That led me to look at the code and find the bug. Well more work to do tomorrow now :up: This will probably shed light on many things I've been looking for in the pointers.

Will-Rommel
10-19-11, 04:51 PM
Keep going TDW! Indeed too few people are participating along in this project, but i'm quite positive it's by lack of a solid technnical base rather than lack of interest (number of views this thread has says so)

I have really basics knowledges in programming languages so i follow this analysis with appetite, but i must confess i can't quite follow along with all the hex references. I'm just not there yet.

You guys rock! :rock:

TheDarkWraith
10-19-11, 05:32 PM
well the Undine shot every assumption of the GR2 file out of the water that I had made. I had to basically do a total rewrite of the importer (and I still have more work to do on it - I have to recode the reading of the exporter info and additional strings and extended data) :damn: It's ok, everything works great now. I learned alot from 'reading' the pointers of the Undine's GR2 model. If pointers come before data then everything changes, and I mean everything. There are more pointers referencing other pointers which made it cumbersome to decode. There is more work to do on it but coming along nicely.

This new version will read the undine and the subs no problem now :up:

http://www.gamefront.com/files/20905122/GR2EditorViewer_v1_0_103_0_zip

If you want to see what's going on under the hood run the DbgView app before starting this app (you can find DbgView in my UIs mod in \data\Applications). When I say under the hood I mean basically a complete file map of the file. It will tell you every address it reads and where it's reading it from the file.

There is a folder made in app path\ called GR2Testing that will contain the pointers decoded in a text file for each GR2 file read. The pointers are currently only for section 0. For those interested it can make for some interesting reading.

Let me know of any problems :yeah:

:|\\

Kaicokid
10-19-11, 06:07 PM
In a nutshell TDW,does this mean that modding harbours ,subs, introducing the missing larger German subs etc.will now be possible?

TheDarkWraith
10-19-11, 08:29 PM
In a nutshell TDW,does this mean that modding harbours ,subs, introducing the missing larger German subs etc.will now be possible?

I'm nowhere close to having an exporter done. Still getting the importer to work properly. There are still some GR2 files it can't read yet. Have to open them up in Visual Studio so I can step through the app and see what's going on.

Kaicokid
10-19-11, 09:22 PM
OK, very good.Keep up the GREAT work.Thanks.

TheDarkWraith
10-20-11, 01:37 AM
new verison released. You can find at bottom of post #1.

Fixed problem with Bones treeview checkboxes
App can now handle GR2 files with multiple models
Re-coded the exporter info section
Finished the ArtToolInfo:ExtendedData names
Added DiffuseColor0 to known names
Still isn't able to open all GR2 files. Still working out the bugs :up:
Still haven't coded the textures or materials yet.

PL_Andrev
10-20-11, 10:27 AM
It will be possible to add crew to all AI submarines when submerged?

TheDarkWraith
10-20-11, 11:46 AM
It will be possible to add crew to all AI submarines when submerged?

Not following what you're asking :06:

TheDarkWraith
10-20-11, 01:40 PM
new version released. v1.0.125.0 available at post #1. This version fixes some minor errors I noticed. It also now reads the textures and builds them.

Still can't display the 3D model with textures until I finish the materials. Working on that now.

EDIT: forgot to test that version on the Undine. As expected it had problems. Pointers coming before data doesn't matter that much with textures. v1.0.127.0 released to fix this.

tonschk
10-20-11, 02:49 PM
:yeah: great work :sunny: TDW :DL Well Done :salute:

Madox58
10-20-11, 04:07 PM
Nice work.
Check the Bunker.gr2
Your getting a mess on the lipituri mesh for some reason.
:03:

TheDarkWraith
10-20-11, 04:23 PM
Nice work.
Check the Bunker.gr2
Your getting a mess on the lipituri mesh for some reason.
:03:

I'll look into it.

Just finished coding the reading of the materials. Now I just have to adjust the mesh's render function for this new way of materials.

Version 1.0.136.0 released. Let me know if it's not reading any textures/materials/or maps of materials correctly :yep:


Where is the bunker GR2 file located?

EDIT: nevermind. Found it. Also just spotted a problem with new version. download on hold....

TheDarkWraith
10-20-11, 05:15 PM
v1.0.142.0 released. The problem with v1.0.136.0 was I thought that the materials were laid out sequentially in the file (along with their map references). Turns out to not be the case. Thus I had to add a flag to the map reference class. This flag denotes whether it's map reference was found or not. After the app loads all the materials it goes back and verifies those with maps have all their map references defined. If not, it searches for them to define them. Saw this problem using the bunker.GR2.

Now I'll look into this bunker problem Privateer spoke about :up:

TheDarkWraith
10-20-11, 05:33 PM
ok I see the problem with the bunker item. Once again another assumption I made is blown out of the water :damn: I assumed that the vertex component names I've found so far apply to a certain item - position, normal, tangent, etc. Turns out those names can be applied to anything. This causes problems with my app and thus you get the shredded mesh.

I'll have to fix :up:

THE_MASK
10-20-11, 05:48 PM
I cannot open the GR2 file
Silent Hunter 5\data\Library\undersea

THE_MASK
10-20-11, 05:51 PM
I opened Silent Hunter 5\data\Terrain\Textures_and_Vegetation\0.Taigas and Dry Lands\vegetation the other day ok with an older version . Cannot remember which one . Doesnt work with the latest version though .

TheDarkWraith
10-20-11, 06:07 PM
I cannot open the GR2 file
Silent Hunter 5\data\Library\undersea

Yes there is still more work to do on the importer. I hope to have that resolved soon :up: Let me know of anything you can't open.

I opened Silent Hunter 5\data\Terrain\Textures_and_Vegetation\0.Taigas and Dry Lands\vegetation the other day ok with an older version . Cannot remember which one . Doesnt work with the latest version though .

I'll look at it.


v1.0.147.0 released. See post #1.

No more shredded meshes due to not reading all vertex component data. I wasn't happy with that section of code anyways so it needed a rewrite :up:

Let me know if you find any other shredded meshes. There shouldn't be anymore.

TheDarkWraith
10-20-11, 06:14 PM
I opened Silent Hunter 5\data\Terrain\Textures_and_Vegetation\0.Taigas and Dry Lands\vegetation the other day ok with an older version . Cannot remember which one . Doesnt work with the latest version though .

Yes a stupid mistake on my part. I coded the app to think that every GR2 file had textures. I'll fix this :up:

EDIT: did the same thing to the materials. Fixing it also.

Just tried opening lifeboat with changes and it failed. Have to figure out why....

Will-Rommel
10-20-11, 06:20 PM
One can smell the hate growing ! :haha:

TheDarkWraith
10-20-11, 06:21 PM
One can smell the hate growing ! :haha:

what hate? from whom? :hmmm:

THE_MASK
10-20-11, 06:29 PM
I couldnt open
C:\Ubisoft\Silent Hunter 5\data\Env\cloud_models
C:\Ubisoft\Silent Hunter 5\data\Characters\HumanDialogIndicator
C:\Ubisoft\Silent Hunter 5\data\Terrain\Locations\CustomAreas\Port_pieces\P ort_U
(opens but doesnt show anything)

TheDarkWraith
10-20-11, 06:32 PM
I couldnt open
C:\Ubisoft\Silent Hunter 5\data\Env\cloud_models
C:\Ubisoft\Silent Hunter 5\data\Characters\HumanDialogIndicator
C:\Ubisoft\Silent Hunter 5\data\Terrain\Locations\CustomAreas\Port_pieces\P ort_U
(opens but doesnt show anything)

I'll look into those.

I fixed the problem with the lifeboat. Problem was if number of textures = 1 then I had to dereference the pointer and find the actual pointer to the texture.

I think the same thing has to be done with the materials but not sure. Anyone know any GR2 file that has only 1 material defined? GrannyViewer will tell you how many materials a GR2 file has. I need to test the app on a GR2 file with only 1 material :yep:

Will-Rommel
10-20-11, 06:36 PM
what hate? from whom? :hmmm:

I meant that i havent seen you in such a frenzy since IRAI's beginning i think. :salute:

TheDarkWraith
10-20-11, 06:49 PM
I meant that i havent seen you in such a frenzy since IRAI's beginning i think. :salute:

Taking something apart and learning from it is fascinating to me. Yes I will devote a lot of time to it :up:


v1.0.153.0 released. See post #1. This will fix the problem of when only 1 texture is defined I had to do something for it.

The problem in previous version probably applies to a GR2 file with only 1 material defined but until we can find a GR2 file with only one material defined I can't test my theory.

@Sober - this fix fixes the problem with the GR2 files you posted that wouldn't open. The last one where it shows no meshes is odd (Port U). I think I know why. I need to open up my camera parameters for clipping :hmmm:

TheDarkWraith
10-20-11, 07:05 PM
I couldnt open C:\Ubisoft\Silent Hunter 5\data\Terrain\Locations\CustomAreas\Port_pieces\P ort_U
(opens but doesnt show anything)

That was because my camera parameters were WAY too tight. I loosened them way up :up:

v1.0.155.0 released. See post #1.

You can see it now :yep:

Now it's time to render with textures....

THE_MASK
10-20-11, 07:12 PM
I can open them now . Couldnt find a GR2 with 1 material defined .

TheDarkWraith
10-20-11, 09:31 PM
v1.0.169.0 released. See post #1.

You can now view the 3D model texturized. Select solid in FillMode tab and make sure texture is checked.

Rendering is done still using the fixed-function pipeline so only the "Diffuse Color" is being rendered for the texture. I'll convert to shaders here soon.

THE_MASK
10-20-11, 10:01 PM
Cannot open
C:\Ubisoft\Silent Hunter 5\data\Library\undersea

THE_MASK
10-20-11, 10:05 PM
This might be interesting > it throws an exception and gives a bug report when trying to open .
C:\Ubisoft\Silent Hunter 5\data\Submarine\NSS_Uboat2a\NSS_Uboat2a

TheDarkWraith
10-20-11, 10:09 PM
This might be interesting > it throws an exception and gives a bug report when trying to open .
C:\Ubisoft\Silent Hunter 5\data\Submarine\NSS_Uboat2a\NSS_Uboat2a

That GR2 file and undersea.GR2 give my importer problems. I know why it's just that I haven't found a solution to the why yet. The why is because my dumb luck decoding of the pointers isn't perfect and is biting me in the you know what now. Basically it's trying to reference some things past the end of the embedded strings and my app is interpreting those pointers as type str and str_reference and thus giving the problems (they should be type pointer or pointer_data). Once I find a sure fire way of determining the end of the embedded strings then this problem will disappear :yep:

TheDarkWraith
10-21-11, 12:48 AM
v1.0.181.0 released. See post #1.

Started reading the bone extended data. Currently can only read one type of extended data for the bones.

If you run DbgView before the app you'll catch where this bone extended data resides in the file. Try opening the file with hex editor and changing some of the bone extended data values based on the (0x__) given. Then fire up SH5 and see what happens :up:

Working on the rest of the bone extended datas (currently I've found there are 2 more types)

Plan is after I can read all the bone extended data to have a screen in the app available for editing this data. Once edited you'll be able to save the changes to the GR2 file.

tonschk
10-21-11, 05:18 AM
Once edited you'll be able to save the changes to the GR2 file.


Great Work :salute: :up: TheDarkWraith :DL

urfisch
10-21-11, 05:41 AM
sounds nice...

:woot:

TheDarkWraith
10-21-11, 10:40 AM
coding the second type of bone extended data and was wondering what does this have anything to do with the game? This data appears to be for some kind of 3D modelling app or something:

[1048] Bone extended data found at 0xC1C (0xDE4)
[1048] Extended data is type 1
[1048] Select By Vertex=0 0xC1C (0xDE4)
[1048] Ignore Backfacing In Selections=0 0xC20 (0xDE8)
[1048] Select By Angle=0 0xC24 (0xDEC)
[1048] Selection Angle=0.785398 0xC28 (0xDF0)
[1048] Use Soft Selection=0 0xC2C (0xDF4)
[1048] Use Edge Distance=0 0xC30 (0xDF8)
[1048] Edge Distance=1 0xC34 (0xDFC)
[1048] Affect Backfacing=1 0xC38 (0xE00)
[1048] Falloff=20.000000 0xC3C (0xE04)
[1048] Pinch=0.000000 0xC40 (0xE08)
[1048] Bubble=0.000000 0xC44 (0xE0C)
[1048] Lock Soft Selection=0 0xC48 (0xE10)
[1048] Paint Mode=0 0xC4C (0xE14)
[1048] Selection Value=1.000000 0xC50 (0xE18)
[1048] Brush Size=10.000000 0xC54 (0xE1C)
[1048] Brush Strength=1.000000 0xC58 (0xE20)
[1048] Vertex Constraint Type=0 0xC5C (0xE24)
[1048] Delete Isolated Vertices=1 0xC60 (0xE28)
[1048] Fully Interactive=1 0xC64 (0xE2C)
[1048] Show Cage=1 0xC68 (0xE30)
[1048] Split=0 0xC6C (0xE34)
[1048] Preserve UVs=0 0xC70 (0xE38)
[1048] Subdivide Surface=0 0xC74 (0xE3C)
[1048] Smooth Subdivision Result=1 0xC78 (0xE40)
[1048] Isoline Display=1 0xC7C (0xE44)
[1048] Iterations=1 0xC80 (0xE48)
[1048] Surface Smoothness=1.000000 0xC84 (0xE4C)
[1048] Use Render Iterations=0 0xC88 (0xE50)
[1048] Render Iterations=0 0xC8C (0xE54)
[1048] Use Render Smoothness=0 0xC90 (0xE58)
(snip)

:06:

urfisch
10-21-11, 11:36 AM
maybe you ask hans wittemann for some light on that...he´s a professional 3d artist.

TheDarkWraith
10-21-11, 12:18 PM
maybe you ask hans wittemann for some light on that...he´s a professional 3d artist.

Excellent idea :up:


v1.0.188.0 released. See post #1.

This version reads the second kind of bone extended data. One more to go....

Madox58
10-21-11, 04:34 PM
Depending on if you want to make this secure to SH5 GR2 files or not.
Do a check on the textures path as a lock.
You could also lock to 3DMax version as a step check.

Reason I point this out?
I test many different GR2 files from different Games.
The ones that do not load at this time?
You give me the information to correct them so that they do load.
:03:
Examples would be the CRC check which I can correct and the file size check which is also easily fixed.

For early testing?
It might help to disable both at this time.

In the over all design?
Many things will not need to be checked and placed into a strict structure.
Who gives a Rats ass if 3D Max was used, or Maya, or XSI?
Much of the Section 0 information is just junk that will not be modified or overlooked anyway.
:03:

TheDarkWraith
10-21-11, 05:20 PM
Depending on if you want to make this secure to SH5 GR2 files or not.
Do a check on the textures path as a lock.
You could also lock to 3DMax version as a step check.

Reason I point this out?
I test many different GR2 files from different Games.
The ones that do not load at this time?
You give me the information to correct them so that they do load.
:03:
Examples would be the CRC check which I can correct and the file size check which is also easily fixed.

For early testing?
It might help to disable both at this time.

In the over all design?
Many things will not need to be checked and placed into a strict structure.
Who gives a Rats ass if 3D Max was used, or Maya, or XSI?
Much of the Section 0 information is just junk that will not be modified or overlooked anyway.
:03:

I'm not making this secure to only SH5 files. Because of how it reads the file it *should* open just about any GR2 file. I say should because I don't know for sure.

Glad to see this app is useful to someone so far :up:

Haven't coded in the CRC checker yet. It's on my to-do list. Checking file size it already does in the error checker.

So far I don't have it checking that many things. I'm only having it check the important things (but who's to say what is important? I'm still learning!)

Much of the information it spits out in DbgView is just for informational purposes. It helps me to 'see' the file and where everything is :yep:

Madox58
10-21-11, 05:27 PM
I can send you a GR2 from a Beta Game if you would like to see it.
:D
(Hell, even older Games if you wish a cross section.)

The CRC is not correct nor is the file size setting.
I think that may be a way the Devs figured simpletons would not be able to look at the files with GrannyViewer.
:haha:

STUPID DEVS if that's the case.
:har:

As far as useful?
I'd say yes for the many Modders of SH5.(Possibly more Game Modders!)
For me?
You know I don't need it just as I didn't need S3D.
:03:
You also know I'll use it just as I use S3D. Once it's finished to a useable state.
:up:

TheDarkWraith
10-21-11, 05:52 PM
I can send you a GR2 from a Beta Game if you would like to see it.
:D
(Hell, even older Games if you wish a cross section.)

The CRC is not correct nor is the file size setting.
I think that may be a way the Devs figured simpletons would not be able to look at the files with GrannyViewer.
:haha:

STUPID DEVS if that's the case.
:har:

As far as useful?
I'd say yes for the many Modders of SH5.(Possibly more Game Modders!)

Sure send away :yep: The more files of different types of games I can try the better this app will be!

You'll probably find this information useful then. Starting in version 1.0.193.0 it tells you the start of the major items in the file:

[3760] Reading section 7 (unknown7) data starting at 0x19C
[3760] Unknown=0x0 0x1A0 always 0x0
[3760] Section file offset=0x66ACE4 0x1A4 where this section starts in the file
[3760] Compressed size=0 0x1A8 compressed size and uncompressed sizes should equal for SH5 GR2s
[3760] Uncompressed size=0 0x1AC compressed size and uncompressed sizes should equal for SH5 GR2s
[3760] Alignment=0x4 0x1B0 what the alignment boundary is in the file
[3760] Start of data fileoffset=0x0 0x1B4 start of data
[3760] Start of data fileoffset2=0x0 0x1B8 start of data
[3760] Pointers file offset=0x6732A0 0x1BC where the pointers for this section are located
[3760] Number of pointers=0 0x1C0
[3760] End of pointers file offset=0x6732A0 0x1C4 where the pointers for the file end
[3760] Unknown2=0x0 0x1C8
[3760] Current position in file is 0x1C8
[3760]
[3760] File info offset at 0x8 (0x1D0)
[3760] Number of textures=8 0xC (0x1D4)
[3760] Start of textures pointer found at 0x14 (0x1DC)
[3760] Start of textures pointer points to 0x390 (0x558)
[3760] Number of materials=17 0x14 (0x1DC)
[3760] Start of materials pointer found at 0x1C (0x1E4)
[3760] Start of materials pointer points to 0x610 (0x7D8)
[3760] Number of skeletons=1 0x1C (0x1E4)
[3760] Start of skeletons pointer found at 0x24 (0x1EC)
[3760] Start of skeletons pointer points to 0x198C (0x1B54)
[3760] Number of vertex datas=47 0x24 (0x1EC)
[3760] Start of vertex datas pointer found at 0x2C (0x1F4)
[3760] Start of vertex datas pointer points to 0xBA5C (0xBC24)
[3760] Number of tritopologies=47 0x2C (0x1F4)
[3760] Start of tritopologies pointer found at 0x34 (0x1FC)
[3760] Start of tritopologies pointer points to 0xC4A4 (0xC66C)
[3760] Number of meshes=47 0x34 (0x1FC)
[3760] Start of meshes pointer found at 0x3C (0x204)
[3760] Start of meshes pointer points to 0xD4E4 (0xD6AC)
[3760] Number of models=1 0x3C (0x204)
[3760] Start of models pointer found at 0x44 (0x20C)
[3760] Start of models pointer points to 0x1477C (0x14944)
[3760] Number of trackgroups=0 0x44 (0x20C)
[3760] Start of trackgroups not found in file pointers
[3760] Number of animations=0 0x4C (0x214)
[3760] Start of animations not found in file pointers
[3760] Number of unknown=0 0x54 (0x21C)
[3760] Start of unknown not found in file pointers
[3760] Current position in file is 0x224
[3760]
[3760] Reading all the pointers for section 0
[3760] Pointer 0 is type str with offsetinsectiondata of 0x5C (0x224) and unknown of 0x0 and offsetinsectionvalue of 0x14898 (0x14A60)
[3760] string=3D Studio MAX

Notice start of textures, start of models, start of materials, etc. Very handy :yep: I keep learning more the more I play with this :up:

That little bit of information made a light bulb click for a problem I was having. It tells me how the file is layed out from top to bottom....

Madox58
10-21-11, 06:17 PM
I saw the Section info long ago and put it together pretty quickly after that.
I never finished a full app because I just didn't find it that interesting after I figured things out on the uncompressed GR2 files.

That's the saveing grace of SH5 GR2 files.
They are not compressed and they did not modify the standard export.

More and more Games will change from this habit and are doing so even now.
Most of the stupid things I see is messing up the CRC and file size settings so GrannyViewer can not open them.
That may be totally by accident useing a half assed tool after exporting the 3D stuff?
But that would be something I'd think no slightly GOOD programmer did by accident!

I'll pack up a few GR2 files I have and send you a link by PM.

Madox58
10-21-11, 07:11 PM
PM sent.

TheDarkWraith
10-21-11, 09:06 PM
v1.0.209.0 released. See post #1.

This version now reads all the bone extended data. I had it reading the mesh extended data till I found a model that had different mesh extended data. So now I have to figure out how the mesh extended data changes (what defines it).

This version also lists the start of each major section in the FileInfo header section (in the debug output).

I finished up the mesh class and thus each mesh is now reading it's bone bindings (there is only 1 don't know why GrannyViewer shows this as plural). Since it has it's bone binding and each bone has extended data then I can set the visibility of the mesh based on the bone binding's (bone) extended data (Hide). I did hard code to set any mesh that starts with LNK@ to hide (not visible).

Working on figuring out how the mesh extended data is determined :hmmm:

Just tried opening the bunker with the new version and discovered another type of bone extended data. If you get an error message saying 'Currently can't read extended data for this bone' let me know which GR2 file you were trying to open.

TheDarkWraith
10-21-11, 10:58 PM
v1.0.211.0 released. This removes the bone extended data reading. Reason is because it will read all bone extended data correctly for most GR2 files. Those GR2 files that have bone extended data that is 'exotic' (max properties defined, camera info defined, etc.) throw it all out of whack for the last bone's extended data. I know why but it will take time to sort out. It deals with where these max properties and camera info are placed in regards to the bone's extended data. It's not where I thought it was... :up:

This means I've gone back to hard coding of what's visible or not initially. The FileInfo header still shows the start of each major section.

TheDarkWraith
10-22-11, 01:57 AM
I was puzzled for the longest time as to how the GrannyViewer knew how many embedded strings to read for an item's extended data. I was also puzzled by how it knew the data type for those items. I'm not puzzled any longer :rock:

Another careful look at the pointers showed the error in my ways. The pointer for an item's extended data always had an unknown of 0x6 (my pointer structure is offsetinsectiondata, unknown, offsetinsectionvalue) and the offsetinsection value made absolutely no sense. Once you know what the unknown value is for it all makes perfect sense :yep: This unknown will now get its proper name!

That unknown is used along with that offsetinsectionvalue to read another set of pointers. These pointers are how the GrannyViewer knows a) how many embedded strings to read and b) what the data type is for those embedded strings. Mystery solved :D

wow this clears up many things...:cool:

Overall I'm very impressed with the GR2 format. It's slick, it's elegant, and it's beautiful from a programmer's perspective!

TheDarkWraith
10-22-11, 02:20 PM
v1.0.234.0 released. See post #1.

I can now read the correct extended data for anything. Problem is I can't read the strings associated with that data yet. Still working on it :up:

This version adds the extended data (if the item has any). If the extended data references other strings or has pointers to something else I can't support those yet either.

TheDarkWraith
10-22-11, 07:39 PM
I can read the strings for extended data now. It's not entirely correct (about 85% correct). There are pointers 3-5 levels deep and it makes it hard to decipher :damn: Not to mention that the GR2 file has a wacked out way of keeping track of it's embedded strings :shifty: It utterly hates to have duplicates of anything in it so it's got this totally elaborate scheme that only partly makes sense currently.

TheDarkWraith
10-22-11, 10:43 PM
figured out the granny system of how it stores/uses embedded strings :rock:Now I can read any embedded string that I need.

v1.0.256.0 released. This verison will now read the embedded strings for all items that have extended data correctly. The extended data items that have pointers to something else (max properties, dx something, etc) or reference another string has not been coded yet.

Moving along nicely now :up:

:|\\

TheDarkWraith
10-23-11, 01:30 PM
v1.0.276.0 released. See post #1

This version reads more of the extended data associated with an item. It also tells you where it reads each item of this extended data so you can find it in the file easier. The extended data's values are now read also.

The reading of the max properties is perfect but it currently doesn't read this value for every item's extended data. Trying to figure out why still.

If an item's extended data has a pointer to another 'extended data' (i.e. max properties, directx something, etc.) I've not coded all of those. I have a majority of them done though :up:

The way the granny system uses/finds embedded strings is pretty slick. It was just a bear to figure out initially :yep:

TheDarkWraith
10-24-11, 12:54 AM
v1.0.284.0 released. See post #1

All extended data for any item is now read correctly (it's totally dynamic - nothing hard coded here. The file [pointers] tells you everything you need to know!). Since I have all the extended data, items visibility is set accoding to it's max properties:hide value. Fixed some formatting issues with the debug output. Added missing offet and position in file (0x_) information to those missing it. Have to redo the map enables/map values so that they spit out their file offset and file position info on values read. That will be in next version :up:

:|\\

kylania
10-24-11, 02:08 AM
Fantastic work TDW! :salute:

Obelix
10-24-11, 04:00 AM
Hi TheDarkWraith!
With the new version, like the previous one, does not appear IIA
I see that the program swears by the encoding, whether it be due to the Russian version of windows?
Other models successfully opened (in folders sea and submarine)
00000000 0.00000000 [2080] Silent Hunter 5 GR2 Editor / Viewer v1.0.284.0 by TheDarkWraith
00000001 0.00000000 [2080]
00000002 0.03525316 [2080] D: \ GAMES \ U-Boats \ GR2EditorViewer \ GR2EditorViewer.cfg exists = True
00000003 0.03525316 [2080]
00000004 0.03532156 [2080] Reading in cfg file ...
00000005 0.03532156 [2080]
00000006 0.03921311 [2080] Entry found: SH5InstallPath = D: \ GAMES \ U-Boats
00000007 0.03921311 [2080]
00000008 0.03926704 [2080] Entry found: ShowWorldOrigin = False
00000009 0.03926704 [2080]
00000010 0.03933873 [2080] Entry found: WorldOriginSize = 5
00000011 0.03933873 [2080]
00000012 0.03937852 [2080] Entry found: WorldOriginOpacity = 122
00000013 0.03937852 [2080]
00000014 0.03943607 [2080] Entry found: WorldOriginColor =- 16,711,681
00000015 0.03943607 [2080]
00000016 0.03948112 [2080] Entry found: ShowWorldOriginLabel = False
00000017 0.03948112 [2080]
00000018 0.03954525 [2080] Entry found: WorldOriginLabelSize = 7,5
00000019 0.03954525 [2080]
00000020 0.03958569 [2080] Entry found: WorldOriginLabelOpacity = 122
00000021 0.03958569 [2080]
00000022 0.03964587 [2080] Entry found: WorldOriginLabelColor =- 16,711,681
00000023 0.03964587 [2080]
00000024 0.03970934 [2080] Entry found: ShowWorldOriginAxis = True
00000025 0.03970934 [2080]
00000026 0.03974880 [2080] Entry found: WorldOriginAxisOpacity = 122
00000027 0.03974880 [2080]
00000028 0.03981424 [2080] Entry found: ShowBoneOrigin = True
00000029 0.03981424 [2080]
00000030 0.03985272 [2080] Entry found: BoneOriginSize = 5
00000031 0.03985272 [2080]
00000032 0.03990829 [2080] Entry found: BoneOriginOpacity = 185
00000033 0.03990829 [2080]
00000034 0.03997899 [2080] Entry found: BoneOriginColor =- 10,185,235
00000035 0.03997899 [2080]
00000036 0.04001878 [2080] Entry found: ShowBoneOriginLabel = True
00000037 0.04001878 [2080]
00000038 0.04008061 [2080] Entry found: BoneOriginLabelSize = 9,0
00000039 0.04008061 [2080]
00000040 0.04012270 [2080] Entry found: BoneOriginLabelOpacity = 185
00000041 0.04012270 [2080]
00000042 0.04018748 [2080] Entry found: BoneOriginLabelColor =- 10,185,235
00000043 0.04018748 [2080]
00000044 0.04022464 [2080] Entry found: ShowBoneOriginAxis = True
00000045 0.04022464 [2080]
00000046 0.04028087 [2080] Entry found: BoneOriginAxisOpacity = 122
00000047 0.04028087 [2080]
00000048 0.04038643 [2080] Entry found: ShowBones = False
00000049 0.04038643 [2080]
00000050 0.04044891 [2080] Entry found: ShowBoneInterconnects = True
00000051 0.04044891 [2080]
00000052 0.04059361 [2080] Entry found: CullMode = CounterClockwise
00000053 0.04059361 [2080]
00000054 0.04068963 [2080] Entry found: FillMode = solid
00000055 0.04068963 [2080]
00000056 0.04073238 [2080] Entry found: ShadeMode = Gouraud
00000057 0.04073238 [2080]
00000058 0.04079584 [2080] Entry found: PointsSize = 3.5
00000059 0.04079584 [2080]
00000060 0.04083563 [2080] Entry found: PointsColor =- 65 281
00000061 0.04083563 [2080]
00000062 0.04089746 [2080] Entry found: PointsOpacity = 50
00000063 0.04089746 [2080]
00000064 0.04093560 [2080] Entry found: WireframeColor =- 128
00000065 0.04093560 [2080]
00000066 0.04098921 [2080] Entry found: WireframeOpacity = 50
00000067 0.04098921 [2080]
00000068 0.04104643 [2080] Entry found: SolidColor =- 3673639
00000069 0.04104643 [2080]
00000070 0.04108950 [2080] Entry found: SolidOpacity = 255
00000071 0.04108950 [2080]
00000072 0.04114870 [2080] Entry found: SolidIsTexture = True
00000073 0.04114870 [2080]
00000074 0.11984655 [2080] DirectX initialized
00000075 0.11984655 [2080]
00000076 0.14842251 [2080] SH5 install path set to D: \ GAMES \ U-Boats
00000077 0.14842251 [2080]
00000078 7.85648155 [2080] GR2 file path is D: \ GAMES \ U-Boats \ data \ Submarine \ NSS_Uboat2a \ NSS_Uboat2a.GR2
00000079 7.85648155 [2080]
00000080 7.88121939 [2080] Current position in file is 0x0
00000081 7.88261795 [2080]
00000082 7.88261795 [2080] Reading file header data starting at 0x0
00000083 7.88288260 [2080] Magic string =)? LA? ¤ S +% o ·? Ofai 0x10
00000084 7.88289118 [2080] Start of file data file offset (from file beginning) = 0x1C8 0x14 where the file list header starts
00000085 7.88291550 [2080] Unknown1 = 0x0 0x18
00000086 7.88293982 [2080] Unknown2 = 0x0 0x1C
00000087 7.88296556 [2080] Unknown3 = 0x0 0x20
00000088 7.88298893 [2080] Current position in file is 0x20
00000089 7.88462019 [2080]
00000090 7.88462019 [2080] Reading info header data starting at 0x20
00000091 7.88464642 [2080] File format revision = 0x7 0x24
00000092 7.88468218 [2080] File size in bytes = 9277620 0x28
00000093 7.88470554 [2080] CRC value = 0xEBF60FF2 0x2C
00000094 7.88473082 [2080] Bytes from offset to start of sections = 0x48 0x30 bytes from start of this to first section
00000095 7.88475418 [2080] Number of sections = 8 0x34
00000096 7.88477850 [2080] Root object type (?) = 0x6 0x38
00000097 7.88480377 [2080] Root object offset (?) = 0x4DE0 0x3C
00000098 7.88482809 [2080] Unknown1 = 0x0 0x40
00000099 7.88485146 [2080] Unknown2 = 0x0 0x44
00000100 7.88488197 [2080] Tag = 0x80000032 0x48
00000101 7.88491631 [2080] Current position in file is 0x68
00000102 7.88739300 [2080]
00000103 7.88739300 [2080] Reading section 0 (arttoolinfo) data starting at 0x68
00000104 7.88742304 [2080] Unknown = 0x0 0x6C always 0x0
00000105 7.88744879 [2080] Section file offset = 0x1C8 0x70 where this section starts in the file
00000106 7.88747454 [2080] Compressed size = 70 384 0x74 compressed size and uncompressed sizes should equal for SH5 GR2s
00000107 7.88749933 [2080] Uncompressed size = 70 384 0x78 compressed size and uncompressed sizes should equal for SH5 GR2s
00000108 7.88752460 [2080] Alignment = 0x4 0x7C what the alignment boundary is in the file
00000109 7.88754940 [2080] Start of data fileoffset = 0xB478 0x80 start of data
00000110 7.88757324 [2080] Start of data fileoffset2 = 0xBD48 0x84 start of data
00000111 7.88759804 [2080] Pointers file offset = 0x8CF4DC 0x88 where the pointers for this section are located
00000112 7.88762426 [2080] Number of pointers = 0x8C 2257
00000113 7.88764954 [2080] End of pointers file offset = 0x8D84C4 0x90 where the pointers for the file end
00000114 7.88767385 [2080] Unknown2 = 0xBF 0x94
00000115 7.88770485 [2080] ********* Two pointers to section data that should have same value are different in section 0. Please report to TheDarkWraith@Subsim.com *********
00000116 7.88770485 [2080]
00000117 7.89070749 [2080] This GR2 file has section 0's endofpointersfileoffset! = Filesizeinbytes. This is normally the case.
00000118 7.89070749 [2080]
00000119 7.89376354 [2080] ********* Unknown pointer 2 found to be non-zero in section header 0. It is usually 0x0 *********
00000120 7.89376354 [2080]
00000121 7.89700842 [2080] Current position in file is 0x94
00000122 7.89813089 [2080]
00000123 7.89813089 [2080] Reading section 1 (vertex_data) data starting at 0x94
00000124 7.89827967 [2080] Unknown = 0x0 0x98 always 0x0
00000125 7.89846277 [2080] Section file offset = 0x114B8 0x9C where this section starts in the file
00000126 7.89861059 [2080] Compressed size = 7939076 0xA0 compressed size and uncompressed sizes should equal for SH5 GR2s
00000127 7.89884520 [2080] Uncompressed size = 7939076 0xA4 compressed size and uncompressed sizes should equal for SH5 GR2s
00000128 7.89888000 [2080] Alignment = 0x4 0xA8 what the alignment boundary is in the file
00000129 7.89890528 [2080] Start of data fileoffset = 0x792404 0xAC start of data
00000130 7.89893007 [2080] Start of data fileoffset2 = 0x792404 0xB0 start of data
00000131 7.89895535 [2080] Pointers file offset = 0x8D5EA8 0xB4 where the pointers for this section are located
00000132 7.89899445 [2080] Number of pointers = 0 0xB8
00000133 7.89902115 [2080] End of pointers file offset = 0x8D90B4 0xBC where the pointers for the file end
00000134 7.89904451 [2080] Unknown2 = 0x0 0xC0
00000135 7.89906979 [2080] Current position in file is 0xC0
00000136 7.89916039 [2080]
00000137 7.89916039 [2080] Reading section 2 (indicies) data starting at 0xC0
00000138 7.89918518 [2080] Unknown = 0x0 0xC4 always 0x0
00000139 7.89921045 [2080] Section file offset = 0x7A38BC 0xC8 where this section starts in the file
00000140 7.89923811 [2080] Compressed size = 1202304 0xCC compressed size and uncompressed sizes should equal for SH5 GR2s
00000141 7.89926291 [2080] Uncompressed size = 1202304 0xD0 compressed size and uncompressed sizes should equal for SH5 GR2s
00000142 7.89928818 [2080] Alignment = 0x4 0xD4 what the alignment boundary is in the file
00000143 7.89931250 [2080] Start of data fileoffset = 0x125880 0xD8 start of data
00000144 7.89933681 [2080] Start of data fileoffset2 = 0x125880 0xDC start of data
00000145 7.89936161 [2080] Pointers file offset = 0x8D5EA8 0xE0 where the pointers for this section are located
00000146 7.89938545 [2080] Number of pointers = 0 0xE4
00000147 7.89940977 [2080] End of pointers file offset = 0x8D90B4 0xE8 where the pointers for the file end
00000148 7.89943409 [2080] Unknown2 = 0x0 0xEC
00000149 7.89945698 [2080] Current position in file is 0xEC
00000150 7.89948606 [2080]
00000151 7.89948606 [2080] Reading section 3 (unknown3) data starting at 0xEC
00000152 7.89951134 [2080] Unknown = 0x0 0xF0 always 0x0
00000153 7.89953661 [2080] Section file offset = 0x8C913C 0xF4 where this section starts in the file
00000154 7.89956141 [2080] Compressed size = 0 0xF8 compressed size and uncompressed sizes should equal for SH5 GR2s
00000155 7.89958525 [2080] Uncompressed size = 0 0xFC compressed size and uncompressed sizes should equal for SH5 GR2s
00000156 7.89961004 [2080] Alignment = 0x4 0x100 what the alignment boundary is in the file
00000157 7.89963436 [2080] Start of data fileoffset = 0x0 0x104 start of data
00000158 7.89966011 [2080] Start of data fileoffset2 = 0x0 0x108 start of data
00000159 7.89968538 [2080] Pointers file offset = 0x8D5EA8 0x10C where the pointers for this section are located
00000160 7.89970875 [2080] Number of pointers = 0 0x110
00000161 7.89973402 [2080] End of pointers file offset = 0x8D90B4 0x114 where the pointers for the file end
00000162 7.89975739 [2080] Unknown2 = 0x0 0x118
00000163 7.89978123 [2080] Current position in file is 0x118
00000164 7.89981031 [2080]
00000165 7.89981031 [2080] Reading section 4 (unknown4) data starting at 0x118
00000166 7.89983368 [2080] Unknown = 0x0 0x11C always 0x0
00000167 7.89985895 [2080] Section file offset = 0x8C913C 0x120 where this section starts in the file
00000168 7.89988375 [2080] Compressed size = 0 0x124 compressed size and uncompressed sizes should equal for SH5 GR2s
00000169 7.89990807 [2080] Uncompressed size = 0 0x128 compressed size and uncompressed sizes should equal for SH5 GR2s
00000170 7.89993334 [2080] Alignment = 0x4 0x12C what the alignment boundary is in the file
00000171 7.89995766 [2080] Start of data fileoffset = 0x0 0x130 start of data
00000172 7.90002871 [2080] Start of data fileoffset2 = 0x0 0x134 start of data
00000173 7.90005350 [2080] Pointers file offset = 0x8D5EA8 0x138 where the pointers for this section are located
00000174 7.90007734 [2080] Number of pointers = 0 0x13C
00000175 7.90010214 [2080] End of pointers file offset = 0x8D90B4 0x140 where the pointers for the file end
00000176 7.90012598 [2080] Unknown2 = 0x0 0x144
00000177 7.90015030 [2080] Current position in file is 0x144
00000178 7.90018177 [2080]
00000179 7.90018177 [2080] Reading section 5 (unknown5) data starting at 0x144
00000180 7.90020609 [2080] Unknown = 0x0 0x148 always 0x0
00000181 7.90023088 [2080] Section file offset = 0x8C913C 0x14C where this section starts in the file
00000182 7.90025616 [2080] Compressed size = 0 0x150 compressed size and uncompressed sizes should equal for SH5 GR2s
00000183 7.90028095 [2080] Uncompressed size = 0 0x154 compressed size and uncompressed sizes should equal for SH5 GR2s
00000184 7.90030479 [2080] Alignment = 0x4 0x158 what the alignment boundary is in the file
00000185 7.90032911 [2080] Start of data fileoffset = 0x0 0x15C start of data
00000186 7.90035343 [2080] Start of data fileoffset2 = 0x0 0x160 start of data
00000187 7.90037823 [2080] Pointers file offset = 0x8D5EA8 0x164 where the pointers for this section are located
00000188 7.90040207 [2080] Number of pointers = 0 0x168
00000189 7.90042686 [2080] End of pointers file offset = 0x8D90B4 0x16C where the pointers for the file end
00000190 7.90045071 [2080] Unknown2 = 0x0 0x170
00000191 7.90047455 [2080] Current position in file is 0x170
00000192 7.90050316 [2080]
00000193 7.90050316 [2080] Reading section 6 (handles_embedded_strings) data starting at 0x170
00000194 7.90052700 [2080] Unknown = 0x0 0x174 always 0x0
00000195 7.90055180 [2080] Section file offset = 0x8C913C 0x178 where this section starts in the file
00000196 7.90057707 [2080] Compressed size = 25 504 0x17C compressed size and uncompressed sizes should equal for SH5 GR2s
00000197 7.90060329 [2080] Uncompressed size = 25 504 0x180 compressed size and uncompressed sizes should equal for SH5 GR2s
00000198 7.90062714 [2080] Alignment = 0x4 0x184 what the alignment boundary is in the file
00000199 7.90065193 [2080] Start of data fileoffset = 0x63A0 0x188 start of data
00000200 7.90067625 [2080] Start of data fileoffset2 = 0x63A0 0x18C start of data
00000201 7.90070057 [2080] Pointers file offset = 0x8D5EA8 0x190 where the pointers for this section are located
00000202 7.90072441 [2080] Number of pointers = 813 0x194
00000203 7.90074921 [2080] End of pointers file offset = 0x8D90B4 0x198 where the pointers for the file end
00000204 7.90077305 [2080] Unknown2 = 0x0 0x19C
00000205 7.90079689 [2080] Current position in file is 0x19C
00000206 7.90082502 [2080]
00000207 7.90082502 [2080] Reading section 7 (unknown7) data starting at 0x19C
00000208 7.90084934 [2080] Unknown = 0x0 0x1A0 always 0x0
00000209 7.90087414 [2080] Section file offset = 0x8CF4DC 0x1A4 where this section starts in the file
00000210 7.90089798 [2080] Compressed size = 0 0x1A8 compressed size and uncompressed sizes should equal for SH5 GR2s
00000211 7.90092278 [2080] Uncompressed size = 0 0x1AC compressed size and uncompressed sizes should equal for SH5 GR2s
00000212 7.90094709 [2080] Alignment = 0x4 0x1B0 what the alignment boundary is in the file
00000213 7.90097284 [2080] Start of data fileoffset = 0x0 0x1B4 start of data
00000214 7.90099812 [2080] Start of data fileoffset2 = 0x0 0x1B8 start of data
00000215 7.90102434 [2080] Pointers file offset = 0x8D84C4 0x1BC where the pointers for this section are located
00000216 7.90104771 [2080] Number of pointers = 0 0x1C0
00000217 7.90107298 [2080] End of pointers file offset = 0x8D90B4 0x1C4 where the pointers for the file end
00000218 7.90109682 [2080] Unknown2 = 0x0 0x1C8
00000219 7.90112019 [2080] Current position in file is 0x1C8
00000220 7.90136480 [2080] Section 7 pointersfileoffset + numberofpointers! = File length. This is usually the case
00000221 7.90136480 [2080]
00000222 7.91347837 [2080]
00000223 7.91347837 [2080] File info offset at 0x8 (0x1D0)
00000224 7.91352558 [2080] Number of textures = 8 0xC (0x1D4)
00000225 7.91421366 [2080] Start of textures pointer found at 0x14 (0x1DC)
00000226 7.91423941 [2080] Start of textures pointer points to 0x3AC (0x574)
00000227 7.91426468 [2080] Number of materials = 20 0x14 (0x1DC)
00000228 7.91433716 [2080] Start of materials pointer found at 0x1C (0x1E4)
00000229 7.91436100 [2080] Start of materials pointer points to 0x62C (0x7F4)
00000230 7.91438580 [2080] Number of skeletons = 1 0x1C (0x1E4)
00000231 7.91449499 [2080] Start of skeletons pointer found at 0x24 (0x1EC)
00000232 7.91451883 [2080] Start of skeletons pointer points to 0x1A1C (0x1BE4)
00000233 7.91454363 [2080] Number of vertex datas = 20 0x24 (0x1EC)
00000234 7.91473389 [2080] Start of vertex datas pointer found at 0x2C (0x1F4)
00000235 7.91475821 [2080] Start of vertex datas pointer points to 0x7358 (0x7520)
00000236 7.91478300 [2080] Number of tritopologies = 20 0x2C (0x1F4)
00000237 7.91501188 [2080] Start of tritopologies pointer found at 0x34 (0x1FC)
00000238 7.91503716 [2080] Start of tritopologies pointer points to 0x7800 (0x79C8)
00000239 7.91506195 [2080] Number of meshes = 20 0x34 (0x1FC)
00000240 7.91529751 [2080] Start of meshes pointer found at 0x3C (0x204)
00000241 7.91532516 [2080] Start of meshes pointer points to 0x7EEC (0x80B4)
00000242 7.91534996 [2080] Number of models = 1 0x3C (0x204)
00000243 7.91563559 [2080] Start of models pointer found at 0x44 (0x20C)
00000244 7.91566038 [2080] Start of models pointer points to 0xA60C (0xA7D4)
00000245 7.91568565 [2080] Number of trackgroups = 1 0x44 (0x20C)
00000246 7.91599464 [2080] Start of trackgroups pointer found at 0x4C (0x214)
00000247 7.91601849 [2080] Start of trackgroups pointer points to 0xA6BC (0xA884)
00000248 7.91604328 [2080] Number of animations = 1 0x4C (0x214)
00000249 7.91679955 [2080] Start of animations pointer found at 0x54 (0x21C)
00000250 7.91682339 [2080] Start of animations pointer points to 0xB458 (0xB620)
00000251 7.91687727 [2080] Number of unknown = 0 0x54 (0x21C)
00000252 7.91727591 [2080] Start of unknown not found in file pointers
00000253 7.91730213 [2080] Current position in file is 0x224
00000254 7.91732693 [2080]
00000255 7.91732693 [2080] Reading all the pointers for section 0
00000256 7.98605824 [2080] ********* Exception occured. Exception is System.ArgumentException: The buffer output symbols is not sufficient to store the encoded characters, the encoding "Unicode (UTF-8)" reserve "System.Text.DecoderReplacementFallback".
00000257 7.98605824 [2080] Parameter name: chars
00000258 7.98605824 [2080] in System.Text.Encoding.ThrowCharsOverflow ()
00000259 7.98605824 [2080] in System.Text.Encoding.ThrowCharsOverflow (DecoderNLS decoder, Boolean nothingDecoded)
00000260 7.98605824 [2080] in System.Text.UTF8Encoding.GetChars (Byte * bytes, Int32 byteCount, Char * chars, Int32 charCount, DecoderNLS baseDecoder)
00000261 7.98605824 [2080] in System.Text.DecoderNLS.GetChars (Byte * bytes, Int32 byteCount, Char * chars, Int32 charCount, Boolean flush)
00000262 7.98605824 [2080] in System.Text.DecoderNLS.GetChars (Byte [] bytes, Int32 byteIndex, Int32 byteCount, Char [] chars, Int32 charIndex, Boolean flush)
00000263 7.98605824 [2080] in System.Text.DecoderNLS.GetChars (Byte [] bytes, Int32 byteIndex, Int32 byteCount, Char [] chars, Int32 charIndex)
00000264 7.98605824 [2080] in System.IO.BinaryReader.InternalReadOneChar ()
00000265 7.98605824 [2080] in System.IO.BinaryReader.Read ()
00000266 7.98605824 [2080] in System.IO.BinaryReader.PeekChar ()
00000267 7.98605824 [2080] in TheDarkWraith.SilentHunter5.GR2PointerData.ReadNul lTerminatedString (GR2EditorViewer & gr2ev, BinaryReader & br, Int32 & alignment, Int32 & bytesread, Boolean ignorealignment)
00000268 7.98605824 [2080] in TheDarkWraith.SilentHunter5.GR2BasePointers.ReadPo interData (GR2EditorViewer & gr2ev, BinaryReader & br, List `1 & sections, Int32 sectionindex, Int32 numberofpointerstoread, Int32 pointerstartindex, Boolean skippointer, List` 1 & stringsread)
00000269 7.98605824 [2080] in TheDarkWraith.SilentHunter5.GR2File.ReadData (Device & device)
00000270 7.98605824 [2080] in TheDarkWraith.SilentHunter5.GR2File.ReadAndParseGR 2File (Device & device)
00000271 7.98605824 [2080] in TheDarkWraith.SilentHunter5.GR2EditorViewer.tsmiFi leOpen_Click (Object sender, EventArgs e) *********
00000272 7.98605824 [2080]
00000273 10.07775497 [2080] D: \ GAMES \ U-Boats \ data \ Submarine \ NSS_Uboat2a \ NSS_Uboat2a.GR2 closed
00000274 10.07775497 [2080]
00000275 11.59106064 [2080] D: \ GAMES \ U-Boats \ GR2EditorViewer \ GR2EditorViewer.cfg updated
00000276 11.59106064 [2080]

JU_88
10-24-11, 07:25 AM
@TDW,
Privateer may have got the ball rolling, but I can see when someone is pouring their heart and soul in to something and I can see that you have been working tremendously hard on this, the amount of ground you have already covered is remarkable.
I take my hat off to you sir. :salute:

tonschk
10-24-11, 08:04 AM
@TDW,

I take my hat off to you sir. :salute:

:DL Me Too :salute: Amazing :rock:, well done :sunny: TDW :sunny: :yeah:

TheDarkWraith
10-24-11, 08:53 AM
Hi TheDarkWraith!
With the new version, like the previous one, does not appear IIA
I see that the program swears by the encoding, whether it be due to the Russian version of windows?
Other models successfully opened (in folders sea and submarine)

The Type IIA and undersea do not open because my importer still has some problems. The problems stem from how I define the pointers. Since I can read the extended data properly and I know how granny uses/defines embedded strings then I should be able to figure out where the embedded strings end in the file. Once I know this end point then I can adjust the pointer definitions appropriately. I'm working on fixing this today :up:

Obelix
10-24-11, 10:13 AM
I'm working on fixing this today :up:
I don't doubt your success!:up::salute:

TheDarkWraith
10-24-11, 11:26 AM
I have the app now reading all the embedded strings referenced in the file at the very beginning (the file itself tells me all this info). It spits them all out to debug output so it can be captured with DbgView. It also spits out where the embedded strings start and where they end. Where they end is key as I needed this so my pointer definitions can be correct :D

Tried opening IIA and Undersea and they still failed. They didn't fail because of the pointers this time - they failed because there is additional data in the file. I don't know what this additional data is but I have to find out now (or at least account for it so I can 'read' over it) :up:

@Obelix - the error you pointed out a few posts above is due to my error checker class that I coded in. Based on what the file tells me (and what I currently know about the GR2 file) it has a set of knowns that it looks for. If it doesn't find all these knowns then it throws an exception to tell me (or you) that there's something different in this file. Very handy.

TheDarkWraith
10-24-11, 12:14 PM
I've had a couple of people ask how they can start working on the algorithms for the pointers. This is great :yeah: I can't give you any info yet until I get my importer working correctly. This is because I want to ensure I can read the file correctly and I'm reading/interpreting everything correctly before giving this info :up:

TheDarkWraith
10-24-11, 11:08 PM
v1.0.294.0 released. See post #1

This version now reads all the embedded strings used by the file and then spits them out to debug output along with offset in file and actual position. The order of these is how they are read from the pointers. Kind of interesting. I needed this info to adjust my pointer definitions so that pointers referencing items after the end of the embedded strings would be defined correctly.

Redid the reading of the ArtToolInfo section to remove some hard coded items and because I learned more about it and where I thought things were were not. Still not happy with it (still contains a few hard coded items) so I'm still working on it.

Fixed items that we displaying incorrect offset in section and actual file position (mainly was the ArtToolInfo:ExtendedData:DocumentContents:Elements items)

Added more error checking since I now know where the embedded strings start and end in the file. Error checking also added for start of ExporterInfo section (it's calculated based on the end of the ArtToolInfo:ExtendedData:DocumentContents:Elements or I forget what the other one was - whether this is a special GR2 file matters also in this calculation)

Now tells you whether this is a 'special' GR2 file (that is if pointers come before data) in the debug output

Items that have subitems now use idention to make the reading of them easier in the debug output

The outputting of the ArtToolInfo:ExtendedData contents to the debug output has changed. Much easier to read and better information given

Still can't read the VIIA or Undersea GR2 files due to additional unknown data found in them. Still working on it.

Map enables/Map amounts now show the number of them in []s and also each entry shows it's offset in section and actual file position in the debug output

Corrected formatting errors in the debug output (some items had negative values - i.e. 0xFFFF___)

There are a few other things but can't think of them currently :DL

TheDarkWraith
10-26-11, 08:57 AM
Much of the beginning information the app spits out is 'hard-coded' items. I asked myself how does Granny know what it knows? From the multitude of GR2 files out there one simply couldn't hard-code for everything. There must be some kind of 'trigger' or something that Granny reads to figure out how to display/read everything. That is what I'm working on currently.

Much of this has to do once again with the pointers. Some of the pointers form a linked-list of sorts. You read one pointer and as it's decoded it points you to another pointer which then points you to another and so on and so forth. This is recursion at its best :yep: So far I've followed the pointer trail to how the Granny Viewer knows how to display the ArtToolInfo and it's submenus. Now I just have to code in something that can read these 'linked-lists' and be totally autonomous.

Madox58
10-26-11, 07:59 PM
7A loads fine for me with your last version.

Would a defined version of the UnderSea gr2 file help you?

TheDarkWraith
10-27-11, 08:35 AM
7A loads fine for me with your last version.

Would a defined version of the UnderSea gr2 file help you?

I'd be willing to look it over. The problem currently is I have to get rid of the hard-coded items I have. I know where the ArtToolInfo resides and how to read it but I need the app to be dynamic and let the pointers tell it where to read this from. Once I get over this hurdle then the rest should be cake. I have it reading the embedded strings dynamically. Now I'm making it read any data associated with those strings dynamic. This is proving to be a little on the challenging side though.
I've coded in the checking of the file size in bytes and the auto correcting of it. Adding the CRC checker and auto correcting of it also :DL

7A has always loaded fine. It's the IIA and undersea that won't load due to some additional data contained in them that I haven't figured out what the purpose is for yet. Because of my current hard-coded reading of the ArtToolInfo these will always fail. That is why I'm moving to dynamic reading of information. Live and learn.

tonschk
10-28-11, 07:43 AM
:DL Thank you very much :salute: TheDarkWraith for this Magnificent Work you are doing :yeah:

Madox58
10-28-11, 05:42 PM
I'd be willing to look it over. The problem currently is I have to get rid of the hard-coded items I have. I know where the ArtToolInfo resides and how to read it but I need the app to be dynamic and let the pointers tell it where to read this from. Once I get over this hurdle then the rest should be cake. I have it reading the embedded strings dynamically. Now I'm making it read any data associated with those strings dynamic. This is proving to be a little on the challenging side though.
I've coded in the checking of the file size in bytes and the auto correcting of it. Adding the CRC checker and auto correcting of it also :DL

7A has always loaded fine. It's the IIA and undersea that won't load due to some additional data contained in them that I haven't figured out what the purpose is for yet. Because of my current hard-coded reading of the ArtToolInfo these will always fail. That is why I'm moving to dynamic reading of information. Live and learn.

SummaryInfo in the Undersea.gr2 is blank.
Appears to be for comments which is probably useless anyway.

IIA has an animation which adds info to the Section 0 stuff as a start.

I'll finish up some things and send you a link.

urfisch
10-29-11, 04:34 AM
:salute:

:up:

TheDarkWraith
10-29-11, 08:42 AM
SummaryInfo in the Undersea.gr2 is blank.
Appears to be for comments which is probably useless anyway.

IIA has an animation which adds info to the Section 0 stuff as a start.

I'll finish up some things and send you a link.

:up:

The file size checker/fixer has been coded in.
The CRC-32 checker/fixer has been coded in.

These two items will be checked when the file is first loaded. If either/both are incorrect it will ask if you want to fix each one. The fix will be immediately written to the file :DL

TheDarkWraith
10-30-11, 12:41 AM
Recursion can be a powerful thing. It is sometimes very difficult to setup/get correct. This was the case for the reading of the extended data for items. On my plane flight home from Portland, OR I was single stepping through the debugger in Visual Studio trying to get the recursion correct for item's extended data. I finally have it working correctly for the extended data now :rock: I had the reading of the item's extended data 'hard-coded' for I knew basically what to expect. This was not acceptable to me because there are probably files that contain more or less in extended data. I needed this to be dynamic and let the file tell me what it has.
I didn't fully understand at first how say GrannyViewer knew how to read everything that it did (and thus was why many things were 'hard-coded'). This took some time to figure out. Now I fully understand :D Nothing (currently) is hard-coded in the app. It is fully dynamic and it knows what to read from those magical pointers (and some other new pointers that I call data type pointers).
Just because it's fully dynamic doesn't mean it can read everything. If it doesn't 'understand' something (it reads something and the app doesn't know what it read/how to interpret it) then it will fail. This is currently the case with any GR2 file that has animations in it. I have not told the app how to handle animations. The mystery data in undersea and VIIA it doesn't know how to handle either (yet). Those I am still working on :yep:

This new version (1.0.322.0) includes the above and also the file size checker and CRC-32 checker. You'll notice new text in the DbgView output for these and also for the ArtToolInfo's extended data (it will look like GrannyViewer shows it because that's how it told me to read it ;))

New version 1.0.322.0 released. See post #1

:|\\

TheDarkWraith
10-31-11, 12:10 AM
Version 1.0.335.0 released. See post #1.

This version fixes the offsets reported wrong in the FileHeader and InfoHeader debug output.

Fixed bug in the extendeddata recursion function where if an item had no subitems you would get an exception.

More error checking added in this version. As a result of some of this I somehow totally overlooked not reading ALL the pointers for section 0. All this time I thought I was reading them all but the error checker told me differently. When I did the math it was quite evident that I've been overlooking pointers in section 0. I will be looking into what these 'new' pointers do now.

This version will now read just about any GR2 file in SH5 (except for Undersea). That means it will now read the VIIA sub :yeah: I know why Undersea will not read and it's because I found a small part of hard-coded reading of ArtToolInfo:ExtendedData in the app. I will fix this in the next version :yep: I was able to open air units, sub units, land units, and files in the \data\Library folder.

If you find a file that will not open please let me know (except for \data\Library\Undersea.gr2) :DL

When looking over the Debug output if you see any offsets (or actual file positions) or values that look suspicious/strange let me know. I hope I've corrected all the errors in those. If you can, compare random items in the Debug output to the actual file and see if they match or not.

Next version I hope to have the ability to change just about anything in the extendeddata of an item coded in. I also hope to have coded in the ability to adjust properties of items also (position, rotation, color, etc.)

If I have time and haven't coded in too much (I don't like to add too much to each version) I'll start working on the exporter so you can rip whatever you want from the GR2 file. I plan on making the exporter rip to OBJ format for now. I plan on adding Microsoft's X format to it in time. Additional formats might happen depending on the information available on them (so I know how to make the format).

:|\\

tonschk
10-31-11, 02:43 AM
Version 1.0.335.0 released. See post #1.

This version will now read just about any GR2 file in SH5 (except for Undersea). That means it will now read the VIIA sub :yeah: I know why Undersea will not read and it's because I found a small part of hard-coded reading of ArtToolInfo:ExtendedData in the app. I will fix this in the next version :yep:

:|\\

Very Good :salute: TheDarkWraith :yeah: Well done

TheDarkWraith
10-31-11, 12:17 PM
v1.0.342.0 released. See post #1

This version removed the hard-coded reading of some items in the ArtToolInfo:ExtendedData. Now the file tells it what to read based on the pointers. As a result of this the Undersea.gr2 file can now be read :up: There is currently only one file I've found that it can't open still - \data\Library\ShipParts\guns_radars_01.gr2. Looking into why currently....

TheDarkWraith
10-31-11, 03:34 PM
Was single stepping the guns_radars_01.GR2 file in the Visual Studio debugger and noticed something interesting. It is a special GR2 file (pointers come before data) but it doesn't want to follow the 'rules' that these type of files have followed in the past (NSS_Undine for example). Now I have to figure out what makes the rules change and why :shifty: Maybe someone might know the answer to this? Beuhler? :06:

Normally in these type of files (these 'special' GR2 files) you have a pointer to say a model. That pointer then references a table (think of it as a virtual function table in exe files). The table points it to where the actual model is. This one doesn't want to use the table - it wants to go straight to the model.....

In normal GR2 files when you have a pointer to something (say a model) it points to the actual item. There is no table or indirect pointer for it.

TheDarkWraith
10-31-11, 04:22 PM
didn't take as long as I thought to figure out the above problem.
There are two 'rules' (so far) to special GR2 files (pointers before data):
- if section 0's unknown2 is 0x0 then the pointer to the model will access the pointer table (think of it as v-table in exe files)
- if section 0's unknown2 > 0x0 then the pointer to the model points to the model (acts like a normal GR2 file in this regard)

I wonder what other interesting little things like this will rear their ugly head :hmmm:

Version 1.0.348.0 released. See post #1.

You should be able to open ANY SH5 GR2 file now. Let me know if you come across one that won't open :yeah:

Will-Rommel
10-31-11, 04:42 PM
Impressive sir, i hope there wont be to much of those "exceptions" you encountered. (Must be a nightmare to treat) :salute:

Vanilla
10-31-11, 04:44 PM
That's just awesome progress! Well done!

As of problems: I cannot open \data\Characters\CharacterBodyParts.gr2 due to errors in section 0 endpointersfileoffset being not equal to filesizeinbytes.
When I try to open NSS_Uboat*.gr2 files - the EVEI gives me a lot of
Exception
C:\Ubisoft\Silent Hunter 5\data\Submarine\NSS_Uboat2a\NSS_Uboat2a.GR2 closed
********* Exception while presenting
Exception is ***1054;***1096;***1080;***1073;***1082;***1072; ***1074; ***1087;***1088;***1080;***1083;***1086;***1078;** *1077;***1085;***1080;***1080;.
-2005530516 (D3DERR_INVALIDCALL)
***1074; Microsoft.DirectX.Direct3D.Device.BeginScene()
***1074; TheDarkWraith.SilentHunter5.Graphics.Render() *********
...
which goes in endless loop. (WindowsXP 32 locale is RU)

None of the animations' gr2s can be opened either due to skeleton's data absence, but I recon - animations are thing of the future as of yet. When I open 'waypoints' files - I see nothing but no errors either, though I guess this is normal.
I am still hoping to create fully functioning crew and it appears that only you can make it possible, TDW, thanks for all your hard work.

THE_MASK
10-31-11, 05:14 PM
Yay , i can open the trees and the undersea rocks . Thats all i need :O:

TheDarkWraith
10-31-11, 07:25 PM
That's just awesome progress! Well done!

As of problems: I cannot open \data\Characters\CharacterBodyParts.gr2 due to errors in section 0 endpointersfileoffset being not equal to filesizeinbytes.
When I try to open NSS_Uboat*.gr2 files - the EVEI gives me a lot of
Exception
C:\Ubisoft\Silent Hunter 5\data\Submarine\NSS_Uboat2a\NSS_Uboat2a.GR2 closed
********* Exception while presenting
Exception is ***1054;***1096;***1080;***1073;***1082;***1072; ***1074; ***1087;***1088;***1080;***1083;***1086;***1078;** *1077;***1085;***1080;***1080;.
-2005530516 (D3DERR_INVALIDCALL)
***1074; Microsoft.DirectX.Direct3D.Device.BeginScene()
***1074; TheDarkWraith.SilentHunter5.Graphics.Render() *********
...
which goes in endless loop. (WindowsXP 32 locale is RU)

None of the animations' gr2s can be opened either due to skeleton's data absence, but I recon - animations are thing of the future as of yet. When I open 'waypoints' files - I see nothing but no errors either, though I guess this is normal.
I am still hoping to create fully functioning crew and it appears that only you can make it possible, TDW, thanks for all your hard work.


I will look into these problems :up: Nothing for animations has been coded yet. The hard part is figuring out how the animations work in GR2 files. I know how to read animations from dat files but GR2 is a whole different story.

As far as the waypoint files you need to turn the bones on. They have no models or meshes, they are strictly bones :up: EDIT: ok just tried it myself and nothing showed. Will look into this.

The animation ones made me laugh when I just tried to open one up. Of course it has no skeleton, it's all animation data. At least my error checker is working as programmed. I'll correct this.

TheDarkWraith
10-31-11, 08:03 PM
The bones problem has been fixed for those GR2 files that contain nothing but bones (waypoint files). A side benefit from this is that I finally figured out why the rendering was so slow when you enabled the bones on some GR2 files. I had the bones being rendered everytime a mesh was being rendered :nope: This means the bones were sometimes rendered >=20+ times which really slowed things down. Problem fixed and FPS back up where it should be :up:

Fixing the no skeleton ones now.

Adding lighting to the app. Should be able to take some cool screenshots of models with the lighting that I'm adding. You'll be able to add as many lights as your video card supports. You can add directional, spotlights, and point lights. You can also turn on ambient lighting if you wish. You can control the ambient, diffuse, and specular color of each light. You also can set the specular strength. For spotlights you can change the attenuation, inner and outer cone angles, and fade. For those lights that have position and direction you'll be able to specify those also.

The app now reads the material properties from the extendeddata of the materials assigned to the mesh. It then applies these when rendering now (this was needed for lighting) :up:

THE_MASK
10-31-11, 08:03 PM
If i want to look at animations in goblin i have to open the CharacterBodyParts GR2 file and then merge the CharacterBodyParts CHR file then merge the animations .

TheDarkWraith
10-31-11, 08:05 PM
If i want to look at animations in goblin i have to open the CharacterBodyParts GR2 file and then merge the CharacterBodyParts CHR file then merge the animations .

that's correct :up: I'll probably start looking into reading of the animation data next week :DL

EDIT:

Those GR2 files without models and/or skeletons is no longer a problem. That problem has been fixed.

Madox58
10-31-11, 08:54 PM
Your doing great so far on SH5 type files.
:yep:
Of course that is the main aim at this point.
But if you ignore other GR2 files from other Games?
You may miss how this all adds up.

TheDarkWraith
10-31-11, 09:19 PM
v1.0.357.0 released. See post #1.

This version addresses the problems posted above.

Side benefit of looking into those problems was I fixed the 'stuttering' when the bones are enabled :yeah:

Should be able to open all SH5 GR2 files now except for bunker_lights.GR2. It's a completely different beast as far as the pointers go :hmmm:

I was working on lighting but it's not complete yet. This version has some code for lighting in it but it's not complete and thus disabled still :yep:

Vanilla
11-01-11, 06:31 AM
If i want to look at animations in goblin i have to open the CharacterBodyParts GR2 file and then merge the CharacterBodyParts CHR file then merge the animations .

The other way is to open the CharacterBodyParts.GR2 and simultaneously all the animations in Granny Viewer, I've described it somewhere... aha, found it here (http://www.subsim.com/radioroom/showpost.php?p=1636545&postcount=25).

[praise for TDW's work on]
Thing with animations is that we need to add way more animations if we want a more or less realistic crew. Right now many animations even the very basic ones like running, climbing ladders (no, the bunker lamp-changing animation will not do :)) or infamous going-through-hatch are absent. More to that: adding or editing animation waypoints is a cumbersome process requiring hex-editing and juggling files trying to trick SH5 into using them and after that you aren't able to see the end result in Goblin so you have to load SH5 mission everytime you want to check your changes... :damn: So when problems with animations are further compounded by limited and buggy crew scripting - this can turn even die-hard modders away. When TDW will crack the GR2 exporting problem (and I am 99% sure he will as he is a genius :up:) it will greatly simplify crew modding as well. So hopefuly it is not only new ships and environment we'll see.
[praise for TDW's work off]

urfisch
11-01-11, 11:15 AM
thank you for your great succes so far, tdw!

:up:

Vanilla
11-01-11, 12:09 PM
I've tried the last version and it seems to stop working for me completely. On trying to open almost any file I get this:

Silent Hunter 5 GR2 Editor/Viewer v1.0.357.0 by TheDarkWraith
Reading in cfg file...
DirectX initialized
SH5 install path set to C:\Ubisoft\Silent Hunter 5
GR2 file path is C:\Ubisoft\Silent Hunter 5\data\Sea\CMD_small_boat\LifeBoat.GR2
********* Exception while presenting
Exception is ***1054;***1096;***1080;***1073;***1082;***1072; ***1074; ***1087;***1088;***1080;***1083;***1086;***1078;** *1077;***1085;***1080;***1080;.
-2005530516 (D3DERR_INVALIDCALL)
***1074; Microsoft.DirectX.Direct3D.Device.GetTransform(Tra nsformType state, Int32* result)
***1074; Microsoft.DirectX.Direct3D.Device.GetTransform(Tra nsformType state)
***1074; Microsoft.DirectX.Direct3D.Transforms.get_World()
***1074; TheDarkWraith.SilentHunter5.GR2Bone.Render(Graphic s& graphics)
***1074; TheDarkWraith.SilentHunter5.GR2Model.Render(Graphi cs& graphics)
***1074; TheDarkWraith.SilentHunter5.GR2File.Render(Graphic s& graphics)
***1074; TheDarkWraith.SilentHunter5.Graphics.Render() *********


Maybe the problem is on my side... :hmmm:

TheDarkWraith
11-01-11, 05:56 PM
I've tried the last version and it seems to stop working for me completely. On trying to open almost any file I get this:

Silent Hunter 5 GR2 Editor/Viewer v1.0.357.0 by TheDarkWraith
Reading in cfg file...
DirectX initialized
SH5 install path set to C:\Ubisoft\Silent Hunter 5
GR2 file path is C:\Ubisoft\Silent Hunter 5\data\Sea\CMD_small_boat\LifeBoat.GR2
********* Exception while presenting
Exception is ***1054;***1096;***1080;***1073;***1082;***1072; ***1074; ***1087;***1088;***1080;***1083;***1086;***1078;** *1077;***1085;***1080;***1080;.
-2005530516 (D3DERR_INVALIDCALL)
***1074; Microsoft.DirectX.Direct3D.Device.GetTransform(Tra nsformType state, Int32* result)
***1074; Microsoft.DirectX.Direct3D.Device.GetTransform(Tra nsformType state)
***1074; Microsoft.DirectX.Direct3D.Transforms.get_World()
***1074; TheDarkWraith.SilentHunter5.GR2Bone.Render(Graphic s& graphics)
***1074; TheDarkWraith.SilentHunter5.GR2Model.Render(Graphi cs& graphics)
***1074; TheDarkWraith.SilentHunter5.GR2File.Render(Graphic s& graphics)
***1074; TheDarkWraith.SilentHunter5.Graphics.Render() *********


Maybe the problem is on my side... :hmmm:

If you could send me the output of the DbgView that would be great. I haven't had any reports of problems with the app so I'm fairly certain the problem is with your system. I would still like to review the DbgView output.
Is your DirectX up to date? Try running the web updater for it at Microsoft's website. If you're using Win7 and have never ran the web updater then that is most likely where the problem is. Win7 comes with DirectX10 and I'm targeting DirectX9 (currently). You have to install DirectX9 from Microsoft for Win7. Yes it sounds strange but it's true. And don't worry DirectX9 and DirectX10 can live together on your system (they are completely different assemblies) :yep:
Has this problem been there with every version I have released? If not, what version did it start?

TheDarkWraith
11-02-11, 01:34 AM
v1.0.366.0 released. See post #1

This version adds lighting to the app. You can add ambient lighting, direct lighting, point lights, and spotlights. It will let you add as many lights as your video card supports (GTX590 should be 10 cause that's what it showed for me). You control every aspect of the light - ambient color, diffuse color, specular color, direction, position, etc. Not every light has the same parameters though (Direct lighting doesn't have a position - it only has direction).

The direction parameter is a vector.
If you want to know what each parameter is/does google search them. You'll need to search for the light type (direct light, spotlight, point light) and add DirectX after it.

There are two new tabs in the tabcontrol box, Rendering and Lighting. The cullmode and shademode has been moved to the Rendering tab. Anything dealing with lighting is under the Lighting tab. To add a light click on the buttons in the Add light box. To remove a light select the light from the treeview and the click Remove in the Remove light box. To temporarily 'remove' a light uncheck it in the treeview. If it's checked then DirectX is using it for lighting calculations. To edit the parameters of a light double click it in the treeview. This will bring up the Add/Edit light page.
To add ambient lighting click on Enable (make it checked) under Ambient lighting. You can also change the color of the ambient light by clicking the Color button in the ambient lighting box.

Each light (except ambient light) has 3 colors - Ambient, Diffuse, and Specular. To change the color of each one click the button in the Ambient, Diffuse, or Specular box.

I'm setting the renderstate material properties according to what was read for the mesh's material's extendeddata.

I haven't added a screenshot button to the app but that will be in next version.

Next version will hopefully have the ability to render using the programmable pipeline (shaders). Currently all rendering is being done using the fixed-function pipeline in DirectX. I'm going to let the user choose which rendering style they want to use - programmable or fixed-function.

I'm also going to add the ability to import other objects to the current object. Those @LNK entries? I'm going to try and make the app automatically load those objects. I'm going to try and do the same for those cfg# entries.

Lots of work to do still. This just adds some 'fluff' to the app :cool:

:|\\

tonschk
11-02-11, 09:57 AM
I'm going to let the user choose which rendering style they want to use - programmable or fixed-function.

:|\\


:yeah: Very Good :DL Thank you A Lot :salute: TheDarkWraith :sunny:

TheDarkWraith
11-02-11, 08:39 PM
v1.0.373.0 released. See post #1

This version I started coding in the ability to edit the skeleton/bone's parameters. To edit the skeleton/bone's parameters double click the skeleton or bone in the bones tab's treeview display. That will bring up this window:

http://www.subsim.com/radioroom/picture.php?albumid=553&pictureid=5076

Currently the only thing you can change is the LODType for the skeleton. The numbers in parenthesis after the LODType is section number / offset in section / position in file. This same information is found in the bones part when you expand the node.

Once focus has left the box you edited the change is immediately written to the file.

For the entries in the bones part of the new window they will act the same way. You will double click the item and a new window will appear that will allow you to edit it's value(s). Still coding in that part :up:

If you spot anything that looks irai on this new window let me know :yep:

THE_MASK
11-02-11, 09:19 PM
How do i get a better view of the object ?
http://img843.imageshack.us/img843/6164/19350491.jpg (http://imageshack.us/photo/my-images/843/19350491.jpg/)

TheDarkWraith
11-02-11, 09:51 PM
Those are basically sprites being rendered onto a quad. You can't get a better picture than what you have. You can go to FillMode tab and select solid. If you want the texture to show ensure Texture is checked.
Under the Meshes tab you can choose which meshes to render. That will make viewing a single mesh (object) much easier.

If you're asking how to zoom in/out then right mouse click and hold and move mouse fwd/backward.

If you're asking about something else then please clarify :up:

If you want to change their size then you'll need to change the scaling of the mesh (might work for bone also). As I haven't finished coding that part yet you'll have to edit the file manually. The app will tell you where the addresses are though so using the hex editor will be much easier to do.

THE_MASK
11-02-11, 10:01 PM
How do i turn it side on , world axis ?

TheDarkWraith
11-03-11, 05:41 AM
How do i turn it side on , world axis ?

Left mouse click and hold and move mouse left/right/forward/backwards to rotate camera. Center mouse click and hold and move mouse left/right to pan left/right, forward/backward to pan up/down

EDIT:

I've been debating about adding another camera mode. I like the camera mode I have now but it is sometimes annoying when trying to get up close to something positioned far out and rotate it. The camera mode now rotates around the look at point. The other mode I'm debating about adding would let the look at point rotate around the eye (same thing as transforming the world). I may even drop my now camera mode for this other mode as it offers greater flexibility in positioning/rotating.

Will-Rommel
11-04-11, 10:04 PM
No updates today? Must be the first time in 2 weeks!

Courage tdw ! :up:

TheDarkWraith
11-04-11, 10:25 PM
No updates today? Must be the first time in 2 weeks!

Courage tdw ! :up:

Had to work on the UIs mod today (and still working on it) :up:

redcoat22
11-07-11, 04:41 PM
Very exciting stuff

Ekmek
11-21-11, 02:51 PM
First off - Great Work!

I apologize if this has been asked (I haven't gone throug the 15 pages of this thread yet). But is it possible to get a GR2 exported into something that Blender can import. I saw that exporting to OBJ is in work. Does that include Bones and meshes?

Thanks!

EDIT: I do het an error that says:

Info header tag value expected to be 0x80000032

When I try to open a Civ5 GR2 file

TheDarkWraith
11-21-11, 03:30 PM
First off - Great Work!

I apologize if this has been asked (I haven't gone throug the 15 pages of this thread yet). But is it possible to get a GR2 exported into something that Blender can import. I saw that exporting to OBJ is in work. Does that include Bones and meshes?

Thanks!

EDIT: I do het an error that says:

Info header tag value expected to be 0x80000032

When I try to open a Civ5 GR2 file

Yes you will get that error on non-SH5 GR2 files currently. I have it 'locked' to only SH5 GR2 file format for the time being. If I can get everything working with SH5 files then making it work with everything else should be easier. Key word being should.
Right now working on something that I flagged for follow-up that I forgot about. It deals with bone bindings or more specifically mesh to bone bindings. Each mesh is assigned (bound) to a bone in the GR2 files. I went back and reviewed this section of my code and found that I wasn't setting the transform for the mesh before rendering it. So I adjusted the code to set the transform to the bound bone then rendering the mesh and it totally screwed up everything. The meshes were all in the incorrect places. Now I have to figure out how this bone binding is supposed to work :hmmm:

TheDarkWraith
11-21-11, 03:54 PM
maybe someone will find this interesting:

I coded the GR2 editor/viewer to be able to change parameters in the GR2 file now (transform, inverseworldtransform, rotation, maxproperties, etc.). For a test to see if I have the app working correctly I changed the position of crane01 of the King George V. I set the X position to -1.25 from -0.7. Now my app showed the crane as having moved to the new spot but when I checked in Goblin and GrannyViewer they show it hasn't moved. This tells me that the transform data is only used to derive the inverseworldtransform which is what is used to place the item. Interesting :hmmm:

This also means that everything is flipped as to how I'm presenting it with the app. Crane01 is actually on the right side of the ship vice the left like I render it. Wow. I have to make some major changes...

EDIT:

went back and looked at GrannyViewer again and noticed that yes everything is flipped from how I'm presenting it but the crane01 was in fact moved to it's new position. This tells me that the transform used when rendering the mesh is the bounded bone transform (rotation and position) * bounded bone inverseworldtransform.

Everything is flipped because GrannyViewer is using a left hand coordinate system and I'm rendering with a right handed coordinate system.

0rpheus
11-21-11, 04:16 PM
maybe someone will find this interesting:

I coded the GR2 editor/viewer to be able to change parameters in the GR2 file now (transform, inverseworldtransform, rotation, maxproperties, etc.). For a test to see if I have the app working correctly I changed the position of crane01 of the King George V. I set the X position to -1.25 from -0.7. Now my app showed the crane as having moved to the new spot but when I checked in Goblin and GrannyViewer they show it hasn't moved. This tells me that the transform data is only used to derive the inverseworldtransform which is what is used to place the item. Interesting :hmmm:

This also means that everything is flipped as to how I'm presenting it with the app. Crane01 is actually on the right side of the ship vice the left like I render it. Wow. I have to make some major changes...


Blimey, sounds a bit :o but good luck!

TheDarkWraith
11-21-11, 04:22 PM
now you want to talk about confusing check this out:

I moved crane01 to a new position (X of -1.25 from -0.7) and GrannyViewer showed it as moved to new position. I check Goblin Editor and it shows it as not moved (still in original position). Either the devs didn't fully understand the Granny system or they chose to impose their own way of rendering.

To add insult to injury GrannyViewer renders with a left-hand coordinate system and Goblin Editor renders with a right-hand coordinate system...:doh: :dead:

Now the kicker is how is it actually rendered in game....time to find out...if it renders differently I'm going to pull my hair out!

TheDarkWraith
11-21-11, 04:49 PM
This is sad, just utterly sad :nope:

I changed the position, rotation, scaling, and flags of the crane01 (this mesh is supposedly bound to a bone of the same name) of the King George V and NOTHING happened. GrannyViewer shows all the changes but Goblin Editor shows no changes (everything rendered just as nothing had changed). This means that SH5 uses the GR2 files just for storing mesh data and nothing more :shifty: I wondered why when I viewed the individual meshes they were already pre-positioned to where they needed to be :nope: This means we cannot move meshes around without extracting them, repositioning them in 3D model program, then re-importing them back into the GR2 file. That's nuts.

Now the questions begs to be asked, why did they use the Granny system when they don't even use 10% of it's potential? :06: :timeout:

At least with SH3/4 I could change the position and rotation of meshes in the DAT file and those changes were reflected in game...

Bones at least reflect changes made to them but those are only good for waypoints. Talk about a big let down...

Now I have to go back and try my version of the app that used the granny2.dll and see what happens...

Madox58
11-21-11, 04:57 PM
I'd tend to think they got saddled with it but did not have the time to work with it as well as they could have.
:nope:

To do the Open Bunker I had to move the verts themselves.
Same thing on some of SteelVikings stuff I did.

Many of the Games I've checked GR2 files on suffer the same problem.
The Dev's of many Games never went the extra steps that can be done.
Now SWTOR is an interesting use of the Granny System.
As is the First Templar.
:yep:

TheDarkWraith
11-21-11, 05:05 PM
I'd tend to think they got saddled with it but did not have the time to work with it as well as they could have.
:nope:

To do the Open Bunker I had to move the verts themselves.
Same thing on some of SteelVikings stuff I did.

It's quite obvious they either didn't understand what the Granny system can do or just totally ignored it.

The whole point of this app was to make it easier to work with the GR2 files for SH5 but every little step forward I make it's 10 steps backwards :nope: I was working towards taking a piece from a unit and adding it to a different unit but now that's out the window due to not being able to specify rotation and position in the file itself. It's totally absurd to have to pre-position every mesh....I mean what the hell were they thinking? To me that's a basic concept in model building....you build a model of say a crane around world origin then when you add it to another item you specify the rotation and position so that it's positioned where it needs to be on the item.....but pre-positioning?? Did they hire people off the street to program this game? :nope:

Here's how it appears they created the GR2 files used in this game: a 3D modeller made the entire unit - the stacks, extra objects, funnels, hull, etc. - in one drawing. Then they took this one drawing and diced it up (preserving the position of every item) and made a GR2 file out of it. I just can't believe it...

Madox58
11-21-11, 05:10 PM
The positioning was the first thing I noted that was going to be an issue when we reach import ability.
Mostly because of the Tangent stuff.
Now we don't NEED to do the tangents before hand.
But it will force the Game Engine to calculate them on the fly.
So up the system specs when massive imports start rolling in!
(It may also be happening already with imported SH4 Units?)

TheDarkWraith
11-21-11, 05:15 PM
The positioning was the first thing I noted that was going to be an issue when we reach import ability.
Mostly because of the Tangent stuff.
Now we don't NEED to do the tangents before hand.
But it will force the Game Engine to calculate them on the fly.
So up the system specs when massive imports start rolling in!
(It may also be happening already with imported SH4 Units?)

The only thing I can see to do is store an offset of the sum where the item was originally and where the user wants it to be. Then apply this offset to every vertice in the mesh thus achieving the same effect. Nuts :shifty:

Thank god that if I set the mesh's transform to be the bone's transform * the bone's inversetransform it positions the mesh where it needs to be. Thus I can figure out the offset required by doing what I mentioned.

Madox58
11-21-11, 05:21 PM
Actually?
Few modder in the 3D area center the different meshes before importing to SH3 or SH4 on totally custom models.
Most of what is done incases like that is to leave the meshes at 0 coords.
So for them? It may be a God sent feature or have no impact at all.

longam
11-21-11, 05:21 PM
Did they hire people off the street to program this game? :nope:

I seem to remember them doing a posting about hiring in this forum, but you had to live in Romania. You could be right. :o

Madox58
11-21-11, 05:24 PM
I seem to remember them doing a posting about hiring in this forum, but you had to live in Romania. You could be right. :o
I have exchanged E-Mails with a few of the Devs about the Granny System and more in the 3D area.

They are quite talented and knew what they were doing.

It's the programmers that got thrown the Granny System and not enuff time to use it to it's greatest advantage.
:nope:

Read a Blog from Dave at RAD Game Tools and you'll quickly realize how lucky SH 5 users and Modders may be!
http://radgranny.blogspot.com/2011_09_01_archive.html

chrysanthos
11-21-11, 05:25 PM
i believe in you my friend:)...you are the one that is going to make the first playble ship for silent hunter 5....even if it takes a year or more right? see ya;)

longam
11-21-11, 05:28 PM
I have exchanged E-Mails with a few of the Devs about the Granny System and more in the 3D area.

They are quite talented and knew what they were doing.

It's the programmers that got thrown the Granny System and not enuff time to use it to it's greatest advantage.
:nope:

Yup the game is a testimony to the fact of the rush, carry on.

Madox58
11-21-11, 05:32 PM
I doubt I will ever make a 'playable' Ship for SH5.
(I've never made any for SH3 or SH4)
That is not my thing, so to say.
What I do best is waste time, figure out a few things, pass that information to others that can do a better job of implementing it,
then start over.
:haha:

TheDarkWraith
11-21-11, 05:33 PM
Yup the game is a testimony to the fact of the rush, carry on.

Sure is, more and more evident the more we poke into SH5's inner workings.

Reece
11-21-11, 05:33 PM
Good grief! what a nightmare, I can understand why the game was released in the state it was!:doh:

Madox58
11-21-11, 05:38 PM
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$!!
That answer your questioning nature?
:har:

TheDarkWraith
11-21-11, 06:06 PM
ok, after some thought on this here's what I'm going to do:

Bones reposition like they should when you change position and rotation which is good. Meshes on the other hand do not.

Even though meshes are supposedly 'bound' to a bone they are, in fact, not in SH5. Thus if we treat each mesh as a new 'bone' then it will help mitigate the pain and frustration. Since they will be classified as a bone then they will inherit position information (from the GR2Coords class). I'll initialize their position information to 0 (no rotations, no position - (0,0,0)) and set their transform to the Identity transform. This will work because they are already pre-positioned to where they need to be.

Now when the user asks to reposition the item or change it's rotation then these variables will obviously not be 0 anymore. I'll check to see if they are 0 or not and if not then I'll update the mesh's verticies to reflect the change the user wanted.

Now to take what I just described and apply it to the code :DL

The fact that this has to be done in the first place is utterly absurd. There was no reason to use the Granny system...the DAT file system would've done everything they needed.

Madox58
11-21-11, 06:13 PM
I'd tend to agree about the dat format.
The benifits of the Granny system were not implemented in a 'saveing Grace' way.
I'm just sitting here wondering how many of the Upper's are sweating it out wondering when people like you and I can pull thier arses out of the fire!
:haha:

Sartoris
11-21-11, 06:42 PM
Just dropping by to express my gratitude for still working on fixing the game and learning more about it. :up:

Vanilla
11-22-11, 06:45 AM
ok, after some thought on this here's what I'm going to do:

Bones reposition like they should when you change position and rotation which is good. Meshes on the other hand do not.

Even though meshes are supposedly 'bound' to a bone they are, in fact, not in SH5. Thus if we treat each mesh as a new 'bone' then it will help mitigate the pain and frustration. Since they will be classified as a bone then they will inherit position information (from the GR2Coords class). I'll initialize their position information to 0 (no rotations, no position - (0,0,0)) and set their transform to the Identity transform. This will work because they are already pre-positioned to where they need to be.

Now when the user asks to reposition the item or change it's rotation then these variables will obviously not be 0 anymore. I'll check to see if they are 0 or not and if not then I'll update the mesh's verticies to reflect the change the user wanted.

Now to take what I just described and apply it to the code :DL

The fact that this has to be done in the first place is utterly absurd. There was no reason to use the Granny system...the DAT file system would've done everything they needed.

Let me see: Firstly they acquired a license from RAD for the Granny SDK. Then the SDK wasn't used for anything sensible apart from effectively (though most probably unwittingly) blocking modding efforts. Finally the license's price was included into the game's price (we all know how it works), so not only modders do not have the ability to mod the game to the needed extent, but we even paid for not having this ability!
While this policy is understandable in the case of charging user for the copy-protection and things alike in the hope to prevent loosing $$ that should motivate further development work, in the SH5 case not only the money were unnecessarily spent but $$ loss is further aggravated by preventing modders saving the unfinished game. In my opinion this is squandering at its best!
I am sorry for the offtopic, just couldn't hold myself. :damn:

@ TDW,
This is amazing progress with bones, wtg! I actually wanted to ask whether I understand correctly that this non-moving meshes issue doesn't affect animation editing in the sense that when we will be editing animations we won't need to move the meshes? To give an example - if we think of the infamous 'ladder-climbing-lamp-changing' animation, I guess it is much easier to cut it directly in the file to leave only climbing part of it and we will not need 3d editor in this case. Sorry if it is a stupid question.

Madox58
11-22-11, 04:05 PM
Let me see: Firstly they acquired a license from RAD for the Granny SDK. Then the SDK wasn't used for anything sensible apart from effectively (though most probably unwittingly) blocking modding efforts. Finally the license's price was included into the game's price (we all know how it works), so not only modders do not have the ability to mod the game to the needed extent, but we even paid for not having this ability!
While this policy is understandable in the case of charging user for the copy-protection and things alike in the hope to prevent loosing $$ that should motivate further development work, in the SH5 case not only the money were unnecessarily spent but $$ loss is further aggravated by preventing modders saving the unfinished game. In my opinion this is squandering at its best!

Never give a loaded Weapon to someone not fully trained to use it properly.
Someone will get hurt.
:haha:

@ TDW,
This is amazing progress with bones, wtg! I actually wanted to ask whether I understand correctly that this non-moving meshes issue doesn't affect animation editing in the sense that when we will be editing animations we won't need to move the meshes? To give an example - if we think of the infamous 'ladder-climbing-lamp-changing' animation, I guess it is much easier to cut it directly in the file to leave only climbing part of it and we will not need 3d editor in this case. Sorry if it is a stupid question.

Editing animations will not involve the actual Models or the meshes they are made up from as was done in SH3.
One can edit the animations GR2 files to 'zero out' things in a way.
Say to remove the 'screw in the light bulb' part?
Just loop the information just before that part so the animation appears to pause for the set duration or change the timing so it passes quicker.

TheDarkWraith
11-22-11, 04:40 PM
v1.0.394.0 released. See post #1

Now you can edit everything related to bones (except the name) including extended data. In the Bones tab double click a bone or skeleton to have a window appear that will list all the properties associated with the bone/skeleton. Double click a property to change it's values. Values are immediately written to file when ok is clicked. As the changes are immediate you'll be able to see your changes on the screen also (after ok pressed).

Working on the meshes now (being able to scale, rotate, and reposition them)

Just some FYI: the inverseworldtransform I do not use in the app (rendering wise). I haven't been able to see it used in the game either so I haven't utilized it. If you do find that it actually does something in game let me know so I can see what it does.

You still can't change the model's position, rotations, or scaling yet. I'll probably have that in next version.

The transform that is used for rendering is bone transform * model transform

TheBeast
11-22-11, 04:49 PM
Hope you include a Undo button option.

TheDarkWraith
11-22-11, 05:06 PM
Hope you include a Undo button option.

No I didn't :-?

Make a backup of the file before 'editing' it.

I'll include a way to revert back to as-loaded values in next version :up:

TheDarkWraith
11-22-11, 09:48 PM
now since we can edit a bone's position, orientation, scale, etc. I should tell you all about the flags property of the bone. The flags property is a bitarray and has (that I know of) 3 bits:

bit 0: defines whether the bone has position data or not
bit 1: defines whether the bone has rotation data or not
bit 2: defines whether the bone has scale/shear data or not

if bit 0 is high (value of 0x1) then the bone will use the position data it has. If it is low then it defaults to 0,0,0 for position. Even if the bone has position data if this bit is low then it will ignore it.

if bit 1 is high (value of 0x2) then the bone will use the rotation data it has. If it is low then it defaults to Quaternion.Identity. Even if the bone has rotation data if this bit is low it will ignore it.

if bit 2 is high (value of 0x4) then the bone will use the scale/shear data is has. If it is low then it defaults to Matrix.Identity. Even if the bone has scale/shear data if this bit is low it will ignore it.

You can 'combine' bits to use more data. i.e: bits 0 and 1 enabled (value of 0x3) will cause the bone to use it's position data and rotation data but ignore it's scale/shear data (scale/shear will be set to Matrix.Identity).

Took me some time to figure this out about the Granny bones.

TheDarkWraith
11-23-11, 01:44 AM
wrote the mesh 'deformer' code. Now just have to make a UI for it like the bone's have. Also have to make a UI for the model(s) so that they can be edited (position, rotation, and scale/shear data)
Changed the way the mesh's vertex format is defined. I had it locked (hard-coded) at position | normal | texture1 but now it's dynamic (had to do some reading to figure out how I could make it dynamic). A fvf is defined based on the vertex names read in and the mesh is created with that fvf as the vertex type. After the mesh is created I just lock the vertex buffer and fill in the 'missing' data based on the mesh's vertex format which is fvf (GraphicStream objects rock :rock: - first time to use that. Because of it I didn't have to define any structures for the fvf :D). I've been wanting to make the mesh's vertex format dynamic for a long time but just didn't have the knowledge of how to do it until now.

Now that the mesh's vertex format is defined dynamically I can start coding in shaders.

Vanilla
11-23-11, 06:00 AM
It's not yet possible to add bones, is it ?

TheDarkWraith
11-23-11, 08:11 AM
It's not yet possible to add bones, is it ?

Not yet. Still working on it.
The problem is the adjusting of all the pointers. I haven't found an algorithm that works 100% of the time on every file. I'll eventually figure out the correct one :yep:

tonschk
11-23-11, 08:19 AM
I think this is one of the most important thread for Silent Hunter 5 ,:DL Well done TheDarkWraith :salute:

Trevally.
11-23-11, 08:43 AM
I think this is one of the most important thread for Silent Hunter 5 ,:DL Well done TheDarkWraith :salute:

I agree - but it is also the one where I don't understand much of what is being said. I have tried Google translate and wiki. Still can't follow it

I just look for these - :rock: :up: :yeah: :|\\ :know:

and hope not to see many of these :stare: :x :damn: :nope:

:D

TheDarkWraith
11-23-11, 01:28 PM
v1.0.402.0 released. See post #1

You can now double click a mesh in the Mesh tab to edit it. When you do it will bring up a new window that will let you specify position, rotation, and scale/shear. You can also edit it's extended data. Realize that meshes don't have this position, rotation, and scale/shear data in GR2 files. I 'gave' them this so that we can reposition, scale, and rotate them. This would be why when you first go to edit a mesh you'll see values that don't appear correct.

When you change the mesh's position, rotation, or scale/shear the mesh will be 'deformed' by my deformer code and you'll be able to instantly see the change on screen. As the meshes in SH5 are pre-positioned this is the only way we can 'move' meshes around in the SH5 GR2 files. The value last input by user will be shown when you go to edit it again (so you can use the inverse of the value to move it back to it's original position). The mesh changes are currently not written to the file, the extended data for it is though. Reason for this is I want people to test it to ensure it's working correctly before committing the mesh changes to the file.

For a little fun open up the King George V GR2 file. Go to the Mesh tab and double click King George V hull. Double click the scale property. For M11 change the value to 2.0. Now that's how the King George V hull should look like (a REAL battleship!)

I'm going to add something to the effect of a global change to allow you to 'edit' all meshes at once (say you want to move/reposition/scale the entire model at once)

tonschk
11-23-11, 02:03 PM
Hello, can you tell me please where to click to see the King George V ?, I click on the mesh tab but nothing is there , thank you

http://i194.photobucket.com/albums/z58/tonschk/GR2-1.png