Modify message

Subject:
Message icon:

Attach:
(Clear Attachment)
(more attachments)
Restrictions: 4 per post, maximum total size 1024KB, maximum individual size 1024KB
Verification:
Type the letters shown in the picture
Listen to the letters / Request another image

Type the letters shown in the picture:
Type ot the full word: TUR**:
Finish the word: Turok 2: Seeds of ****:
Finish the word: Turok Dinosaur ******:

shortcuts: hit alt+s to submit/post or alt+p to preview


Topic Summary

Posted by: Smoke39
« on: April 20, 2017, 10:05:43 PM »

I wrote some kinda pseudocode to help me wrap my head around how all the pieces fit together.  If anyone's interested, you can find it in my notes (also linked from my modding guide).
Posted by: Duke64
« on: April 14, 2017, 01:10:14 AM »

This was shared and written by Samuel Villarreal (Kaiser):

Source: http://steamcommunity.com/app/405820/discussions/1/135514376585626037/

Kaiser's Gist Link ) https://gist.githubusercontent.com/svkaiser/0d64663480f46a0ec1e0b20ea8f02907/raw/3fd73db97af55fe6dc204c8047ea6d01db477f77/gistfile1.txt

//
// Turok EX Model and Animation Format Specifications
//
// Samuel 'Kaiser' Villarreal (svkaiser---at---gmail.com)
// Revised: 04/13/17
//

//-----------------------------------------------------------------------------
//
// What is this document for?
//
//-----------------------------------------------------------------------------

This technical document is targeted towards users with programming expirence as
well as expirence with 3D modeling tools and writing plugins for them.

//-----------------------------------------------------------------------------
//
// Model Format
//
//-----------------------------------------------------------------------------

Model files (.BIN) are simple binary files that are read in a linear fashion.
The information below details the data, byte count and additional notes.


name                bytes           notes   
---------------------------------------------------------
version             4 (int)         always 1
bounding box min    12 (3 floats)   always 0 for non-animating models
bounding box max    12 (3 floats)   always 0 for non-animating models
node count          4 (int)         always 1 for non-animating models


for (node count) loop:
-----------------------
child count         4 (int)         number of child node indexes for recursion
variant count       4 (int)         variant count should be the same for all nodes
object count        4 (int)         total number of unique models for this node (bare hands, hand w/Axe, etc)


for (child count) loop:
-----------------------
child index         2 (int16)       index to the next child node
exit (child count) loop

for (variant table count) loop:
-----------------------
variation index     2 (int16)       see below for more information about variants
exit (variant table count) loop

for (object count) count loop:
-----------------------
surface count       4 (int)

for (surface count) loop:
-----------------------
material file       string          (zero terminated)
triangle count      4 (int)         stored as nTriangles / 3. multiply by 3 when reading from model file

for (triangle count) loop:
-----------------------
indice index        2 (int16)
exit (triangle count) loop

vertex count        4 (int)

for (vertex count) loop:
-----------------------
xyz                 12 (3 floats)
uv coords           8 (2 floats)    when read in TurokEX, the y coordinate is always read as 1.0f - UV.y   
normals             12 (3 floats)
exit (vertex count) loop

exit nSurface loop

exit (object count) loop

exit nNode loop


Each node can have several alternative models which variant indexes can define which ones to show based on the actor's
variant ID setting in the level. The variant table contains a list of indexes to that object to display based on the
actor's variation ID. Example, if the table contains values of 2, 1, 3, 0, 4 and the actor has a variation ID set to 2
then it will lookup the entry at that index, which will be 3. This will dictate which object model to display for that node.

Surfaces are geometry with a unique material thats issued as a single draw call.

It is not required to compute the bounding box information for static models (leave all zeros).


//-----------------------------------------------------------------------------
//
// Animation Format
//
//-----------------------------------------------------------------------------

Animation files (.BIN) are simple binary files that are read in a linear fashion.
The information below details the data, byte count and additional notes.

name                        bytes           notes   
---------------------------------------------------------
version                     4 (int)         always 1
anim block count            4 (int)

for nAnimBlock count loop
-----------------------
anim ID                     4 (int)         each anim ID has a special purpose and is used for special behaviors
frame count                 4 (int)
num node indexes            4 (int)
num nodes                   4 (int)
num translations            4 (int)
num rotations               4 (int)
num keyframe actions        4 (int)

marker                      4 (int)

if (marker == 1) then read:
blend length                2 (int16)
loop frame                  2 (int16)
end if

Node index count should match the node count of the model using this animation

for node indexes loop
-----------------------
translation index           2 (int16)
rotation index              2 (int16)
end node indexes loop

The following is just a table for the 'binding' pose or default pose

for num nodes loop
-----------------------
initial translation         12 (3 floats)
initial rotation            16 (4 floats)
end num nodes loop

Create a float array based on frame count. This is used to physically rotate the actor playing this animation.

for num frames loop
-----------------------
yaw offsets                 4 (float)
end num frames loop

Create a translation table for every nTranslation. Each table should contain (vector3 * nFrames). This
table will be referenced by the node index table

for nTranslation loop
-----------------------
for nFrame count loop
-----------------------
translation                 12 (3 floats)

end nFrame count loop
end nTranslation loop

Create a rotation table for every nRotation. Each table should contain (vector4 * nFrames). This
table will be referenced by the node index table

for nRotation loop
-----------------------
for nFrame count loop
-----------------------
rotation                    16 (quaternion (4 floats))

end nFrame count loop
end nRotation loop

for nKeyFrame action loop
-----------------------
eventType                   4 (int)
frame                       4 (int)         which frame this event occurs on
args                        16 (4 floats)

end nKeyFrame action loop

end nAnimBlock count loop


//-----------------------------------------------------------------------------
//
// Keyframe Event Types
// Any other types the engine will consider them scripted/user defined
//
//-----------------------------------------------------------------------------

55  - Play footstep sound
232 - Disable blocking sector (args: 0 - unused, 1 - x offset, 2 - y offset, 3 - z offset)
233 - Enable blocking sector (args: 0 - unused, 1 - x offset, 2 - y offset, 3 - z offset)
248 - Play sound (args: 0 - SoundID, 1 - x offset, 2 - y offset, 3 - z offset)
407 - Removes actor
900 - Spawn particle (args: 0 - Particle ID, 1 - x offset, 2 - y offset, 3 - z offset)

Note: All xyz offsets are based on local model space, not world space


//-----------------------------------------------------------------------------
//
// Animation Type IDs
// The following is taken from the animation.txt script file
//
//-----------------------------------------------------------------------------

enum turokAnimations
{
    // ai movement/turning
    anim_aiStanding                     = 0,
    anim_aiWalking,
    anim_aiRunning,
    anim_aiTurn_L_Stand,
    anim_aiTurn_R_Stand,
    anim_aiTurn_B_Stand                 = 6,
    anim_aiTurn_L_Walk,
    anim_aiTurn_R_Walk,
    anim_aiTurn_B_Walk,
    anim_aiTurn_L_Run,
    anim_aiTurn_R_Run,
    anim_aiTurn_B_Run,
   
    anim_aiLostSight,
    anim_aiReach,
   
    anim_aiDodgeRight                   = 15,
    anim_aiDodgeLeft,
    anim_aiDodgeCrouch,
   
    // ai melee
    anim_aiMelee1                       = 18,
    anim_aiMelee2,
    anim_aiMelee3,
    anim_aiMelee4,
    anim_aiMelee5,
    anim_aiMelee6,
    anim_aiMelee7                       = 25,
    anim_aiMelee8,
    anim_aiMelee9,
    anim_aiMelee10                      = 54,
    anim_aiMelee11,
    anim_aiMelee12,
    anim_aiMelee13,
    anim_aiMelee14,
   
    anim_stun1                          = 28,
    anim_stun2,
   
    // ai death knockback
    anim_aiDeathKnockback1              = 30,
    anim_aiDeathKnockback2,
    anim_aiDeathKnockback3,
    anim_aiDeathKnockback4,
   
    // ai death
    anim_aiDeathStand                   = 34,
    anim_aiDeathViolent,
    anim_aiDeathRunning                 = 37,
   
    anim_trexRoar,
   
    anim_activate                       = 200,
   
    // ai specific
    anim_aiPurlinSpawnDrop              = 205,
   
    // swimming
    anim_aiSwim1                        = 2500,
    anim_aiSwim2,
    anim_aiSwim3,
    anim_aiSwim4,
    anim_aiSwim5,
    anim_aiSwim6,
    anim_aiSwim7,
    anim_aiSwim8,
    anim_aiSwim9,
    anim_aiSwim10,
    anim_aiSwim11,
   
    // doors
    anim_doorIdle                       = 2600,
    anim_doorOpen,
    anim_doorClose,
   
    // traps
    anim_trapIdle,
    anim_trapActivate,
   
    // mantis statue
    anim_mantisStatueIdle,
    anim_mantisStatueTrigger,
   
    // lifts
    anim_liftRaise,
    anim_liftLower,
   
    // timer
    anim_timerIdle,
    anim_timerStart,
   
    anim_mantisWallIdle,
    anim_mantisWallCollapseOutward,
    anim_mantisWallCollapseInward,
   
    // laser wall
    anim_laserWallStart                 = 2623,
    anim_laserWallGo                    = 2624,
    anim_laserWallStop                  = 2625,
   
    // destructibles
    anim_destructibleIdle               = 2626,
    anim_destructibleDeath,
   
    // mantis key
    anim_mantisKeyIdle                  = 2637,
    anim_mantisKeyLower,
    anim_mantisKeyRaise,
   
    // ai grunt
    anim_aiGruntStandAlt                = 129,
    anim_aiGruntWalkAlt,
    anim_aiGruntRunAlt,
    anim_aiGruntTurn_L_StandAlt,
    anim_aiGruntTurn_R_StandAlt,
    anim_aiGruntTurn_B_StandAlt,
    anim_aiGruntTurn_L_WalkAlt,
    anim_aiGruntTurn_R_WalkAlt,
    anim_aiGruntTurn_B_WalkAlt,
    anim_aiGruntTurn_L_RunAlt,
    anim_aiGruntTurn_R_RunAlt,
    anim_aiGruntTurn_B_RunAlt,
   
    anim_aiAltMelee1                    = 2700,
    anim_aiAltMelee2,
    anim_aiAltMelee3,
    anim_aiAltMelee4,
    anim_aiAltMelee5,
    anim_aiAltMelee6,
    anim_aiAltMelee7,
    anim_aiAltMelee8,
    anim_aiAltMelee9,
    anim_aiAltMelee10,
    anim_aiAltMelee11,
    anim_aiAltMelee12,
    anim_aiAltMelee13,
    anim_aiAltMelee14,
   
    anim_aiGruntDeathStandAlt           = 143,
    anim_aiGruntDeathViolentAlt,
    anim_aiGruntDeathRunningAlt,
   
    // ai range attack
    anim_aiRangeAttack1                 = 24,
    anim_aiRangeAttack2                 = 59,
    anim_aiRangeAttack3                 = 121,
    anim_aiRangeAttack4,
    anim_aiRangeAttack5,
    anim_aiRangeAttack6,
    anim_aiRangeAttack7                 = 141,
    anim_aiRangeAttack8,
    anim_aiRangeAttack9                 = 150,
    anim_aiRangeAttack10,
   
    // ai teleport
    anim_aiTeleportIn                   = 2550,
    anim_aiTeleportOut,
   
    // mantis animations
    anim_mantisCeilingIdle              = 62,
    anim_mantisGroundIdle,
    anim_mantisWallRightIdle,
    anim_mantisWallLeftIdle,
    anim_mantisLostSight,
    anim_mantisCeilingStandTurnLeft,
    anim_mantisCeilingStandTurnRight,
    anim_mantisGroundStandTurnRight,
    anim_mantisGroundStandTurnLeft,
    anim_mantisWake,
    anim_mantisDeath,
    anim_mantisSlowAttack,
    anim_mantisPain,
    anim_mantisCeilingForward,
    anim_mantisGroundForward,
    anim_mantisCeilingToGround,
    anim_mantisGroundToAir,
    anim_mantisAirLoop,
    anim_mantisAirToGround,
    anim_mantisGroundToCeiling          = 82,
    anim_mantisGroundToRightWall,
    anim_mantisGroundToLeftWall         = 87,
    anim_mantisRightWallToCeiling       = 91,
    anim_mantisRightWallToGround,
    anim_mantisRightWallToAir,
    anim_mantisRightWallToAirLoop,
    anim_mantisAirToLeftWall,
    anim_mantisLeftWallToCeiling        = 97,
    anim_mantisLeftWallToGround,
    anim_mantisLeftWallToAir,
    anim_mantisLeftWallToAirLoop,
    anim_mantisAirToRightWall,
    anim_mantisAttackGround1            = 103,
    anim_mantisAttackCeiling1,
    anim_mantisAttackCeiling2,
    anim_mantisAttackGround2,
    anim_mantisAttackRightWall1,
    anim_mantisAttackRightWall2,
    anim_mantisAttackLeftWall1,
    anim_mantisAttackLeftWall2,
    anim_mantisAttackGroundMelee,
    anim_mantisChargeForward            = 114,
    anim_mantisDamageBack,
    anim_mantisDamageRight,
    anim_mantisDamageLeft,
    anim_mantisInvokeCeiling,
    anim_mantisInvokeRightWall,
    anim_mantisInvokeLeftWall,
   
    // player weapons
    anim_weaponIdle                     = 39,
    anim_weaponWalk,
    anim_weaponRun,
    anim_weaponAttack1,
    anim_weaponAttack2,
    anim_weaponAttack3,
    anim_weaponFire,
    anim_weaponFireCharged,
    anim_weaponSwapIn,
    anim_weaponSwapOut,
    anim_weaponFireLoop,
    anim_weaponAttackUnderwater         = 250,
    anim_weaponIdleUnderwater,
    anim_weaponFireBowNoAmmo            = 2000,
   
    anim_turokIsNom                     = 201,
    anim_campaingerRage                 = 202,
    anim_event03                        = 203,
    anim_event04                        = 204,
    anim_event05                        = 205,
    anim_event06                        = 206,
    anim_event07                        = 207,
    anim_event08                        = 208,
    anim_event09                        = 209,
    anim_event10                        = 210,
    anim_trexGulp                       = 230,
   
    // event animations
    anim_special_event01                = 2801,
    anim_special_event02                = 2802,
    anim_special_event03                = 2803,
    anim_special_event04                = 2804,
    anim_campaingerCrumble              = 2805,
    anim_longHunterTaunt                = 2808,
    anim_player_acquire_key             = 2810,
    anim_player_jump                    = 2815,
    anim_player_panic                   = 2816,
    anim_player_idle                    = 2817,
    anim_player_exit                    = 2818,
    anim_player_run                     = 2819,
    anim_player_surface                 = 2820,
   
    anim_aiWounded                      = 2900,
    anim_aiTurn_L_Wound,
    anim_aiTurn_R_Wound,
    anim_aiTurn_B_Wound
}
SimplePortal 2.3.6 © 2008-2014, SimplePortal