Warhammer Dark Omen Forum

Modifications => 3D Scenery Models => Topic started by: mattressses on April 01, 2014, 03:02:31 PM



Title: Portrait meshes
Post by: mattressses on April 01, 2014, 03:02:31 PM
Before I rifle through the game files in vain, I thought I had better check: Has anyone compiled a list of which PORTRAIT\*.M3D files are used for each unit? I couldn't see anything on the wiki.


Title: Re: Portrait meshes
Post by: olly on April 01, 2014, 10:25:12 PM
Not 100% sure but will investigate further. What I've recently been discussing with fellow modders, is to hopefully amend our Dark Omen to Blender Import/Export tool that successfully loads terrain maps (.m3d) but sadly can't load Dark Omen Portrait Heads (also .m3d), as I'm guessing it just expects a map information etc.. However, Crash's latest tools, can load .m3d heads and maps into his own 3d engine, so shouldn't be too difficult to fix. The original Dark Omen map viewer tool - New Boids also can display heads and maps.

Once we can add heads then I can use the excellent Call of Warhammer Total War 3d models, for their heads and face textures, to match up with the sprites generated from their 3d models. I hit this problem whilst making my Giant sprite, as no other head would do. Ogre was closest I think but jaw bone wasn't big enough!

:)


Title: Re: Portrait meshes
Post by: mattressses on April 02, 2014, 07:29:47 AM
What I've recently been discussing with fellow modders, is to hopefully amend our Dark Omen to Blender Import/Export tool that successfully loads terrain maps (.m3d) but sadly can't load Dark Omen Portrait Heads (also .m3d), as I'm guessing it just expects a map information etc..


Well, don't go to too much effort just yet! Rob's .m3d import tool seems to load them just fine, so long as the TEXTURE folder is a subdirectory of the MESHES folder (as it is in the 1pbat/B*_0* folders). Some of the texture names are incorrect/using the wrong format (e.g, 25.m3d expects VC_HEAD.tga as a texture, which doesn't exist, but saving VA_HEAD.bmp as a tga and changing the name gets it loading. You can check which texture is required in the header for the respective .m3d), but most of them seem to import/export without any issue as long as you move the TEXTURE folder. Gunther loads the correct texture without issue:

 (http://i.imgur.com/att2aZN.png)

I've been messing around with the orc head mesh, and it seems to load back into DO without issue. Hoping to get a skaven head/texture thrown together, but for now here's a horrible distended Boar Boy!

(http://i.imgur.com/Q9tT59j.png)


Title: Re: Portrait meshes
Post by: olly on April 02, 2014, 09:41:15 PM
Excellent!

:)


Title: Re: Portrait meshes
Post by: olly on January 13, 2015, 11:32:14 PM
Thanks to recent mods we can now have additional sprites, banners and shields but could really do with adding custom heads, since we have all the 3D Call of Warhammer models. I have added a new head to the Wh32Edit .xml database and assigned it to an extra slot new sprite and copied the Elf Head.m3d (DarkElfHead.m3d) and assigned it new DarkElfHead.bmp face textures, within Blender and exported back. However, the source code engine needs to be told about the new head, so it can appear in game, as currently no new 3d portrait is displayed. Is it possible to locate the Heads Table and .dll redirect it to a new custom lookup table perhaps?


Heads .m3d 1-20
[attachment=1]

21-40
[attachment=2]

41-67
[attachment=3]


1.m3d elf body Bernhardt mb_body.bmp  
2.m3d body MB_BODY.bmp
3.m3d orc body BB_BODY.tga (copy BB_BODY.bmp and save as .tga)
4.m3d Scorpion group fo_body.bmp (copy SN_BODY.bmp and rename)
5.m3d SkeletonBody group SK_BODY.tga (copy SK_BODY.bmp and save as .tga)
6.m3d SpiderMovingBits group SP_HEAD.tga SP_BODY.tga (copy .bmp and save as .tga)
7.m3d Group01 tr_body.tga (copy TR_BODY.bmp and save as .tga)
8.m3d body FO_BODY.bmp (maybe shoudln't be Scorpion body as human body)
9.m3d treeman body group fo_body.bmp (copy KN_BODY.bmp and rename)
10.m3d Group01 fo_body.bmp (copy DK_BODY.bmp and rename)
11.m3d Group01 VS_HEAD.tga (copy VS_HEAD.bmp and save as .tga)
12.m3d HumanChubbyHead group bb_head.bmp (copy MY_HEAD.BMP and rename) by Michael A. Carr
13.m3d Group01 mb_head.bmp
14.m3d Group01 gs_head.bmp
15.m3d HumanLargeHelm kf_head.bmp
16.m3d FullHelm 1 group TT_HEAD.tga
17.m3d DwarfHead group AB_HEAD3.tga (copy AB_HEAD.bmp and rename/save as .tga)
18.m3d HumanHat group Il_Death.bmp
19.m3d Group01 wh_head.bmp
20.m3d NightGoblinHead NG_HEAD.tga (copy NG_HEAD.bmp and rename)
21.m3d Ogre Head group ur_head.bmp
22.m3d OrcHead group bb_head.bmp
23.m3d ScorpionTail group mb_head.bmp (copy SN_HEAD.bmp and rename)
24.m3d SkeletonHead group SK_head.tga
25.m3d SpiderBody group mb_head.bmp (copy SP_HEAD.bmp and rename)
26.m3d treeman face01 KN_HEAD3.tga (copy KN_HEAD.bmp and rename)
27.m3d TrollHead group TR_HEAD.tga (copy TR_HEAD.bmp and rename)
28.m3d Vampiress head VC_HEAD.tga (copy VA_HEAD.bmp and rename)
29.m3d Woman head MB_HEAD.bmp (copy CE_HEAD.bmp)
30.m3d head bb_head.bmp (copy DK_HEAD.BMP or NA_HEAD.bmp and rename perhaps)
31.m3d head group mb_head.bmp (copy SS_HEAD.bmp)
32.m3d ElfHead group EL_HEAD.tga (copy EL_HEAD.bmp and rename)
33.m3d neck TT_HEAD.tga (Grail Knights)
34.m3d neck SK_HEAD.tga (copy SK_HEAD.bmp and rename)
35.m3d neck VC_HEAD2.tga (copy VA_HEAD.bmp and rename)
36.m3d neck EL_HEAD.tga (copy EL_HEAD.bmp and rename)
37.m3d neck MB_HEAD.tga (copy MB_HEAD.bmp and rename)
38.m3d Collar Wilf_head.bmp (copy LF_Head.bmp and rename)
39.m3d crossbow SF_HEAD.tga (copy WF_HEAD.bmp and rename)
40.m3d Longbow group GA_HEAD.tga ZO_head.tga (copy GA_HEAD.bmp and ZO_HEAD.bmp and rename)
41.m3d Mace group MU_face.tga (copy MU_HEAD.bmp and rename)
42.m3d Pistol SW_HEAD.tga (copy SW_HEAD.bmp and rename)
43.m3d quiver group SF_HEAD.tga (copy WF_HEAD.bmp and rename)
44.m3d shield MB_HEAD.tga (copy MB_HEAD.bmp and rename)
45.m3d Tower Shield bb_head.bmp
46.m3d scimitar NG_HEAD.tga
47.m3d Scythe group WR_HEAD.tga H_head.tga (copy WR_HEAD.bmp IH_HEAD.bmp and rename)
48.m3d Staff SF_HEAD.tga IH_head.tga (copy WF_HEAD.bmp IH_head.bmp and rename)
49.m3d ShamanStaff group OS_HEAD2.tga IH_head.tga (copy OS_HEAD.bmp IH_head.bmp and rename)
50.m3d SkeletonArms group sk_head.bmp
51.m3d sword group MB_HEAD.tga (copy MB_HEAD.bmp and rename)  
52.m3d Group01 TR_HEAD.tga (copy TR_HEAD.bmp and rename)
53.m3d Axe group er_head.tga (copy ER_HEAD.bmp and rename)  
54.m3d Scorpion group mb_head.bmp (copy SN_HEAD.bmp and rename)
55.m3d spike BB_HEAD.tga (copy BB_HEAD.bmp and rename)
56.m3d sword group my_head.bmp
57.m3d club ZO_head.tga (copy ZO_HEAD.bmp and rename)
58.m3d ShamanHeadDress group OS_HEAD2.tga (copy OS_HEAD.bmp and rename)
59.m3d spike BB_HEAD.tga (copy BB_HEAD.bmp and rename)
60.m3d TreeTrunkHorns group OR_HEAD.tga (copy OR_HEAD.bmp and rename)    
61.m3d Karl Franz's helmet wings group kf_head.tga (copy KF_HEAD.bmp and rename)
62.m3d emperor wreath kf_head.tga (copy KF_HEAD.bmp and rename)
63.m3d Horns group wer_head.tga (copy SK_HEAD.bmp and rename)  
PORTBACK.m3d Box01 _1WEPON.bmp (copy IL_HEAD.bmp and rename)
PORTBACK2.m3d Box01 _1WEPON.bmp (copy IL_HEAD.bmp and rename)
EDITOR BODY.m3d body MB_BODY.tga (copy MB_BODY.bmp and rename)
EDITOR HEAD.m3d Group01 MB_HEAD.tga (copy MB_HEAD.bmp and rename)

Download
http://www.mediafire.com/download/1nbr5r77gxb7wu8/Portrait.zip (http://www.mediafire.com/download/1nbr5r77gxb7wu8/Portrait.zip)

:)  


Title: Re: Portrait meshes
Post by: aqrit on January 15, 2015, 12:19:35 AM
can you explain it like I'm five?

How would one overwrite Bernhardt's head with a custom one?


Title: Re: Portrait meshes
Post by: olly on January 15, 2015, 02:15:35 AM
Morgan Bernhardt (MB) would probably use the following 3d models and textures ->

2.m3d body MB_BODY.bmp
13.m3d Group01 mb_head.bmp

Using the Call of Warhammer 3D models of say the Giant, I would export the Giant's Head in Blender as 2.m3d and the top half of his body as 13.m3d with its own unique textures saved as MB_BODY.bmp and mb_head.bmp .

Then when Dark Omen calls those models for Morgan it should show a Giant. However, I imagine the hard part will be to find where and how the engine knows to call those models for Morgan Bernhardt. If we can locate that list or table of heads and bodies, then we could possible add to the list rather than overwrite. I am currently learning & searching for "Portraits" functions with IDA.


Title: Re: Portrait meshes
Post by: aqrit on January 15, 2015, 03:12:25 AM
we can step right to sub_4018A0 by following the cross-ref of the first portrait in the sprite table
Code:
.text:004018A0 Portraits_something proc near           ; CODE XREF: sub_401950+33Ap
.text:004018A0                                         ; sub_401950+4D1p
.text:004018A0
.text:004018A0 arg_0           = dword ptr  8
.text:004018A0
.text:004018A0                 push    esi
.text:004018A1                 mov     esi, [esp+arg_0]
.text:004018A5                 cmp     dword ptr [esi], 0
.text:004018A8                 jnz     short loc_40191C
.text:004018AA                 mov     dword_5014D8, 1
.text:004018B4                 mov     dword_5014DC, 25h
.text:004018BE                 mov     dword_5014E0, 135h
.text:004018C8                 mov     eax, bkgnd_id
.text:004018CD                 mov     dword_5014FC, 0 ; counter
.text:004018D7                 lea     ecx, bkgnd_table[eax*8] ; MB_xx // background table
.text:004018DE                 mov     eax, offset unk_4CFBD0 ; first portrait
.text:004018E3                 mov     bkgnd_entry, ecx
.text:004018E9
.text:004018E9 loop:                                   ; CODE XREF: Portraits_something+74j
.text:004018E9                 mov     ecx, [eax]      ; sprite_slot.ref_count
.text:004018EB                 test    ecx, ecx
.text:004018ED                 jz      short loc_40190C
.text:004018EF                 mov     ecx, [eax+28h]  ; sprite_slot.loaded_index
.text:004018F2                 mov     edx, dword_5014FC
.text:004018F8                 mov     dword_501500[edx*8], ecx ; Loaded_Portrait_Array?
.text:004018FF                 mov     edx, dword_5014FC
.text:00401905                 inc     edx
.text:00401906                 mov     dword_5014FC, edx
.text:0040190C
.text:0040190C loc_40190C:                             ; CODE XREF: Portraits_something+4Dj
.text:0040190C                 add     eax, 2Ch
.text:0040190F                 cmp     eax, offset unk_4D09E8 ; last portrait
.text:00401914                 jb      short loop
.text:00401916                 mov     dword ptr [esi], offset dword_5014D8
.text:0040191C
.text:0040191C loc_40191C:                             ; CODE XREF: Portraits_something+8j
.text:0040191C                 pop     esi
.text:0040191D                 retn
.text:0040191D Portraits_something endp

which probably means the next function that is called ( sub_401E36 ) loads the portraits?

right now, I'm wondering how the hard-coded SpriteTable[slot].loaded_index plays into it.
If I change PT_Bernhardt loaded_index from 0 to 5 ... I get the ogre head (as expected?)


edit: or maybe it would be better to start by placing a hardware breakpoint on PT_Bernhardt -> ref_count and looking around there


Title: Re: Portrait meshes
Post by: olly on January 15, 2015, 11:35:54 PM
Nice!

:)


Title: Re: Portrait meshes
Post by: aqrit on January 18, 2015, 11:09:23 PM
the hard-coded sprite_slot.loaded_index appears to be an index into heads.db
offset 0x12 of the HEAD structure in heads.db is (?) the index of the (head?) meshes/%d.m3d file

 
 

 


Title: Re: Portrait meshes
Post by: olly on January 18, 2015, 11:16:05 PM
I see, good progress.

Thanks

:)


Title: Re: Portrait meshes
Post by: aqrit on February 03, 2015, 06:49:33 PM
added 64 new portrait slots
http://bitpatch.com/downloads/do_mod_helper_wip.zip (http://bitpatch.com/downloads/do_mod_helper_wip.zip)

add new entries to the end of heads.db with a hex-editor
the first new entry (0x3F) == XSLOT 00, etc.

the other offset for the HEAD struct is 0x0D, IIRC

also new:
enabled the "3DDebug" registry options
so Fullscreen, etc can be toggled from the registry

( this update was more or less a code dump )


Title: Re: Portrait meshes
Post by: olly on February 03, 2015, 09:21:50 PM
Many thanks Aqrit, this will be fantastic to finally have new 3D heads and great idea to add the FullScreen Reg Option.

[attachment=1]



Title: Re: Portrait meshes
Post by: olly on February 03, 2015, 10:16:03 PM
Made progress swapping Morgan's Head and Textures (13.m3d & MB_Head.bmp) to new Dark Elf Head (64.m3d & DE_Head.bmp)

[attachment=1]

[attachment=2]


So will continue trying to add new Head block of data at end of Heads.DB for the new xslot Giant portrait to use.


Title: Re: Portrait meshes
Post by: olly on February 06, 2015, 12:04:45 AM
Eternal thanks again Aqrit, having new 3d heads is going to be amazing. We can now use all the Call of Warhammer (&possibly the Sundering mod) 3d models for new sprites and 3d heads for the meeting/talking cut scenes and in game Portraits.

A real shared dream come true - totally new Warhammer armies on new maps with new campaigns. It's finally here! Massive thanks to you all!

Early test - Giant 3d head converted into Dark Omen - will improve graphics and test new bodies and necks, then post guide
[attachment=1]

:)



Title: Re: Portrait meshes
Post by: olly on February 22, 2015, 11:58:38 PM
Just testing some Dark Elf helmets with a DOE Head ->

[attachment=1]


:)  


Title: Re: Portrait meshes
Post by: thelastarmada on February 23, 2015, 11:18:34 AM
That makes me moist.


Title: Re: Portrait meshes
Post by: olly on March 01, 2015, 12:21:53 PM
[attachment=1]

:)


Title: Re: Portrait meshes
Post by: cuthalion on April 27, 2015, 04:20:03 PM
This is incredible! :)

I mean, I may never find time to learn all the stuff about graphical modding, but if you explain to me how I use _all_ DO heads I will be very greatful. I have plans for a wood elf campaign and would gladly use elf king, countess, Altdorf's green mage (what was his name?) and other heads in battles and also substitute Morgan's head in campaign talks.

And if Olly or someone throws me a couple of custom elvish heads made of Elrod and/or Galed, I will swoon in extasy )
pretty please with sugar on top :)


Title: Re: Portrait meshes
Post by: illidan on April 27, 2015, 05:41:31 PM
This is incredible! :)

I mean, I may never find time to learn all the stuff about graphical modding, but if you explain to me how I use _all_ DO heads I will be very greatful. I have plans for a wood elf campaign and would gladly use elf king, countess, Altdorf's green mage (what was his name?) and other heads in battles and also substitute Morgan's head in campaign talks.

And if Olly or someone throws me a couple of custom elvish heads made of Elrod and/or Galed, I will swoon in extasy )
pretty please with sugar on top :)


i dont have 3d model for wood elves head but
i have all extracted bmp from age of wonder 1 and 2


http://www.mediafire.com/download/k6znauhidz9unia/aow+wood+elves+sprite+sheet.rar (http://www.mediafire.com/download/k6znauhidz9unia/aow+wood+elves+sprite+sheet.rar)
 



Title: Re: Portrait meshes
Post by: olly on April 28, 2015, 08:27:58 PM
Nice and the 3d heads should be easy enough to do soon.

:)


Title: Re: Portrait meshes
Post by: cuthalion on April 28, 2015, 11:16:59 PM
Could you remind me how to use existing 3d heads for my units? Such heads as elf king, green wizard and others?


Title: Re: Portrait meshes
Post by: olly on June 27, 2015, 11:35:58 PM
Beta Guide -> Adding new Custom Head Orion into Wood Elves Mod as xslot Potrait 00 in its PLYR_ALL.ARM and each Mercenary Army File such as B101MRC.ARM

Copy an original Dark Omen Graphics Portraits folder into the Wood Elves mod Graphics folder and read about the Head Database structure here->

http://wiki.dark-omen.org/do/DO/Heads.db (http://wiki.dark-omen.org/do/DO/Heads.db)

1) Create a trace.txt in C:\Program Files (x86)\Dark Omen\PRG_ENG that will record all files and their path locations as the game is being played. Edit whmtg.txt to replace Morgan's Head with Orion's head (id=130) in the talking head cut scenes and play the game, to allow trace.txt to display which head and textures are used for Orion.

Orion uses head 28.m3d Vampiress head VC_HEAD.tga according to this list ->

http://forum.dark-omen.org/3d-scenery-models/portrait-meshes-t1227.0.html;msg12704#msg12704 (http://forum.dark-omen.org/3d-scenery-models/portrait-meshes-t1227.0.html;msg12704#msg12704)

So create a new Texture folder in C:\Program Files (x86)\Dark Omen\Graphics\PORTRAIT\Meshes and copy VA_HEAD.BMP and rename to VC_HEAD.tga to allow Blender to successfully import 28.m3d. With Blender's UV mapping, replace the VC_HEAD.tga texture with a renamed copy of OR_HEAD.bmp called ON_HEAD.bmp in C:\Program Files (x86)\Dark Omen\Graphics\PORTRAIT\Textures so we are using our own new custom texture. Save the Blender file as ON.blend and export as ON.m3d back into C:\Program Files (x86)\Dark Omen\Graphics\PORTRAIT\Meshes and make a copy of it named 64.m3d and paste into the Wood Elves Portrait Meshes folder.

Make more new textures called ON_HEADI, ON_DEATH, ON_BITS, ON_BITSI and ON_BODY based on original OR_ .bmp files (add blood for injured and Death textures) and paste them also into Wood Elves Portrait Textures C:\Program Files (x86)\Dark Omen\Mods\Wood Elves\Graphics\PORTRAIT\Textures

2) With the new Head and textures ready, edit Wood Elves Portrait Script HEADS.DB in a HEX Editor like HxD. Increase the 1st byte 3F by 1 in HEX so = 40 (64 in decimal as there were 63 (3F) originals).

[attachment=3]

3) Copy the block that starts with OR and ends at NG and paste it at the end of the file. Now we have copied another Orion Head into the database, change the new OR to ON and the 3rd byte to 06 for animation sequence and then copy the section of the MB block and overwrite the last section of the ON block after the mouth and eyes position blocks

Morgan
MB...$..L(..<..........%...3...,.......              02 Body        13 Head                 37 Neck        51 Sword     44 Shield
4D 42 06  01 00 24 1C 10 4C 28 06 0C 3C 02 00 00 00  0D  00 00 00 01 00 25 00 00 00  33 00 00 00  2C  00 04 00
00 00 00 00

New Orion
ON......J ..:..........%...3...,.......                                   Could use 40 instead of 1C for 64 New Head    44 Shield
4F 4E 06  01 00 18 1A 14 4A 20 08 10 3A 02 00 00 00  1C  00 00 00 01 00 25 00 00 00  33 00 00 00  2C  00 04 00
00 00 00 00        

Original Orion
OR0.....J ..:..........%...0..รพ....<...                                28 Head                                     48 Staff                                  
4F 52 30  01 00 18 1A 14 4A 20 08 10 3A 02 00 00 00  1C  00 00 00 01 00 25 00 00 00  30 00 00 FE  00  00 00 00          
60TreeHorns
3C 00 00 00

[attachment=4]


4) Amend the Wood Elves Mod PLYR_ALL.ARM and every mercenary 1pbat MRC.ARM file in WH32Edit to set Morgan to use Portrait = xslot Portrait 00 which assigns new 64.m3d head (a renamed copy of ON.m3d that knows to use the new ON_HEAD.bmp texture - open .m3d file with notepad to see that Blender set it to use that texture). The modified Database Heads.DB with its new Head ON block contains data to set the animation type and Body and position of mouth & eyes textures.

[attachment=2]

*Or replace Morgan MB block with this new ON block in Heads.DB to save editing the cut scenes and leave army files to use Morgan Portrait instead which will now be Orion.*


New Orion Head Mod
https://www.dropbox.com/s/7ic9szgmmdl6311/DO%203d%20Head%20Mod.zip?dl=0 (https://www.dropbox.com/s/7ic9szgmmdl6311/DO%203d%20Head%20Mod.zip?dl=0)


:)


[attachment=1]


Title: Re: Portrait meshes
Post by: olly on June 28, 2015, 09:06:52 PM
Now we have deciphered all Head.DB block bytes we found a fix for the Extra Heads Mod which is to give them all Animation & Seq = 06 01 the same as Morgan, to avoid the injured /death crashes. Also their textures needed tweaking for 3d using Irfan viewer (export colour palette of their original Head.bmp and import into their injured and death new .bmp files, so the black is not see through)

To test new 3d Head in Talking cutscene edit WHTMG.txt script and scroll half way down to change all the 0 for Morgan's Head to 63 for new Head ->

LABEL MP_TradingPost2
    Speak 02 0 1 0 144 78 63 1 380 160
    SetMusic "eerie9.fsm"
    StopAllSFX 3 200
    SpotAnim 0 0 318 60
    SpeakNoWait 63
    SpeakNoWait 1
    Narrate 63 29 "MB001" 0 0
    Narrate 1 18 "KZ001" 0 0
    Narrate 63 6 "MB002" 0 0
    Narrate 1 18 "KZ002" 0 0
    Narrate 63 7 "MB003" 0 0
    Narrate 1 25 "KZ003" 0 0
    Narrate 63 26 "MB004" 0 0
    END

[attachment=1]

Interestingly Morgan (with new Orion Head) fled and lost the battle so appears injured on screen, we guess the head data for battle and cutscene is shared and is not reset after battle. Ghabry further mentioned you can also force an injured face. Remember Volkmar that mage with the green coat and that scene with book, afterwards he has an injured head. So will inspect that scene in WHTMG.txt


Dark Elves v Skaven coming soon!
[attachment=2]


Title: Re: Portrait meshes
Post by: olly on November 07, 2015, 02:03:08 PM
Working on adding all Shadow of the Horned Rat Dwarfs into Dark Omen, starting with Gotrek to fight the new Skaven, Dark Elves & Giant. It was a shame that his original portrait was only side on, as I had to piece him back together to face forwards.

[attachment=1]
[attachment=2]
[attachment=3]

:)


Title: Re: Portrait meshes
Post by: cuthalion on November 07, 2015, 06:43:43 PM
Good luck :)


Title: Re: Portrait meshes
Post by: olly on November 09, 2015, 10:56:29 PM
All Shadow of the Horned Rat Dwarfs to convert to Dark Omen ->

[attachment=1]

1) Lord Ungrunn -King of
2) Grunti BigFoot - IronBreaker
3) Furgus Fragman - Hammers
4) Gotrek Gurnisson - Slayer
5) Engrol Goldtongue - Envoy
6) Kargan Ironfist - Gyrocoptor Pilot
7) Gromdal Orcbane - Crossbowmen
8 ) Dargrimm Firebeard - Warrior
9) Tron Harkon Skull Splitter - Warrior
10) Azguz Bloodfist - Warrior

[attachment=3]

Harkon and Gotrek speak with Lord Ungrunn
[attachment=2]

Dwarf army list ->
http://forum.dark-omen.org/troops/warhammer-armies-dwarfs-t1331.0.html (http://forum.dark-omen.org/troops/warhammer-armies-dwarfs-t1331.0.html)

:)





Title: Re: Portrait meshes
Post by: cuthalion on November 10, 2015, 08:14:59 AM
Tis awesome :)
When you think the heads are 100% ready - i.e. you are not able to improve them any further - share them and I will try to insert skaven and dwarven heads in my Wood Elf and Dwarf campaigns if I have not forgotten how to do it yet :)


Title: Re: Portrait meshes
Post by: illidan on November 26, 2015, 02:52:52 PM
funny pics for funny leader head

i found some funny head from age of womder 2 expecialy the dwarf one

Dwarf LOTR BFME.jpg for the dwarf crossbow

from this donwload link

http://aow2.heavengames.com/downloads/showfile.php?fileid=1115 (http://aow2.heavengames.com/downloads/showfile.php?fileid=1115)



Title: Re: Portrait meshes
Post by: olly on January 30, 2016, 11:48:16 PM
3d Head Guide - Beta ->

https://www.dropbox.com/s/vxh829ex7rl5eed/DO%203d%20Head.zip?dl=0&preview=DO+3d+Head.zip (https://www.dropbox.com/s/vxh829ex7rl5eed/DO%203d%20Head.zip?dl=0&preview=DO+3d+Head.zip)

Just testing with Illidan and any others, then can improve guide and post YouTube vids. New 3d map modding guide next!

:)


Title: Re: Portrait meshes
Post by: olly on February 07, 2016, 12:23:24 AM
Big thanks to Illidan who has been very busy helping me convert lots of Dwarf 3d models, from Call of Warhammer/Rage of Gods (kindly granted their permission)  & the Sundering mods, into Dark Omen.

[attachment=1]

:)


Title: Re: Portrait meshes
Post by: illidan on February 07, 2016, 07:00:50 PM
first head pack

Dwarven_lordhead
head hammerer
longbeards head
slayer head
tete 3d miner
tete 256 iron breaker
tete barbe noire enginer
tete de nain enginer
head sans casque

http://www.mediafire.com/download/uhc31donqyb5c18/ALL_HEAD.rar (http://www.mediafire.com/download/uhc31donqyb5c18/ALL_HEAD.rar)


Title: Re: Portrait meshes
Post by: illidan on February 07, 2016, 11:23:52 PM
a try for book picture

[attachment=1]


Title: Re: Portrait meshes
Post by: illidan on June 10, 2016, 05:12:10 PM
bouche animation

[attachment=1]

[attachment=2]

[attachment=3]


Title: Re: Portrait meshes
Post by: olly on June 10, 2016, 05:42:09 PM
Excellent! It's long over due (was hoping to announce it with DO2 release) but you are now promoted to Modder status, well deserved as you have produced so many great sprites, maps and 3d heads - Big thanks from us all.

Congratulations!

:)

I've also improved the Dwarf King for Cuthalion by sculpting a mini gold anvil on top of his modified Crown.

Download and see it in the latest mod pack ->

http://forum.dark-omen.org/help-section/ultimate-dark-omen-xpvistawin7win81win10-game-fixes-t111.0.html;msg310#msg310 (http://forum.dark-omen.org/help-section/ultimate-dark-omen-xpvistawin7win81win10-game-fixes-t111.0.html;msg310#msg310)

[attachment=1]

[attachment=2]


Title: Re: Portrait meshes
Post by: olly on June 16, 2016, 09:13:13 PM
Illidan and I have been busy adding his animated mouths to the new Dwarf 3d heads, along with the injured textures

[attachment=2]

[attachment=1]


Title: Re: Portrait meshes
Post by: olly on June 18, 2016, 05:38:12 PM
Avoid using the same background colour (usually 1st colour on palette) for the face or weapons. So set the first palette colour to magenta/pink and change any face pixels that appear in this colour. Draw a line around the edge of each texture to separate it from the background and then use the paint Fill tool to quickly recolour.  

Change 1st palette colour to magenta pink
[attachment=1]

Recolour any face or weapon pixels that appear magenta pink
[attachment=2]

Convert to RGB and export as BMP (24bit) then use Irfanview to decrease colour back to 256
[attachment=3]

Repeat for HEAD.bmp HEADI.bmp BITS.bmp BITSI.bmp DEATH.bmp textures for each character


Title: Re: Portrait meshes
Post by: illidan on June 18, 2016, 09:47:06 PM
slayer annim mouth


[attachment=1]

[attachment=2]

[attachment=3]


[attachment=4]


Title: Re: Portrait meshes
Post by: illidan on June 19, 2016, 12:08:02 PM
pipe animation

[attachment=1]

[attachment=2]

[attachment=3]

[attachment=4]



Title: Re: Portrait meshes
Post by: olly on June 19, 2016, 01:00:58 PM
Amazing!

:)


Title: Re: Portrait meshes
Post by: illidan on June 19, 2016, 02:03:18 PM
[attachment=1]

[attachment=2]

[attachment=3]

[attachment=4]


Title: Re: Portrait meshes
Post by: illidan on June 19, 2016, 07:49:52 PM
[attachment=1]

[attachment=2]

[attachment=3]



Title: Re: Portrait meshes
Post by: illidan on June 19, 2016, 09:32:50 PM
[attachment=1]


[attachment=2]

[attachment=3]

[attachment=4]


Title: Re: Portrait meshes
Post by: olly on June 19, 2016, 10:52:16 PM
Very nice, can't wait to test them out thanks

:)


Title: Re: Portrait meshes
Post by: cuthalion on June 28, 2016, 12:29:24 PM
Hey Olly could you send me files of that Dwarf King head with modified crown? I am in the country and have slow internet so I cannot download large size stuff.

Also, are there ready-to-go dwarf heads out of those amazing templates Illidan and you are working on?
Some nostalgia overcame me again and I wanna play DO a bit, and I would like to test new heads in the dwarf campaign if there are any.

Just 1 thing Olly. A year ago we discussed that it will be cool if all new heads comply with my modded campaigns and do not overwrite heads already used there. I hope you still stick to that order or I will have to check all heads in my arimes :)


Title: Re: Portrait meshes
Post by: olly on June 28, 2016, 10:58:57 PM
Yep no problem, I've been adding the new heads to your Dwarf Adventures campaign whilst testing, so should have 3 or 4 complete heads during this weekend hopefully.

:)

[attachment=1]


Title: Re: Portrait meshes
Post by: olly on July 03, 2016, 01:22:29 AM
The pipe animation is looking great in game, thanks!

[attachment=1]

[attachment=2]

[attachment=3]

:)



Title: Re: Portrait meshes
Post by: olly on July 03, 2016, 01:40:16 PM
and the Dwarf Engineer's mouth and eyes animation (just fine tuning their position coordinates in HEAD.DB)

[attachment=1]

[attachment=2]


Title: Re: Portrait meshes
Post by: olly on July 10, 2016, 01:35:03 AM
Updated Dwarf King (D2_ in Cuthalion's Dwarf Adventures Campaign) and also contains Illidan's latest Dwarf heads that can replace D2_ to test.

https://www.dropbox.com/s/w9ypb2sef7bdw2h/DwarfHeadsJuly2016.zip?dl=0 (https://www.dropbox.com/s/w9ypb2sef7bdw2h/DwarfHeadsJuly2016.zip?dl=0)

[attachment=1]

:)

**Updated Mod pack to include all new heads in Wood Elves, Dwarf Adventures and Dark Omen 2 mods**

http://forum.dark-omen.org/help-section/ultimate-dark-omen-xpvistawin7win81win10-game-fixes-t111.0.html (http://forum.dark-omen.org/help-section/ultimate-dark-omen-xpvistawin7win81win10-game-fixes-t111.0.html)


Title: Re: Portrait meshes
Post by: illidan on July 10, 2016, 08:59:28 PM
[attachment=1]


Title: Re: Portrait meshes
Post by: illidan on July 11, 2016, 03:10:33 PM
new head

[attachment=1]
[attachment=2]
[attachment=3]
[attachment=4]


Title: Re: Portrait meshes
Post by: olly on July 11, 2016, 09:22:16 PM
Fantastic!

:)


Title: Re: Portrait meshes
Post by: olly on July 18, 2016, 09:33:53 PM
They both look great in game, so will now do the mouths etc.

[attachment=1]

[attachment=2]

Thanks!

:)


Title: Re: Portrait meshes
Post by: illidan on July 19, 2016, 06:38:20 PM
[attachment=1]


[attachment=3]


[attachment=2]


Title: Re: Portrait meshes
Post by: nub_hat on July 20, 2016, 06:53:21 PM
3d Head Guide - Beta ->

https://www.dropbox.com/s/vxh829ex7rl5eed/DO%203d%20Head.zip?dl=0&preview=DO+3d+Head.zip (https://www.dropbox.com/s/vxh829ex7rl5eed/DO%203d%20Head.zip?dl=0&preview=DO+3d+Head.zip)
Would love to see a guide but the link does not work for me. If you are working on a new guide please let me know, would love to try this out.


Title: Re: Portrait meshes
Post by: olly on July 21, 2016, 09:34:03 AM
Welcome, yep I am doing a new guide so will publish it soon, as always appreciate help.

:)


Title: Re: Portrait meshes
Post by: olly on July 27, 2016, 09:54:02 PM
Have been applying your new mouths to the Dwarf Thunderer

[attachment=1]

[attachment=2]


Title: Re: Portrait meshes
Post by: illidan on July 28, 2016, 09:02:38 PM
[attachment=1]


[attachment=2]

[attachment=3]


[attachment=4]




Title: Re: Portrait meshes
Post by: olly on August 21, 2016, 12:10:46 AM
Started creating Skaven Thanquol's portrait texture
[attachment=1]

and will then be adjusting the existing 3d Skaven Head to fit
[attachment=2]

:)





Title: Re: Portrait meshes
Post by: olly on November 14, 2017, 07:46:54 PM
After some help deciphering the portrait .seq and .key animations please, found in

 C:\Program Files (x86)\Dark Omen\Graphics\PORTRAIT\SCRIPT

Will start off by watching visible differences on the ingame portraits when using 1.seq and 2.seq etc.. to understand their data

[attachment=1]

[attachment=2]





Title: Re: Portrait meshes
Post by: aqrit on November 15, 2017, 01:28:11 AM
the heads.db file is partially described in the wiki
I don't know if it helps with reversing key/seq files
but here is the rest of it... (guess work as always)
Code:
struct HEAD //  sizeof 39 bytes (0x27)
{
0x00    unsigned char ID[2]; // Presumably controls which texture is used. e.g. MB=Morgab Bernhardt
0x02    unsigned char Flags; // see table 1
0x03    unsigned char KeySeq; // animation to use?
0x04    ?? always zero

0x05    unsigned char MouthWidth;  // These may not be unsigned. Not Tested.
0x06    unsigned char MouthHeight;
0x07    unsigned char MouthX;      // This is where to draw the moving parts on the main graphic
0x08    unsigned char MouthY;      // (replacing what is there already) for facial animation

0x09    unsigned char EyesWidth;  // These may not be unsigned. Not Tested.
0x0A    unsigned char EyesHeight;
0x0B    unsigned char EyesX;      // This is where to draw the moving parts on the main graphic
0x0C    unsigned char EyesY;      // (replacing what is there already) for facial animation
//
0x0D    char body_mesh_id // meshes/%d.m3d file
0x0E    signed char head_body_x; // seperate from center...padding?  does not include the neck.
0x0F    signed char head_body_y; // ...
0x10    signed char head_body_z;
//
0x11    char head_mesh_id // meshes/%d.m3d file
0x12    signed char HeadX;
0x13    signed char HeadY;
0x14    signed char HeadZ;

0x15    char head movement multiplier
0x16    char KeyID // for cut-scenes?

0x17   char NeckID;
0x18   signed char NeckX;
0x19   signed char NeckY;
0x1A   signed char NeckZ;

0x1B    char WeaponID; // 0x27 = bow, 0x33 = sword, etc.
0x1C signed char WeaponX;
0x1D signed char WeaponY;
0x1E signed char WeaponZ;  

0x1F    char BackpackID;
0x20    signed char BackpackX;
0x21    signed char BackpackY;
0x22    signed char BackpackZ;

0x23    char HelmentID
0x24    signed char HelmentX;
0x25    signed char HelmentY;
0x26    signed char HelmentZ;
};


Title: Re: Portrait meshes
Post by: dougie on November 15, 2017, 02:05:09 PM
Really good work, I'll run some tests today myself using this

to better understand seq files,

thankyou  :)


Title: Re: Portrait meshes
Post by: dougie on November 15, 2017, 02:31:46 PM
Do you know if morphing animation is used Olly?

actually changing vertices I mean,

in any of the heads


Title: Re: Portrait meshes
Post by: olly on November 15, 2017, 02:56:49 PM
I don't sorry


Title: Re: Portrait meshes
Post by: dougie on November 15, 2017, 03:01:11 PM
Alright, thanks.


Title: Re: Portrait meshes
Post by: aqrit on November 15, 2017, 03:23:41 PM
correction:

byte offset 0x16 of the "HEAD" struct seems to control which KEY file is used during the "talkie" first cut-scene...



Title: Re: Portrait meshes
Post by: dougie on November 15, 2017, 04:09:53 PM
good :) I'm trying this out now


Title: Re: Portrait meshes
Post by: dougie on November 15, 2017, 04:25:34 PM
haha, Morgan Burnheart's flying about  ;D


Title: Re: Portrait meshes
Post by: dougie on November 19, 2017, 07:52:47 PM
To anyone who's interested, I have found out a bit more about .key files,
with help from aqrit's db code

.KEY files appear(Pretty sure) to contain a list of keyframes, which are just a rotation for the
head and a rotation for the body.
each keyframe is a struct that is 12 bytes,

the first byte of a .key file is the number of keyframes in the file(e.g. 64 frames in 0.KEY)

//the second bytes for each rotation has more effect,
//e.g. something like 0-275 degrees while the first
//has a lesser 0-85, not sure exactly


For example:
Code:
struct BODYHEAD{
    //12 bytes
    //Body rotation
    0x00    signed char body_rotation_x1; // a rotation value around x axis
    0x01    signed char body_rotation_x2; // a greater rotation value around x axis
    0x02    signed char body_rotation_y1; // a rotation value around y axis
    0x03    signed char body_rotation_y2; // a greater rotation value around y axis
    0x04    signed char body_rotation_z1; // a rotation value around z axis
    0x05    signed char body_rotation_z2; // a greater rotation value around z axis
    //Head rotation
    0x06    signed char head_rotation_x1; // a rotation value around x axis
    0x07    signed char head_rotation_x2; // a greater rotation value around x axis
    0x08    signed char head_rotation_y1; // a rotation value around y axis
    0x09    signed char head_rotation_y2; // a greater rotation value around y axis
    0x0A    signed char head_rotation_z1; // a rotation value around z axis
    0x0B    signed char head_rotation_z2; // a greater rotation value around z axis
}

.SEQ files then choose the order of these keyframes to create different animations for
each of the characters, I'm working on figuring them out

doug


Title: Re: Portrait meshes
Post by: olly on November 19, 2017, 09:19:18 PM
very good!

:)


Title: Re: Portrait meshes
Post by: dougie on November 30, 2017, 02:54:03 AM
I've worked out SEQ files  :), here's a quick look at
what they do:

0.seq is used by all characters(in talkie scenes) and 126.seq,
and 0.key

126.seq is for mouth movement, these are the only three files needed for most cutscenes, could
be all. in-game characters use other files(like orcs on level 2)

SEQ files contain lists of keyframes,
a keyframe is a state a character(like Burnheartd) can be in.

The second byte in a SEQ file is the number of keyframes in the first
animation set, 0F in 0.SEQ
Code:
0F==15 frames,
each frame is 4 bytes so: 15*4 bytes in the first animation set:

40 0F 05 01 00 00 03 04 14 07 03 00 24 17 05 00 00 00 05 00 00 00 05 01 00 00 03 04 14 09 03 04 14 07 03 04 28 04 05 00 00 00 05 00 00 00 05 01 00 00 03 04 0F 00 02 00 00 00 08 00 00 00 0F 0A 02 00 00

Each animation set is defined by a number(length in frames) such as
0F or 0B, and there are something like
28 sets in 0.SEQ, this number occurs after each previous set

types are:
"zero five" entries:
05 01 00 00 - eyes texture open(01 for open)
05 00 00 00 - eyes closed(00 for closed)

"zero three" entries:
these are for head and body rotation
03 04 14 07 - tell character to rotate to key 7 in 0.key
03 04 XX 02 - rotate to key 2 in 0.key
03 04 XX 07 - XX is an acceleration value, greater values cause rotation to be slower

the second byte is almost always 04, or 00, I haven't worked out what it does.
If the third byte XX is 0(0 acceleration), no rotation will occur for that key frame.

"zero A" entries:
0A 02 00 00 - causes mouth to start talking, audio+animation, using 126.SEQ

"zero 6" entries:
these are for mouth
*they only occur in 126.SEQ file like I said, that file is for mouth
06 11 00 00 - oow mouth
06 06 01 00 00 - mouth state
06 02 00 00 - mouth state
06 10 00 00 - mouth state

"zero 8" entries:
These are found at the end of each animation set:
08 00 00 00
they seem to cause that particular set to loop if that set was started.

"zero 2" entries:
02 00 00 00
These are also found at the end of an animation set like 08, I haven't worked out what they do.

That's most of the different keyframe types.

Each animation set is defined by a number of frames in
that set, e.g. 0F for the first, 07 for the second, 0B 3rd if you
look at "0.SEQ":
Code:
40 0F 05 01 00 00 03 04 14 07 03 04 14 04 05 00 00 00 05 00 00 00 05 01 00 00 03 04 14 09 03 04 14 07 03 04 28 04 05 00 00 00 05 00 00 00 05 01 00 00 03 04 0F 00 02 00 00 00 08 00 00 00 07 0A 02 00 00 03 04 0A 05 03 00 0F 04 03 04 0A 01 03 04 0A 02 02 00 00 00 08 00 00 00 0B 0A 02 00 00 03 04 14 03 03 04 0F 04 05 00 00 00 05 01 00 00 03 04 14 05 03 04 14 06 03 04 0A 01 03 04 0A 04 02 00 00 00 08 00 00 00

 :)


Title: Re: Portrait meshes
Post by: olly on November 30, 2017, 02:03:19 PM
Excellent!


Title: Re: Portrait meshes
Post by: dougie on December 20, 2017, 10:31:34 PM
I'm doing an implementation of these heads in Unreal Engine, using 3ds max  :)


Title: Re: Portrait meshes
Post by: devast3d on December 24, 2017, 11:18:13 AM
Wow, that's great news! Keep us updated  :D


Title: Re: Portrait meshes
Post by: dougie on February 25, 2018, 09:20:44 PM
I'm going to start looking into modifying texture memory for the mouth movements


Title: Re: Portrait meshes
Post by: devast3d on February 25, 2018, 10:41:43 PM
Have you figured out how animation works? I mean actual mesh movement.


Title: Re: Portrait meshes
Post by: dougie on February 26, 2018, 09:08:11 PM
yes, basically, but my code needs refining  :)
and I still have to see if it looks right for yaw, pitch, roll combined,
I've done most of the calculations.
It's keyframe based animation that are used in 3d modelling software, that's the
basic idea, I'm trying to do it exact but might go for a simpler implementation.


Title: Re: Portrait meshes
Post by: dougie on February 26, 2018, 10:32:52 PM
I was doing a lot of curve fitting, in game maker, to see how dark omen does it.


Title: Re: Portrait meshes
Post by: devast3d on February 28, 2018, 08:40:02 AM
Cool! Can't wait to see the heads in UE  :)


Title: Re: Portrait meshes
Post by: dougie on February 28, 2018, 09:19:33 PM
Good :)


Title: Re: Portrait meshes
Post by: olly on March 04, 2018, 10:07:44 PM
yep sounds great!

:)


Title: Re: Portrait meshes
Post by: dougie on March 12, 2018, 09:14:29 PM
What version of Unreal are you using Devast3d? Do you plan on using the latest version?, 4.19, I think there are some bug fixes that affect what I'm doing, but I could try 4.16 again


Title: Re: Portrait meshes
Post by: devast3d on March 14, 2018, 08:49:52 AM
We're using 4.16 because we rarely need anything from the graphics or blueprints UE offer. Have you spotted anything from the latest versions that affect us? Migrating to the last version may incur some costs, so we need justification for this.

p.s. if you want to try to migrate yourself and see what happens, you're welcome to do it on your local copy :)


Title: Re: Portrait meshes
Post by: dougie on March 14, 2018, 01:43:51 PM
It was one or two things, purple lighting using emmisive(a known glitch), but I might be able to do a work-around.  And I can't recall the other problem I had.
Since your implementation is quite big, I don't want to migrate your copy to newer myself.
Best thing is for me to try 4.16 again, also I had another minor glitch where multiple instances of visual studio open
(another known glitch)
I know conversion could be a hassle, so I'll try 4.16


Title: Re: Portrait meshes
Post by: dougie on March 14, 2018, 02:02:25 PM
There isn't too much for me to reimplement  :)


Title: Re: Portrait meshes
Post by: devast3d on March 15, 2018, 08:44:55 AM
Yeah, migration could be PITA, so we better avoid it if possible  :)


Title: Re: Portrait meshes
Post by: dougie on March 22, 2018, 08:58:45 PM
I decided to write an importer for blender because of a stretching problem with textures, that's fixed now

(https://preview.ibb.co/mqgicx/stretchfixed.png) (https://ibb.co/h6vn4c)


Title: Re: Portrait meshes
Post by: olly on March 23, 2018, 11:19:03 PM
Can I try it as well please

:)


Title: Re: Portrait meshes
Post by: dougie on March 24, 2018, 12:58:05 AM
Here you go(attachment)

[attachment=1]


Title: Re: Portrait meshes
Post by: dougie on March 24, 2018, 01:04:02 AM
You might notice a cube is imported too, this is the pivot point


Title: Re: Portrait meshes
Post by: olly on March 25, 2018, 06:59:37 PM
Thanks!

:)


Title: Re: Portrait meshes
Post by: EvgenS on March 30, 2018, 09:39:55 PM
I haven't checked the forum for awhile and just noticed your sneaky conversation.
Great progress Dougie!


Title: Re: Portrait meshes
Post by: dougie on March 30, 2018, 11:38:27 PM
Thanks Evgen, I hope to have some screenshots and a working application with the coming weeks


Title: Re: Portrait meshes
Post by: dougie on April 16, 2018, 03:48:42 PM
Things are looking good here, but I have a few concerns like whether the system I'm making will run smoothly on slower computers, I'll have to test that out.  but otherwise I've got lighting to work with render targets.  I'll post screenshots of the grissburg scene that I'm creating.


Title: Re: Portrait meshes
Post by: dougie on April 16, 2018, 06:32:17 PM
(https://preview.ibb.co/cpN1p7/screenshot3.png) (https://ibb.co/c5owNS)


Title: Re: Portrait meshes
Post by: olly on April 16, 2018, 07:46:28 PM
Very nice! Well done

:)


Title: Re: Portrait meshes
Post by: dougie on April 16, 2018, 08:08:33 PM
Cheers  :), I'll keep going with it till I've got some levels implemented, probably


Title: Re: Portrait meshes
Post by: dougie on April 29, 2018, 10:32:55 AM
An update on the portraits implementation. The animations are looking pretty good
like the original, First scene is working with clicks.

Here's a screenshot.
(https://preview.ibb.co/fc2uYc/scene1.png) (https://ibb.co/jsfgDc)

I'm about to start on some ui elements, arrow buttons basically

I maybe need help working out which animation sets are used by each
character, there are a multitude 0-64
so it's a time consuming task

For example Clouse has animation set 26 immediately when he starts talking.

All the animation sets currently are in 0.seq

code looks like this:
Code:
c->SetBodyAnimation(26, this); or
for example
c->SetBodyAnimation(0, this);


Title: Re: Portrait meshes
Post by: dougie on April 29, 2018, 11:01:28 AM
just realized, I might have edited that 0.seq a while back, could be less than 64 :)


Title: Re: Portrait meshes
Post by: olly on April 29, 2018, 07:38:36 PM
Looking good!

:)


Title: Re: Portrait meshes
Post by: devast3d on January 18, 2019, 01:12:17 PM
Picking up the work. Did some tests on the 1.seq using 0 animation (that is charge).

13 XX XX XX
Seems to be the same as 03 XX XX XX, but only occurs as the first command in the animation

03 00 XX XX or 03 04 XX XX
Second byte seems to be controlling interpolation somehow. By changing 04 -> 00 and recording the videos I see some minor differences during the movement, but nothing really dramatic, only slight diff. Probably we can ignore this.

01 XX XX XX
Is connected somehow to the mouth animation (0A). By removing it from the charge the mouth animation started a lot earlier. Not sure it always works like this because sometimes 01 appears after 0A. Need more investigation. This flag appears rather unfrequently though.

02 00 00 00
Appears before 08 00 00 00 in the end of the animation. Only tested on charge. By removing it from the list mouth animation ended much-much earlier, so it again is connected to mouth (and/or sound) somehow. Need more investigation.

I've written the tool to edit SEQ files [attachment=1]. Here's the interface [attachment=2].

Open - select source and destination SEQ files
Save - save current state to the destination SEQ
MakeStatic - copies first frame of the animation all over the animation (kinda deprecated due to the next feature)
Edit - allows to edit the bytes manually, very handy. Bytes are in hex, each one should be separated by the whitespace/newline
ResetEdit - reverts the string to the original state



Title: Re: Portrait meshes
Post by: olly on January 18, 2019, 05:18:35 PM
Excellent Thanks!

:)


Title: Re: Portrait meshes
Post by: devast3d on January 26, 2019, 10:13:00 AM
More KEY stuff.

Quick reminder:
- each file starts with header byte (num of items)
- each item is 12 bytes long (first 6 is body, second 6 is head)
- each rotation consists of 2 bytes
- second byte has more influence

New stuff:

These 6 bytes represent Pitch, Yaw, Roll respectively in the 1st, 2nd and 3d byte pair. E.g. if you only want Roll you write
00 00 00 00 RR RR

Now, second pair byte always has first digit 0! I.e. actually only 3 digits matter: XX 0X

As was mentioned second byte has more influence. By doing some simple replacements I've figured out the following:

Second byte
- 04 gives 90 deg rotation
- 08 gives 180 deg rotation
- that means 01 of the second is 22.5 deg of rotation

First byte
- Logic says that FF of the second byte should be equal to 01 of the first byte
- This seems to be true from my tests
- i.e. 01 of the first byte is 22.5/256 deg of rotation (let's call it UR - unit of rotation)

So basically they have quantized 360 deg using 2 bytes. Also animation is done via shortest arc, i.e. going from 00 to 07 will go one way, from 00 to 09 the other way (google SLERP on this). Checked this by experiments:

- 00 00 to 01 08 (that's 180deg+1UR) one way
- 00 00 to FF 07 (that's 180deg-1UR) other way
- Going from 00 00 to FF 0F (360deg-1UR) practically shows no movement, although theoretically it should be 1UR of rotation (0.087890625 in degrees), probably too small to be noticed.

That's all for now.


Title: Re: Portrait meshes
Post by: olly on January 26, 2019, 09:44:50 PM
Awesome!


Title: Re: Portrait meshes
Post by: devast3d on February 04, 2019, 10:19:42 AM
About 01 XX 00 00 command.

It's simply the delay command. The animation playback in DO will wait certain amount of time (controlled by the second byte XX, not sure the exact conversion rate though) before issuing commands that follow, i.e. everything is still executed in the linear fashion.

=====

Although, everything is not really that linear. E.g. 06 sequence (all is lost) looks like this

13 04 14 03
03 04 14 07
0A 02 00 00
01 05 00 00
05 00 00 00
02 00 00 00
08 00 00 00

05 command (close eyes) happen during the body/head animation (03 command). Not right away, but after some time (01 command).

=====

OK, I think I got it after twiddiling with SEQ files for couple of hours.

01 command actually isn't simple delay. It's a parallel command! Let me elaborate.

First, 01 command is dependent on 03 commands. 03 has its own time of animation. Basically all the animation happens between 03 commands. Let's call single 03 command execution time a segment. So 01 command starts parallel execution in the current segment (i.e. relative previous 03 command) after specified delay. But, 01 also has time! From my experiments if 01 time is less than its 03 time, then current segment's length is unchanged. However, if 01 time is larger than 03 time, then current segment is extended! It doesn't really makes sence to use this since it'll simply introduce pause in the animation (because 03 will already finish its job).

Second, 01 is used in conjunction with 05 and 0A commands. Its main job is to delay these commands relative to nearest 03 command (by specifying 01 time less than its 03 time). This will make eyes/mouth/sound play during the current animation segment.

Third, time scale of the 01 command seems to be the same as in 03 command.

Not sure if all this 100% correct, but at least it fits into my current tests without breaking anything.

BTW, for some reason 05 command is ignored if there's no 0A command in the sequence! At least this happened in my tests with battle SEQ files.


Title: Re: Portrait meshes
Post by: devast3d on February 07, 2019, 10:40:36 AM
Something is really wrong with the animation interpolation in DO.

By using the KEY data and simply interpolating between the keys with linear interpolation sometimes the animation doesn't reach the same positions as in DO. So either we got KEY data extraction wrong (don't think so) or DO devs did something crazy with the interpolation.

I've tried to apply overshooting when interpolating, i.e. instead of interpolating between two keys using 0.0-1.0 factor, interpolation is done in 0.0-1.X factor, i.e. 1.0-1.2. In effect this creates some exaggeration of the movement. Actually, this worked in some cases! And I've finally reached the same pose as in DO for e.g. 01 animation in 1.seq file. It doesn't work the same for all animations though.

Another very interesting observation. I've taken 0 animation from 1.seq (charge). It contains the same 03 commands

13 04 14 04
03 04 0A 0A
01 05 00 00
0A 03 00 00
03 00 0A 0A
02 00 00 00
08 00 00 00

notice, two 03 commands have the same 0A key! The only difference is in 04/00 byte (we know this somehow affects interpolation). Observing charge portrait animation in DO I can see that there slight movement in the end of the animation (though the position shoud be the same!).

So I did some testing. I've copied last 03 command and pasted it many times. Got following results in DO:
- animation is NOT static on these copied keys, I still see small movement (really small but noticeable)
- depending on 00/04 byte the movement is either constantly periodic or fading away slightly

And if I can somehow understand the fading case, I really don't get how can one get non fading movement between the same keys!! Even when using overshooting of some sort. It's like they have some sort of acceleration applied (which is also non-sense since the positions are the same). Another DO dark magic...


Title: Re: Portrait meshes
Post by: devast3d on February 08, 2019, 11:31:27 AM
After toying with SEQ a bit more I think they're using some kind of spline interpolation between the frames.

Rationale:

I've taken 1 sequence from 1.SEQ file (enemy sighted)

13 04 01 04
03 04 05 06
03 04 19 02
0A 01 00 00
02 00 00 00
08 00 00 00

Here we have 3 animation keys: 13->03->03

If interpolated linearly the animation never reaches the same position on the first 03 command as in DO (stopping much earlier). This is where I thought there's some kind of overshooting applied. So I nuked second 03 command from the sequence, leaving only 2 animation keys. Playing this sequence in DO resulted in unexpected (at least for me) result: the animation stopped at the same position as in my program! There was no overshooting at all.

After that I think there's some spline interpolation applied. Tried Catmull-Rom spline interpolation today (different parameterizations, including most famous uniform, centripetal, chordal), but it didn't overshoot at all. Moreover, this spline type requires at least 4 points (and SEQ animation can have just 2, like e.g. "all is lost", 6 in 1.SEQ), so I had to duplicate and jitter end points to make it work. Probably other spline type is used in DO, going to try...


Title: Re: Portrait meshes
Post by: olly on February 08, 2019, 11:16:31 PM
Good work

:)


Title: Re: Portrait meshes
Post by: devast3d on February 09, 2019, 07:28:15 PM
Decided to move the experiments to the external 3d editor since I'm out of ideas.

Here're two options that I've tried (on the images you see x/y/z rotation channels):
[attachment=1]
[attachment=2]

First one looks similar to what I get in UE. On the second curve we see substantial overshooting and this looks like something DO uses (not exactly the same but in the same direction)! So the task is to find how DO devs calculated this curve (and tangents on the keys).

p.s. 03 00 XX XX overshoots much more than 03 04 XX XX command. Probably they differ either in curve type or in tangents of the same curve.



Title: Re: Portrait meshes
Post by: olly on February 10, 2019, 04:56:24 PM
Forgive my novice knowledge but I've only ever used bezier interpolation that makes the graph ease in and ease out on a smooth graph curve, for Blender animations.


Title: Re: Portrait meshes
Post by: devast3d on February 11, 2019, 10:44:02 PM
Ended up using TCB splines (https://en.wikipedia.org/wiki/Kochanek%E2%80%93Bartels_spline). Modifying tension and bias gives DO-like look. Used different sets for 0304 and 0300 commands. Not exactly the same as in DO, but looks pretty good.

Going to end curve research here due to lack of time. Moving to eyes/mouth animation.


Title: Re: Portrait meshes
Post by: olly on February 12, 2019, 12:14:47 AM
Yep it looks really good - well done and was also great learning for me, thanks.


Title: Re: Portrait meshes
Post by: devast3d on February 13, 2019, 11:08:18 AM
A bit fixed seqreplaceui tool. Added proper vertical scrolling, otherwise you can't normally view/edit 126.seq/127.seq files (mouth animations).
[attachment=1]

These files are of the strange structure. They got many sequences, but only few of them contain data, other only contain single 08 command.

126.seq file:
Contains 32 sequences in total. Only sequences 0, 1, 2, 3 and 17 contain data. Sequences 0 and 17 contain 05 (eyes) commands and 06 (mouth) commands. The rest contain only 06 commands.

127.seq file:
16 in total, 0-4 contain data. Only contain 06 commands.

Most of the sequnces only contain 0A command with 00-03 index, however 9 sequence also contains 0A 04 which makes me think these seqs use 127 file for the mouth animation. Gonna try this file first.

The 0A command itself is very simple:

0A XX 00 00

where XX is the mouth index. There are 5 indices in total:

00 10
01 11
02

they correspond to the column/row of the mouth inside the bits texture.

To obtain the row/column one can easily do this:

uint8 col = (state & 0xF0) >> 4;
uint8 row =  state & 0x0F;

What's bothering me is that there's no time in either 0A or 06 commands. So it's probably hardcoded somewhere.

[attachment=2]


Title: Re: Portrait meshes
Post by: devast3d on February 13, 2019, 12:56:41 PM
Here're several examples of what the code currently produces. All looks good so far. I think this is OK and I can stop portrait work here. Going to merge the code into DOR now.

[attachment=1]
[attachment=2]
[attachment=3]

p.s. Had to switch to nearest filtration (pixel look) due to DO portrait textures are unfriendly to bilinear.


Title: Re: Portrait meshes
Post by: olly on February 13, 2019, 11:07:25 PM
Very nice!

:)


Title: Re: Portrait meshes
Post by: devast3d on February 19, 2019, 11:24:47 AM
Regarding b101 mission anims: "get the loot" and "they're heading to the trading post..."

- "get the loot" Uses 9 anim from the 2.seq (ngobs use 2.seq and 9th anim seems to be reserved for such cases)
- "they're heading..." uses 9 anim from the 1.seq
- these sequences are completely the same in terms of commands, but use different key files obviously
- the most interesting thing: while "get the loot" is very short, "they're heading..." is rather long (but commands are the same!). I think this is overriden by special flag of some sort, which tells the animation to stop when sound stops (if I remove 0A command from 2.seq, I see full sequence, not the short one!)
- both use 127.seq for the facial animation, however, 0A 04 command that's used is rather short, but in "they're heading..." the mouth animation looks much longer. I think this is another override: loop the 0A command while animation is playing. Proof: I've pasted 05 00/01 commands inside facial animation and Morgan was constantly opening/closing his eyes while "they're heading blablabla"