the cutting room mirror

PerfectHead

This is a sub-page of Perfect Dark (Nintendo 64, Xbox 360).

PerfectHead was a feature which would allow players to import photos from a Game Boy Camera via the Nintendo 64 Transfer Pak and apply them to heads for use on guards in missions and characters in the Combat Simulator. A pre-existing head model would be used as a basis for the new head. A box could be resized to capture a face texture from a photo; the photo's brightness could be adjusted at the same time. The head model itself could be reshaped in eight directions, with an additional depth slider. It was also possible to change the head's coloration and hairstyle. A preview of the head could be seen during the entire process.

The official reason for PerfectHead being scrapped was "insurmountable technical problems" - while the feature was fully functional, it would cause crashes when actually using the heads during gameplay.

(Source: IGN - Perfect Dark Ditches Face Mapping)

The occurrence of the Columbine High School Massacre in the United States just a year prior to the game's release also played a part in the feature's removal.

(Source: Eurogamer - Perfect Dark: the oral history of an N64 classic)

Leftover Text#

While no remnants of the PerfectHead features or code are known to remain in the game, some dialogue related to it can be viewed by using GameShark code 8009EDF8 00?? (where "??" is a number between 00 and 10) when playing without an Expansion Pak.

As well, there's some leftover text in the file used for the Combat Simulator and CI Training menus, which can be used to recreate the menus.

PerfectHead

Load A Saved Head

Make A New Head

Edit A Loaded Head

Edit A PerfectHead

Choose slot to edit:

Cancel

Make A New Head

Load A Saved Head

Where do you want to be able

to use this head?

Combat Simulator

All Missions

Both

Cancel

Camera Setup

Insert your camera into your

Game Boy Pak.

Then, insert your Game Boy Pak

into any controller.

OK

Cancel

Error

Game Boy Camera Not Detected!

Please check all connections

and try again.

Cancel

Choose Camera

More than one camera detected.

Please select which camera you want to use

OK

Cancel

Load From Camera

Choose picture to read from camera:

Cancel

Take Picture

Shoot!

Cancel

Keep Picture

Try Again

Load PerfectHead

Insert the Controller Pak

containing the head you

wish to load into any

controller.

Controller Pak:

Cancel

Source:

Pak 1

Pak 2

Pak 3

Pak 4

PerfectHead Editor

Take Another Picture

Change Head

Position Picture

Color Face & Hair

Shape Head

Remove Head

Cancel Changes

Keep Changes

Shape Head

Depth

OK

Cancel

Position Image

Brightness

OK

Cancel

Choose Head

OK

Cancel

Remove PerfectHead

Are you sure you want to

remove this head from memory?

Delete

Cancel

Cancel Changes

Are you sure you want to

throw away your changes?

Throw Away

Go Back To Editor

Save PerfectHead

You have edited this head.

Do you want to keep your changes?

Keep

Revert

Save PerfectHead

Your changes will be kept in memory.

Would you like to save your changes

to the Controller Pak?

Save

Don't Save

Save PerfectHead

You can now save your head on to

a Controller Pak if you wish.

If you want to do this, please

ensure a Controller Pak is inserted

and choose "Save".

Save

Don't Save

Head Complete!

To use your head in the combat simulator,

select the head from the character menu

of the player/simulant settings menu.

Your Mission heads will now appear

in any of the missions you play.

You can now edit your head further if you wish.

Finish

Edit Head

Head Color

Face:

Hairstyle:

OK

Cancel

Style 1

Style 2

Style 3

Style 4

Blonde

Black

Auburn

Blue Rinse

Searching for Camera!

Calibrating Camera

Downloading Image

Loading Image

Saving Image

Transfering Image

Uploading Segment

Checking Controller Pak

Getting PerfectHead

Saving PerfectHead

Auto Camera Adjustment

(Source: GameShark code and scans)

Development Text#

803D2368    IG:) style %d gbHead:%d

803D3A10    Pak %d -> Pak_AddOneCameraFile
803D3A30    Pak %d -> Pak_AddOneCameraFile - Making one default camera file
803D3A74    Pak %d -> Pak_AddOneCameraFile : Got Space - No need for resize
803D3AB8    Pak %d -> Pak_AddOneCameraFile : No Space -Need to resize by %d pages
803D3B00    Pak %d -> Pak_AddOneCameraFile - Make of one default camera files failed
803D3B4C    Pak %d -> Pak_AddOneCameraFile : Error - No Room

803D6230    RWI : Cam Alloc : Guid=%d -> Total = %u (%d at %s)
    camdraw.c
    Cam -> Dumping head vertex colour information
    Cam -> Face Col - Pal=%d, Entry=%d, Col=%08x
    Cam -> Hair Col - Pal=%d, Entry=%d, Col=%08x
    Cam_Tick (%d Total Slots)
    Current Camera Slot = %d
    Slot %d -> Active = %d
    camdraw.c
    CAM : Cam_StartCamFileRead - Go
    ************ Cam_ActivateAndClearSlot ************ : Slot=%d
    camdraw.c
    camdraw.c
    camdraw.c
    camdraw.c
    camdraw.c
    camdraw.c
    camdraw.c
    Cam_CopyEditorToUndo
    camdraw.c
    Cam_CopyEditor
    camdraw.c
    camdraw.c
    camdraw.c
    camdraw.c
    Cam -> Setting current hair colour to %s
    Cam -> Setting current face colour to %s
    camdraw.c
    Cam_SetAutoDeArtefact -> State = %d
    camdraw.c
    Cam_ClearCameraLoadBuffer -> Camera=%d
    Cam_StartTemp : Need %u bytes for temp cam images buffer
    camdraw.c
    camdraw.c
    camdraw.c
    camdraw.c
    camdraw.c
    Camera -> Cam_Start for Camera %d
    Camera -> Cam_Stop
    Camera -> Cam_Finish - Done
    Camera ->Created a new slot - Id=%d
    Camera -> CD_DeleteSlot - Dumping slot %d
    kg
    Kp
    Ki
    Kd
    tInt
    gocal
    aim CAM : Cam_MakeTextures
    camdraw.c
    pD->ReadMode = %s
    Camera -> Getting Header Info
    Camera -> Item=%d, pD->CamHeader[i]=%d
    Camera -> Found %d Valid images
    Camera -> Item=%d, Valid=%s, Bank=%d
    YES
    NO
    CD_TransferCurrentCacheToEditorAndExit : Player=%d
    Camera -> CD_CycleHandleRead - Need to load up the camera header
    Camera -> CD_CycleHandleRead - Image %d needs loading for editor coppying on menu exit
    Camera -> CD_CycleHandleRead - Error ekCamReadModeExit2 in Null cycle
    CAMERA : COPY SLOT (%d of %s): Slot %d(%s) -> Slot %d(%s)
    ACTIVE 
    NULL
    ACTIVE
    NULL
    RWI : Warning -> Not copying the thumnail texture
    CD_DrawTexture : pTex=%x
    Cam -> WARNING - Not done intensity table recalc :- No samples within treshold
    Camera -> Call to reset auto calibrate
    AC -> ekCamAutoCalStatusReset - pD->tTime = %d, pD->tTimeNxAdd = %d
    Cam 0 -> Time = %d, Target = %d, tInt = %.2f
    Cam 0 -> Too Low -> Adding Time
    Cam 0 -> Too High -> Subbing Time
    Cam -> ekCamAutoCalStatusSettingTime - New time = %d
    %s%sAC -> Gain = %d, Target = %.2f, Int = %.2f
    Auto Calibrate is removing the menu message
    Auto Calibrate is shutting down
    Cam -> Cam_BalanceSlot %d -> tZroShift = %d
    Cam_BuildFaceTexture (slot=%d): %d of %s
    camdraw.c
    camdraw.c
    Cam %d -< Balance : No Data Available
    camdraw.c
    Cam_SetSquashZ : %u, %u, %f
    camdraw.c
    Cam : Alloc for copy of Vtx %d bytes
    CAM : Cam_AllocAndCopyAllVtx -> Ptr all-ready allocted - No extra needed
    camdraw.c
    Cam_RebuildHead : Slot=%d
    Cam -> Cam_ColourHeadOnePart - Remapping %s
    Cam_ColourHead : Face Col = %u, Hair Col = %u
    FACE
    SIDE
    HAIR
    Cam -> Cam_SquashOnePart - pExtents=%08x, pVcopy=%08x, 
    Cam -> Cam_SquashOnePart - Head centre at (%d,%d,%d)
    Cam -> Cam_Scale Param 1 = %s%s.3f
    Cam -> Cam_Scale Param 2 = %s%s.3f
    Cam -> Cam_Scale Param 3 = %s%s.3f
    Cam -> Cam_Scale Param 4 = %s%s.3f
    Cam -> Cam_Scale Param 5 = %s%s.3f
    Cam -> Cam_Scale Param 6 = %s%s.3f
    Cam -> Cam_Scale Param 7 = %s%s.3f
    Cam_DctInitialise_Read -> %x
    Cam_DctUnCompressSlot -> %x
    Cam_LoadFromPakIntoSlot -> Pak=%d, fileGuid=%u, pakGuid=%u, Slot=%d, pS=%x, pE=%x
    camdraw.c
    camdraw.c
    Cam -> Compressing Editor Slot
    Cam -> Trying image compression at quality %u
    Cam -> Failed - Too big - This=%u, Max=%d
    Cam -> Trying lower quality setting
    Cam -> Save Failed - Cant get it small enough - oo-er
    Cam -> Sucess at quality %u - Size=%u, Max=%d
    Cam_SavedEditSlotToParamPakItem -> Save failed
    Camera Save Error Result: %d
803D715C    Magic Guid set to %d

803D7D38    Menu99 -> Calling Camera Module Start
803D7D60    Menu99 -> Calling Camera Module Finish

803D8BC8    GBHead: Call to create head for slot %d (gbheadobjs[slotno]=%x)