https://bugs.winehq.org/show_bug.cgi?id=33904
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW URL|http://spiele.download.t-on |http://www.gamershell.com/d |line.de/dladvert/115472 |ownload_101805.shtml CC| |focht@gmx.net Summary|Face Noir demo crashes on |Face Noir demo crashes on |start without native |start without native |d3dx9_36 |d3dx9_36 | |('D3DXLoadSkinMeshFromXof' | |must return 'ID3DXSkinInfo' | |interface even with no | |skinning info present) Ever confirmed|0 |1
--- Comment #7 from Anastasius Focht focht@gmx.net --- Hello folks,
confirming.
--- snip --- $ pwd /home/focht/.wine/drive_c/Program Files/Face Noir Demo
$ WINEDEBUG=+tid,+seh,+relay,+d3d,+d3dx,+d3dxof wine ./Face\ Noir.exe >>log.txt 2>&1 ... 002e:Call KERNEL32.CreateFileA(0032f680 ".\data.dcp",80000000,00000003,0032f520,00000003,00000080,00000000) ret=004d6ce8 002e:Ret KERNEL32.CreateFileA() retval=0000007c ret=004d6ce8 ... 002e:Call KERNEL32.CreateFileA(16067710 "actors\logos\logos.act3d",80000000,00000003,0032d908,00000003,00000080,00000000) ret=004d6ce8 002e:Ret KERNEL32.CreateFileA() retval=ffffffff ret=004d6ce8 ... 002e:Call KERNEL32.CreateFileA(00af6fc3 "actors\logos\logos.script",80000000,00000003,0032d674,00000003,00000080,00000000) ret=004d6ce8 002e:Ret KERNEL32.CreateFileA() retval=ffffffff ret=004d6ce8 ... 002e:Call KERNEL32.CreateFileA(00af7126 "actors\logos\logos.x",80000000,00000003,0032d734,00000003,00000080,00000000) ret=004d6ce8 002e:Ret KERNEL32.CreateFileA() retval=ffffffff ret=004d6ce8 ... 002e:Call d3dx9_36.D3DXFileCreate(00b35750) ret=0049ecff 002e:trace:d3dx:D3DXFileCreate d3dxfile 0xb35750. ... 002e:Call d3dxof.DirectXFileCreate(01a27ca8) ret=7ed58284 002e:trace:d3dxof:DirectXFileCreate (0x1a27ca8) 002e:trace:d3dxof:IDirectXFileImpl_Create ((nil),0x1a27ca8) ... 002e:Ret d3dx9_36.D3DXFileCreate() retval=00000000 ret=0049ecff 002e:trace:d3dx:d3dx9_file_RegisterTemplates iface 0x1a27ca0, data 0x575c20, size 3278. 002e:trace:d3dxof:IDirectXFileImpl_RegisterTemplates (0x27b3020/0x27b3020)->(0x575c20,3278) 002e:trace:d3dxof:IDirectXFileImpl_RegisterTemplates Registered templates (36): Header - {3d82ab43-62da-11cf-ab39-0020af71e433} Vector - {3d82ab5e-62da-11cf-ab39-0020af71e433} Coords2d - {f6f23f44-7686-11cf-8f52-0040333594a3} ... StringProperty - {7f0f21e0-bfe1-11d1-82c0-00a0c9697271} PropertyBag - {7f0f21e1-bfe1-11d1-82c0-00a0c9697271} ExternalVisual - {98116aa0-bdba-11d1-82c0-00a0c9697271} RightHanded - {7f5d5ea0-d53a-11d1-82c0-00a0c9697271} ... 002e:trace:d3dx:d3dx9_file_CreateEnumObject iface 0x1a27ca0, source 0x32fa34, options 0x3, enum_object 0xb35754. ... 002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject (0x27b3020/0x27b3020)->(0x32f98c,2,0x32f9a0) 002e:trace:d3dxof:IDirectXFileEnumObjectImpl_Create (0x32f8bc) ... 002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject Source in memory at 0xb2fe60 with size 3913 002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject File size is 3913 bytes 002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject Registered templates (55): Header - {3d82ab43-62da-11cf-ab39-0020af71e433} Vector - {3d82ab5e-62da-11cf-ab39-0020af71e433} Coords2d - {f6f23f44-7686-11cf-8f52-0040333594a3} ... FloatKeys - {10dd46a9-775b-11cf-8f52-0040333594a3} TimedFloatKeys - {f406b180-7b3b-11cf-8f52-0040333594a3} AnimationKey - {10dd46a8-775b-11cf-8f52-0040333594a3} 002e:trace:d3dxof:IDirectXFileEnumObjectImpl_GetNextDataObject (0x1a27cd0/0x1a27cd0)->(0x32f988) 002e:trace:d3dxof:IDirectXFileDataImpl_Create (0x32f904) ... 002e:Call d3dx9_36.D3DXLoadSkinMeshFromXof(01a60990,00000220,00156a68,0032f838,0032f834,00000000,0032f82c,0032f83c,0032f844) ret=004a7047 002e:trace:d3dx:D3DXLoadSkinMeshFromXof (0x1a60990, 220, 0x156a68, 0x32f838, 0x32f834, (nil), 0x32f82c, 0x32f83c, 0x32f844) 002e:trace:d3dx:d3dx9_file_data_Lock iface 0x1a60990, size 0x32f5a8, data 0x32f5a4. 002e:trace:d3dxof:IDirectXFileDataImpl_GetData (0x1a60968/0x1a60968)->((null),0x32f52c,0x32f5a4) ... 002e:trace:d3dx:d3dx9_mesh_OptimizeInplace iface 0x1a28308, flags 0x32000000, adjacency_in (nil), adjacency_out (nil), face_remap_out (nil), vertex_remap_out (nil). ... 002e:trace:d3dx:d3dx9_mesh_GenerateAdjacency iface 0x1a28308, epsilon 0.00000000e+00, adjacency 0x1a28588. ... 002e:Ret d3dx9_36.D3DXLoadSkinMeshFromXof() retval=00000000 ret=004a7047 ... 002e:trace:d3dx:d3dx9_mesh_GetNumFaces iface 0x1a28308. 002e:trace:seh:raise_exception code=c0000005 flags=0 addr=0x4a9013 ip=004a9013 tid=002e 002e:trace:seh:raise_exception info[0]=00000000 002e:trace:seh:raise_exception info[1]=00000000 002e:trace:seh:raise_exception eax=00000000 ebx=00b1bbd8 ecx=00b30e08 edx=7bcfcb48 esi=00000002 edi=00000000 002e:trace:seh:raise_exception ebp=009d4c88 esp=0032f80c cs=0023 ds=002b es=002b fs=0063 gs=006b flags=00010206 002e:trace:seh:call_stack_handlers calling handler at 0x52002a code=c0000005 flags=0 --- snip ---
I suspect the missing skinning information being the problem here.
Debugging the call yields:
--- snip --- Wine-dbg>n 3664 if (skin_info_out) *skin_info_out = mesh_data.skin_info;
Wine-dbg>p mesh_data
{num_vertices=0x6, num_poly_faces=0x2, num_tri_faces=0x2, vertices=0x19fa7d0, num_tri_per_face=0x1a4e4c8, indices=0x19fa820, fvf=0x112, num_normals=0x6, normals=0x19fa840, normal_indices=0x19fa890, tex_coords=0x19fa930, vertex_colors=0x0(nil), num_materials=0x1, materials=0x19fa8b0, material_indices=0x19fa900, skin_info=(nil), nb_bones=0} --- snip ---
The skinning info is not present hence a NULL ID3DXSkinInfo out pointer is set. I found no 'parse_mesh' trace (warn) messages.
There is one succeeding 'd3dx9_36.D3DXLoadSkinMeshFromXof' call before:
--- snip --- ... 002e:Call KERNEL32.CreateFileA(00b7dfdb "actors\jack\jack.x",80000000,00000003,0032d738,00000003,00000080,00000000) ret=004d6ce8 002e:Ret KERNEL32.CreateFileA() retval=ffffffff ret=004d6ce8 ... 002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject Source in memory at 0xb8ab48 with size 429181 002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject File size is 429181 bytes 002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject Registered templates (52): Header - {3d82ab43-62da-11cf-ab39-0020af71e433} Vector - {3d82ab5e-62da-11cf-ab39-0020af71e433} ... XSkinMeshHeader - {3cf169ce-ff7c-44ab-93c0-f78f62d172e2} SkinWeights - {6f0d123b-bad2-4167-a0d0-80224f25fabb} 002e:trace:d3dxof:IDirectXFileEnumObjectImpl_GetNextDataObject (0x1766da8/0x1766da8)->(0x32f988) 002e:trace:d3dxof:IDirectXFileDataImpl_Create (0x32f904) ... 002e:Call d3dx9_36.D3DXLoadSkinMeshFromXof(01aae758,00000220,00156a68,0032f83c,0032f838,00000000,0032f830,0032f840,0032f848) ret=004a7047 002e:trace:d3dx:D3DXLoadSkinMeshFromXof (0x1aae758, 220, 0x156a68, 0x32f83c, 0x32f838, (nil), 0x32f830, 0x32f840, 0x32f848) 002e:trace:d3dx:d3dx9_file_data_Lock iface 0x1aae758, size 0x32f5a8, data 0x32f5a4. 002e:trace:d3dxof:IDirectXFileDataImpl_GetData (0x1785ab8/0x1785ab8)->((null),0x32f52c,0x32f5a4) ... 002e:trace:d3dx:parse_skin_mesh_info (0x1785cd0, 0x32f694, 0) 002e:trace:d3dx:d3dx9_file_data_Lock iface 0x1785cd0, size 0x32f528, data 0x32f524. 002e:trace:d3dxof:IDirectXFileDataImpl_GetData (0x1aae948/0x1aae948)->((null),0x32f4cc,0x32f524) 002e:trace:d3dx:D3DXCreateSkinInfoFVF (7506, 112, 37, 0x32f6d0) 002e:trace:d3dx:D3DXDeclaratorFromFVF fvf 0x112, declaration 0x32f2cc. 002e:trace:d3dx:D3DXCreateSkinInfo num_vertices 7506, declaration 0x32f2cc, num_bones 37, skin_info 0x32f6d0. ... 002e:trace:d3dx:d3dx9_skin_info_SetDeclaration iface 0x1769628, declaration 0x32f2cc. 002e:trace:d3dx:D3DXFVFFromDeclarator (0x1769634, 0x1769630) 002e:trace:d3dx:d3dx9_file_data_Unlock iface 0x1785cd0. 002e:trace:d3dx:d3dx9_file_data_Release 0x1785cd0 decreasing refcount to 1. 002e:trace:d3dx:d3dx9_file_data_GetChild iface 0x1aae758, id 0x4, object 0x32f590. 002e:trace:d3dx:d3dx9_file_data_AddRef 0x1aae998 increasing refcount to 2. 002e:trace:d3dx:d3dx9_file_data_GetType iface 0x1aae998, guid 0x32f594. 002e:trace:d3dxof:IDirectXFileDataImpl_GetType (0x1aae970/0x1aae970)->(0x32f52c) 002e:trace:d3dx:parse_skin_mesh_info (0x1aae998, 0x32f694, 0) 002e:trace:d3dx:d3dx9_file_data_Lock iface 0x1aae998, size 0x32f528, data 0x32f524. 002e:trace:d3dxof:IDirectXFileDataImpl_GetData (0x1aae970/0x1aae970)->((null),0x32f4cc,0x32f524) 002e:trace:d3dx:d3dx9_skin_info_SetBoneName iface 0x1769628, bone_idx 0, name "Spine_5". ... --- snip ---
The file 'data.dcp' is actually a Wintermute Engine data file, one can see the signature at the beginning. Wikipedia also lists the game using the engine:
https://en.wikipedia.org/wiki/Wintermute_Engine#Games_developed_with_Winterm...
I found a tool which allows to unpack the data file:
http://forum.xentax.com/viewtopic.php?f=32&t=9625
http://www.mediafire.com/download/rard7tih3dwmqjf/DCP_Unpacker.exe
--- snip --- $ wine ./DCP_Unpacker.exe data.dcp ... WinterMute Engine Unpacker by Vash v1.0.1 -vash.romhacking.it-
Extracting 2106 files 11455A4BExtracing actors\Animation\Base.X [1 on 2106] Extracing actors\Animation\Dord.png [2 on 2106] Extracing actors\Animation\Dord.X [3 on 2106] Extracing actors\Animation\Gun.X [4 on 2106] Extracing actors\Animation\Gun_Jack.png [5 on 2106] ... Extracing actors\logos\logos.act3d [580 on 2106] Extracing actors\logos\logos.script [581 on 2106] Extracing actors\logos\logos.X [582 on 2106] Extracing actors\logos\Logo_1.png [583 on 2106] Extracing actors\logos\Logo_2.png [584 on 2106] Extracing actors\logos\Logo_Publisher.png [585 on 2106] Extracing actors\logos\PROVV.png [586 on 2106] ... Extracing ui_elements\win.bmp [2101 on 2106] Extracing ui_elements\win.image [2102 on 2106] Extracing ui_elements\win_inactive.bmp [2103 on 2106] Extracing ui_elements\win_inactive.image [2104 on 2106] Extracing ui_elements\win_mod.image [2105 on 2106] Extracing ui_elements\win_mod.png [2106 on 2106] --- snip ---
Inspecting 'actors\logos\logos.X' reveals there is no skinning info.
--- snip --- $ grep -HR Skin | uniq
Binary file actors/greta/greta.X matches Binary file actors/Harlem/Heaven/Heaven.X matches actors/inventario/inventario.x:template XSkinMeshHeader { actors/inventario/inventario.x: WORD nMaxSkinWeightsPerVertex; actors/inventario/inventario.x: WORD nMaxSkinWeightsPerFace; actors/inventario/inventario.x:template SkinWeights { actors/inventario/inventario.x: XSkinMeshHeader { actors/inventario/inventario.x: SkinWeights { Binary file actors/jack/jack.X matches actors/Loc_GlenCove/Door/Door.X:template XSkinMeshHeader { actors/Loc_GlenCove/Door/Door.X: WORD nMaxSkinWeightsPerVertex; actors/Loc_GlenCove/Door/Door.X: WORD nMaxSkinWeightsPerFace; actors/Loc_GlenCove/Door/Door.X:template SkinWeights { actors/Loc_GlenCove/Door/Door.X: XSkinMeshHeader { actors/Loc_GlenCove/Door/Door.X: SkinWeights { actors/Loc_Melville/herman/herman.X:template XSkinMeshHeader { actors/Loc_Melville/herman/herman.X: WORD nMaxSkinWeightsPerVertex; actors/Loc_Melville/herman/herman.X: WORD nMaxSkinWeightsPerFace; actors/Loc_Melville/herman/herman.X:template SkinWeights { actors/Loc_Melville/herman/herman.X: XSkinMeshHeader { actors/Loc_Melville/herman/herman.X: SkinWeights { actors/Loc_Melville/policeman/policeman.X:template XSkinMeshHeader { actors/Loc_Melville/policeman/policeman.X: WORD nMaxSkinWeightsPerVertex; actors/Loc_Melville/policeman/policeman.X: WORD nMaxSkinWeightsPerFace; actors/Loc_Melville/policeman/policeman.X:template SkinWeights { actors/Loc_Melville/policeman/policeman.X: XSkinMeshHeader { actors/Loc_Melville/policeman/policeman.X: SkinWeights { Binary file actors/Loc_Melville/policeman_stealth_01/policeman_stealth_01.X matches Binary file actors/Loc_Melville/policeman_stealth_02/policeman_stealth_02.X matches Binary file actors/Loc_Melville/policeman_stealth_03/policeman_stealth_03.X matches Binary file actors/marsetti/marsetti.X matches --- snip ---
MSDN doesn't specifically talk about this case, only mentioning what happens when effect instance information is missing:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb172899%28v=vs.85%...
Even with no actual skinning info present, the game engine still tries to call methods on ID3DXSkinInfo (-> ID3DXSkinInfo::GetNumBones() -> 0), hence at least an interface must be returned.
--- snip --- ... 004A9010 8B41 08 MOV EAX,DWORD PTR DS:[ECX+8] 004A9013 8B08 MOV ECX,DWORD PTR DS:[EAX] ; ID3DXSkinInfo == NULL *boom* 004A9015 8B51 24 MOV EDX,DWORD PTR DS:[ECX+24] ; &ID3DXSkinInfo::GetNumBones 004A9018 50 PUSH EAX 004A9019 FFD2 CALL EDX 004A901B C3 RETN ... --- snip ---
$ sha1sum FaceNoir_Demo_Eng.zip 32dce4d1eb732b12afe69b8af50023cbde1b3e19 FaceNoir_Demo_Eng.zip
$ du -sh FaceNoir_Demo_Eng.zip 563M FaceNoir_Demo_Eng.zip
$ wine --version wine-1.7.46-118-g7a3c988
Regards