3634 lines
161 KiB
XML
Executable File
3634 lines
161 KiB
XML
Executable File
USING "commands_camera.sch"
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
USING "shared_debug.sch"
|
|
USING "globals.sch"
|
|
USING "commands_debug.sch"
|
|
#ENDIF
|
|
|
|
CONST_INT MAX_NUM_SWITCH_NODES 20
|
|
CONST_INT NUM_SWITCH_ENTITIES 2
|
|
|
|
ENUM SWITCH_CAM_TYPE
|
|
SWITCH_CAM_OLD_SYSTEM = 0,
|
|
SWITCH_ENTITY_ATTACHED_CAM,
|
|
SWITCH_CAM_GAMEPLAY_CAM_COPY,
|
|
SWITCH_CAM_WORLD_POS,
|
|
SWITCH_CAM_WORLD_POS_W_LOOK_AT,
|
|
SWITCH_CAM_PATH_RELATIVE,
|
|
SWITCH_CAM_PATH_RELATIVE_ATTACHED,
|
|
SWITCH_CAM_PATH_RELATIVE_PED_TO_WORLD_COORD,
|
|
SWITCH_CAM_CLONE_NODE_WITH_OFFSET
|
|
// SWITCH_CAM_ENTITY_ATTACHED_W_WORLD_LOOK_AT
|
|
ENDENUM
|
|
|
|
ENUM SWITCH_CAM_POST_FX_TYPE
|
|
NO_EFFECT = 0,
|
|
SEPIA_EFFECT = 1,
|
|
SCANLINE_EFFECT = 2,
|
|
APFX_SWITCH_HUD_IN = 3
|
|
ENDENUM
|
|
|
|
ENUM SWITCH_CAM_FLASH_EFFECT
|
|
SCFE_CODE_FLASH,
|
|
SCFE_DefaultFlash,
|
|
SCFE_FocusOut,
|
|
SCFE_MinigameEndNeutral,
|
|
SCFE_MinigameTransitionOut,
|
|
SCFE_PauseMenuOut,
|
|
SCFE_SwitchShortNeutralIn,
|
|
SCFE_SwitchShortNeutralMid,
|
|
SCFE_SwitchShortMichaelMid,
|
|
SCFE_SwitchShortMichaelIn,
|
|
SCFE_SwitchSceneMichael,
|
|
SCFE_SwitchShortTrevorMid,
|
|
SCFE_SwitchShortFranklinIn,
|
|
|
|
SCFE_SwitchShortFranklinMid,
|
|
SCFE_SwitchShortTrevorIn,
|
|
SCFE_SwitchOpenFranklinOut,
|
|
SCFE_SwitchOpenMichaelIn,
|
|
SCFE_SwitchOpenMichaelOut,
|
|
SCFE_SwitchOpenTrevorIn,
|
|
SCFE_SwitchOpenTrevorOut,
|
|
SCFE_SwitchSceneFranklin,
|
|
SCFE_SwitchSceneTrevor
|
|
ENDENUM
|
|
|
|
ENUM SWITCH_CAM_SHAKE_TYPE
|
|
CAM_SHAKE_DEFAULT = 0,
|
|
CAM_SHAKE_LIGHT,
|
|
CAM_SHAKE_MEDIUM,
|
|
CAM_SHAKE_HEAVY
|
|
ENDENUM
|
|
|
|
STRUCT SWITCH_CAM_NODE_DOF
|
|
FLOAT fDOF_NearDOF
|
|
FLOAT fDOF_FarDOF
|
|
FLOAT fDOF_EffectStrength
|
|
ENDSTRUCT
|
|
|
|
CONST_INT MAX_NUM_CAM_VELOCITY_OVERRIDES 16
|
|
STRUCT CAM_VELOCITY_OVERRIDE
|
|
|
|
FLOAT fStartPoint
|
|
FLOAT fSpeed = -1.0
|
|
|
|
ENDSTRUCT
|
|
|
|
CONST_INT MAX_NUM_CAM_BLUR_OVERRIDES 16
|
|
STRUCT CAM_BLUR_OVERRIDE
|
|
|
|
FLOAT fBlurOverrideStartPoint = 0.0
|
|
FLOAT fBlurOverrideBlurLevel = -1.0
|
|
|
|
ENDSTRUCT
|
|
|
|
STRUCT SWITCH_CAM_NODE
|
|
|
|
INT iNodeActiveFlag //used to show that this node is active
|
|
|
|
CAMERA_INDEX ciSwitchNode
|
|
|
|
|
|
SWITCH_CAM_TYPE SwitchCamType
|
|
INT iForceCamPointAtEntityIndex = -1
|
|
#IF IS_DEBUG_BUILD
|
|
INT iSwitchCamTypeDebugSelect = 0
|
|
#ENDIF
|
|
|
|
BOOL bIsGameplayCamCopy
|
|
|
|
INT iNodeTime
|
|
VECTOR vNodePos
|
|
VECTOR vNodeDir
|
|
FLOAT fNodeOffsetDist
|
|
VECTOR vWorldPosLookAt
|
|
FLOAT fNodeVerticleOffset //[MF] To allow for height adjustment in SWITCH_CAM_PATH_RELATIVE_PED_TO_WORLD_COORD nodes
|
|
BOOL bAttachToOriginPed //[MF] Only used by SWITCH_CAM_PATH_RELATIVE_PED_TO_WORLD_COORD
|
|
BOOL bPointAtEntity
|
|
BOOL bPointAtOffsetIsRelative
|
|
BOOL bAttachOffsetIsRelative
|
|
FLOAT fNodeFOV
|
|
FLOAT fNodeMotionBlur
|
|
FLOAT fNodeCamShake
|
|
VECTOR vClonedNodeOffset //[MF] Offset to use in the SWITCH_CAM_CLONE_NODE_WITH_OFFSET type
|
|
INT iNodeToClone //[MF] Indicate which Node SWITCH_CAM_CLONE_NODE_WITH_OFFSET type is to clone from
|
|
|
|
INT iCamEaseType
|
|
FLOAT fCamEaseScaler
|
|
BOOL bCamEaseForceLinear
|
|
BOOL bCamEaseForceLevel
|
|
FLOAT fCamNodeVelocityScale
|
|
|
|
FLOAT fTimeScale = 1.0
|
|
INT iTimeScaleEaseType
|
|
FLOAT fTimeScaleEaseScaler
|
|
|
|
BOOL bFlashEnabled
|
|
SWITCH_CAM_FLASH_EFFECT SCFE_FlashEffectUsed
|
|
#IF IS_DEBUG_BUILD
|
|
INT iFlashEffectUsed_WidgetValue
|
|
#ENDIF
|
|
FLOAT fFlashNodePhaseOffset
|
|
FLOAT fMinExposure
|
|
FLOAT fMaxExposure
|
|
INT iRampUpDuration
|
|
INT iRampDownDuration
|
|
INT iHoldDuration
|
|
BOOL bHasFlashed
|
|
|
|
BOOL bIsLowDetailNode
|
|
|
|
BOOL bUseCustomDOF
|
|
SWITCH_CAM_NODE_DOF NodeDOF_Info
|
|
|
|
SWITCH_CAM_POST_FX_TYPE NodeTimePostFX_Type
|
|
#IF IS_DEBUG_BUILD
|
|
INT iNodeTimePostFX_WidgetValue
|
|
#ENDIF
|
|
FLOAT fNodeTimePostFXBlendTime
|
|
FLOAT fNodeTimePostFXTimeOffset
|
|
|
|
SWITCH_CAM_SHAKE_TYPE NodeCamShakeType
|
|
#IF IS_DEBUG_BUILD
|
|
INT iNodeCamShakeType_WidgetValue
|
|
#ENDIF
|
|
|
|
BOOL bIsCamCutNode
|
|
BOOL bHaveNodeSettingsBeenApplied
|
|
BOOL bHaveNodePostFX_BeenApplied
|
|
|
|
ENDSTRUCT
|
|
|
|
STRUCT SWITCH_CAM_STRUCT
|
|
|
|
BOOL bInitialized
|
|
|
|
CAMERA_INDEX ciSpline
|
|
BOOL bSplineNoSmoothing
|
|
BOOL bAddGameplayCamAsLastNode
|
|
|
|
VEHICLE_INDEX viVehicles[NUM_SWITCH_ENTITIES]
|
|
PED_INDEX piPeds[NUM_SWITCH_ENTITIES]
|
|
|
|
SWITCH_CAM_NODE nodes[MAX_NUM_SWITCH_NODES]
|
|
|
|
CAM_VELOCITY_OVERRIDE camVelocityOverrides[MAX_NUM_CAM_VELOCITY_OVERRIDES]
|
|
CAM_BLUR_OVERRIDE camBlurOverrides[MAX_NUM_CAM_BLUR_OVERRIDES]
|
|
|
|
INT iNumNodes
|
|
INT iCamSwitchFocusNode //Tell where the Cam is to switch Focus
|
|
INT iGameplayNodeBlendDuration
|
|
|
|
STRING strOutputFileName
|
|
STRING strOutputStructName
|
|
|
|
BOOL bSaveTextFile
|
|
BOOL bSaveXMLFile
|
|
BOOL bLoadXMLFile
|
|
STRING strXMLFileName
|
|
STRING strCamTarget1WidgetLabel
|
|
STRING strCamTarget2WidgetLabel
|
|
|
|
BOOL bForceDebugWidgetRecreate
|
|
|
|
BOOL bRecreateSpline
|
|
BOOL bGameplayCamDebug
|
|
|
|
BOOL bTimePostFXActive
|
|
|
|
BOOL bIsSplineCamFinishedPlaying
|
|
|
|
//Audio Variables
|
|
FLOAT fSwitchSoundAudioStartPhase = -1.0
|
|
FLOAT fSwitchSoundAudioEndPhase = -1.0
|
|
BOOL bSwitchSoundPlayOpeningPulse = TRUE
|
|
BOOL bSwitchSoundPlayMoveLoop = TRUE
|
|
BOOL bSwitchSoundPlayExitPulse = TRUE
|
|
INT iSwitchAudioCameraHitInID = -1
|
|
INT iSwitchAudioCameraMoveLoopID = -1
|
|
INT iSwitchAudioCameraHitOutID = -1
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
WIDGET_GROUP_ID wgidParent
|
|
WIDGET_GROUP_ID wgidWidgets
|
|
BOOL bDEBUGSplineCam_DisableVelocityOverride
|
|
BOOL bIsApproved
|
|
BOOL bIsApprovedTextDisplayed
|
|
FLOAT fSplineCamPhase
|
|
#ENDIF
|
|
|
|
ENDSTRUCT
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SWITCH_CAM_NODE scnDefaultValues //[MF] This switch cam node instance is only used to compare outputed node values against a default. (WRITE_SPLINE_CAM_DATA_TO_FILE() )
|
|
#ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
PROC CREATE_SPLINE_CAM_VELOCITY_OVERRIDE_WIDGET(SWITCH_CAM_STRUCT &thisSwitchCam, INT i)
|
|
|
|
TEXT_LABEL_63 txtWidgetLabel
|
|
txtWidgetLabel = "Velocity Override - "
|
|
txtWidgetLabel += i
|
|
|
|
START_WIDGET_GROUP(txtWidgetLabel)
|
|
ADD_WIDGET_FLOAT_SLIDER("Vel Override Start", thisSwitchCam.camVelocityOverrides[i].fStartPoint, 0.0, TO_FLOAT(thisSwitchCam.iNumNodes), 0.2)
|
|
ADD_WIDGET_FLOAT_SLIDER("Speed", thisSwitchCam.camVelocityOverrides[i].fSpeed, -1.0, 100.0, 1.0)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC CREATE_SPLINE_CAM_BLUR_OVERRIDE_WIDGET(SWITCH_CAM_STRUCT &thisSwitchCam, INT i)
|
|
|
|
TEXT_LABEL_63 txtWidgetLabel
|
|
txtWidgetLabel = "Blur Override - "
|
|
txtWidgetLabel += i
|
|
|
|
START_WIDGET_GROUP(txtWidgetLabel)
|
|
ADD_WIDGET_FLOAT_SLIDER("Blur Override Start", thisSwitchCam.camBlurOverrides[i].fBlurOverrideStartPoint, 0.0, TO_FLOAT(thisSwitchCam.iNumNodes), 0.2)
|
|
ADD_WIDGET_FLOAT_SLIDER("Blur Level", thisSwitchCam.camBlurOverrides[i].fBlurOverrideBlurLevel, -1.0, 1.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create a widget combo box for the diffrent types of time scale interpolation
|
|
/// PARAMS:
|
|
/// i - int for widget combo selection
|
|
PROC CREATE_SPLINE_CAM_TIME_EASE_COMBO(INT &i)
|
|
//CDEBUG3LN(DEBUG_MISSION, "CREATE_SPLINE_CAM_TIME_EASE_COMBO")
|
|
|
|
START_NEW_WIDGET_COMBO()
|
|
ADD_TO_WIDGET_COMBO("Normal (Staight Interp) - 0")
|
|
ADD_TO_WIDGET_COMBO("Slow In - 1")
|
|
ADD_TO_WIDGET_COMBO("Slow Out - 2")
|
|
ADD_TO_WIDGET_COMBO("Slow In Out - 3")
|
|
STOP_WIDGET_COMBO("Time Ease Type", i)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create a widget combo box for the different types of Spline Camera Eases
|
|
/// PARAMS:
|
|
/// i - int for the widget combo selection
|
|
PROC CREATE_SPLINE_CAMERA_EASE_COMBO(INT &i)
|
|
//CDEBUG3LN(DEBUG_MISSION, "CREATE_SPLINE_CAMERA_EASE_COMBO")
|
|
|
|
START_NEW_WIDGET_COMBO()
|
|
ADD_TO_WIDGET_COMBO("Normal (Staight Interp) - 0")
|
|
ADD_TO_WIDGET_COMBO("Slow In - 1")
|
|
ADD_TO_WIDGET_COMBO("Slow Out - 2")
|
|
ADD_TO_WIDGET_COMBO("Slow In Out - 3")
|
|
STOP_WIDGET_COMBO("Camera Ease Type", i)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create a widget group to control camera node Depth Of Field
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct that the depth of field widget will be created for
|
|
/// iNodeIndex - Spline node to create the depth of field widget for
|
|
PROC CREATE_SPLINE_CAM_DOF_WIDGET_GROUP(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Camera DOF Settings")
|
|
ADD_WIDGET_BOOL("Use Custom DOF For this Cam", thisSwitchCam.nodes[iNodeIndex].bUseCustomDOF)
|
|
ADD_WIDGET_FLOAT_SLIDER("Near DOF (m)", thisSwitchCam.nodes[iNodeIndex].NodeDOF_Info.fDOF_NearDOF, 0.0, 10.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Far DOF (m)", thisSwitchCam.nodes[iNodeIndex].NodeDOF_Info.fDOF_FarDOF, 0.0, 1000.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("DOF Effect Strength", thisSwitchCam.nodes[iNodeIndex].NodeDOF_Info.fDOF_EffectStrength, 0.0, 1.0, 0.01)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create a drop down-widget for selecting a camera POST-FX Type
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct that the Post FX Drop Down Widget will be created for
|
|
/// iNodeIndex - Spline node to create the depth of field widget for
|
|
PROC CREATE_SPLINE_CAM_POST_FX_WIDGET(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Post FX Tuning")
|
|
START_NEW_WIDGET_COMBO()
|
|
ADD_TO_WIDGET_COMBO("None")
|
|
ADD_TO_WIDGET_COMBO("TOD Sepia")
|
|
ADD_TO_WIDGET_COMBO("TOD Scan Line")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch HUD In")
|
|
STOP_WIDGET_COMBO("Post FX Type", thisSwitchCam.nodes[iNodeIndex].iNodeTimePostFX_WidgetValue)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("Post FX Blend Time(secs)", thisSwitchCam.nodes[iNodeIndex].fNodeTimePostFXBlendTime, 0, 5.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Post FX Node Time Offset(phase)", thisSwitchCam.nodes[iNodeIndex].fNodeTimePostFXTimeOffset, 0, 1.0, 0.1)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
thisSwitchCam.nodes[iNodeIndex].iNodeTimePostFX_WidgetValue = ENUM_TO_INT(thisSwitchCam.nodes[iNodeIndex].NodeTimePostFX_Type)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create a widget to control camera shake
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch Cam struct to control the node shake on
|
|
/// iNodeIndex - Node of switch cam struct to apply shake to
|
|
PROC CREATE_SPLINE_CAM_SHAKE_WIDGET(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Cam Shake")
|
|
START_NEW_WIDGET_COMBO()
|
|
ADD_TO_WIDGET_COMBO("Default Shake")
|
|
ADD_TO_WIDGET_COMBO("Light Animated Shake")
|
|
ADD_TO_WIDGET_COMBO("Medium Animated Shake")
|
|
ADD_TO_WIDGET_COMBO("Heavy Animated Shake")
|
|
STOP_WIDGET_COMBO("Cam Shake Type", thisSwitchCam.nodes[iNodeIndex].iNodeCamShakeType_WidgetValue)
|
|
ADD_WIDGET_FLOAT_SLIDER("Cam Shake", thisSwitchCam.nodes[iNodeIndex].fNodeCamShake, 0.0, 10.0, 0.01)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
thisSwitchCam.nodes[iNodeIndex].iNodeCamShakeType_WidgetValue = ENUM_TO_INT(thisSwitchCam.nodes[iNodeIndex].NodeCamShakeType)
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC CREATE_SPLINE_CAM_FLASH_WIDGET(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Cam Flash")
|
|
ADD_WIDGET_BOOL("Enable Flash", thisSwitchCam.nodes[iNodeIndex].bFlashEnabled)
|
|
|
|
START_NEW_WIDGET_COMBO()
|
|
ADD_TO_WIDGET_COMBO("Standard Code Flash")
|
|
ADD_TO_WIDGET_COMBO("APFX Default Flash")
|
|
ADD_TO_WIDGET_COMBO("APFX Focus Out")
|
|
ADD_TO_WIDGET_COMBO("APFX Minigame End Neutral")
|
|
ADD_TO_WIDGET_COMBO("APFX Minigame Transition Out")
|
|
ADD_TO_WIDGET_COMBO("APFX Pause Menu Out")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Short Neutral In")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Short Neutral Mid")
|
|
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Short Michael Mid")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Short Michael In")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Scene Michael")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Short Trevor Mid")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Short Franklin In")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Short Franklin Mid")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Short Trevor In")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Open Franklin Out")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Open Michael In")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Open Michael Out")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Open Trevor In")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Open Trevor Out")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Scene Franklin")
|
|
ADD_TO_WIDGET_COMBO("APFX Switch Scene Trevor")
|
|
|
|
STOP_WIDGET_COMBO("Flash Type", thisSwitchCam.nodes[iNodeIndex].iFlashEffectUsed_WidgetValue)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("Start Time (Phase)", thisSwitchCam.nodes[iNodeIndex].fFlashNodePhaseOffset, 0, 1.0, 0.1)
|
|
START_WIDGET_GROUP("Code Flash Tuning Values")
|
|
ADD_WIDGET_FLOAT_SLIDER("Min Exposure", thisSwitchCam.nodes[iNodeIndex].fMinExposure, 0.0, 200.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("Max Exposure", thisSwitchCam.nodes[iNodeIndex].fMaxExposure, 0.0, 200.0, 1.0)
|
|
ADD_WIDGET_INT_SLIDER("Ramp Up Duration", thisSwitchCam.nodes[iNodeIndex].iRampUpDuration, 0, 20000, 1)
|
|
ADD_WIDGET_INT_SLIDER("Ramp Down Duration", thisSwitchCam.nodes[iNodeIndex].iRampDownDuration, 0, 20000, 1)
|
|
ADD_WIDGET_INT_SLIDER("Hold Duration", thisSwitchCam.nodes[iNodeIndex].iHoldDuration, 0, 20000, 1)
|
|
STOP_WIDGET_GROUP()
|
|
STOP_WIDGET_GROUP()
|
|
|
|
thisSwitchCam.nodes[iNodeIndex].iFlashEffectUsed_WidgetValue = ENUM_TO_INT(thisSwitchCam.nodes[iNodeIndex].SCFE_FlashEffectUsed)
|
|
|
|
ENDPROC
|
|
|
|
PROC CREATE_SPLINE_CAM_EASE_WIDGET(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Camera Ease")
|
|
CREATE_SPLINE_CAMERA_EASE_COMBO(thisSwitchCam.nodes[iNodeIndex].iCamEaseType)
|
|
ADD_WIDGET_FLOAT_SLIDER("Camera Ease Scale", thisSwitchCam.nodes[iNodeIndex].fCamEaseScaler, -1.0, 1.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Node Velocity Scale", thisSwitchCam.nodes[iNodeIndex].fCamNodeVelocityScale, -1.0, 1.0, 0.1)
|
|
ADD_WIDGET_BOOL("Force Linear", thisSwitchCam.nodes[iNodeIndex].bCamEaseForceLinear)
|
|
ADD_WIDGET_BOOL("Force Level", thisSwitchCam.nodes[iNodeIndex].bCamEaseForceLevel)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
/// PURPOSE:
|
|
/// Write a vector to a debug text file
|
|
/// PARAMS:
|
|
/// paramCoords - vector to write
|
|
/// sPath - directory path to the file to be saved
|
|
/// strFileName - the name of the debug file
|
|
PROC WRITE_VECTOR_TO_NAMED_FILE(VECTOR paramCoords, String sPath, String strFileName)
|
|
//CDEBUG3LN(DEBUG_MISSION, "WRITE_VECTOR_TO_NAMED_FILE")
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("<<", sPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(paramCoords.x, sPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(", ", sPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(paramCoords.y, sPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(", ", sPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(paramCoords.z, sPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(">>", sPath, strFileName)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// write a bool to a debug text file. It will write out "TRUE" or "FALSE"
|
|
/// PARAMS:
|
|
/// bWrite - bool to write out
|
|
/// sPath - directory path to the file to be saved
|
|
/// strFileName - the name of the debug file
|
|
PROC WRITE_BOOL_TO_NAMED_FILE(BOOL bWrite, String sPath, String strFileName)
|
|
//CDEBUG3LN(DEBUG_MISSION, "WRITE_BOOL_TO_NAMED_FILE")
|
|
|
|
IF bWrite
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("TRUE", sPath, strFileName)
|
|
ELSE
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("FALSE", sPath, strFileName)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
#ENDIF
|
|
|
|
FUNC VECTOR CONVERT_EULER_TO_DIRECTION_VECTOR(VECTOR vEuler)
|
|
//CDEBUG3LN(DEBUG_MISSION, "CONVERT_EULER_TO_DIRECTION_VECTOR")
|
|
|
|
// Euler angles assumed to be in YXZ order
|
|
VECTOR vResult
|
|
//b.Set(-cx*sz, cx*cz, sx);
|
|
vResult.x = Cos(vEuler.x)
|
|
vResult.y = Cos(vEuler.z)
|
|
vResult.z = Sin(vEuler.x)
|
|
vResult.y *= vResult.x
|
|
vResult.x *= -Sin(vEuler.z)
|
|
|
|
RETURN vResult
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Get the current entity the switch cam is focused on.
|
|
/// PARAMS:
|
|
/// iCamIndex -
|
|
/// thisSwitchCamStruct -
|
|
/// iDEBUGFocusEntitySwitchOverride -
|
|
/// RETURNS:
|
|
///
|
|
FUNC ENTITY_INDEX GET_SWITCH_CAM_FOCUS_ENTITY(SWITCH_CAM_STRUCT &thisSwitchCamStruct, INT iCamIndex, INT iDEBUGFocusEntitySwitchOverride = -1)
|
|
//CDEBUG3LN(DEBUG_MISSION, "GET_SWITCH_CAM_FOCUS_PED")
|
|
|
|
IF iDEBUGFocusEntitySwitchOverride != -1
|
|
iCamIndex = iDEBUGFocusEntitySwitchOverride
|
|
ENDIF
|
|
|
|
IF iCamIndex < thisSwitchCamStruct.iCamSwitchFocusNode
|
|
OR (thisSwitchCamStruct.iCamSwitchFocusNode = 0 and iDEBUGFocusEntitySwitchOverride = -1)
|
|
IF DOES_ENTITY_EXIST(thisSwitchCamStruct.piPeds[0])
|
|
RETURN GET_ENTITY_FROM_PED_OR_VEHICLE(thisSwitchCamStruct.piPeds[0])
|
|
ELIF DOES_ENTITY_EXIST(thisSwitchCamStruct.viVehicles[0])
|
|
RETURN GET_ENTITY_FROM_PED_OR_VEHICLE(thisSwitchCamStruct.viVehicles[0])
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(thisSwitchCamStruct.piPeds[1])
|
|
RETURN GET_ENTITY_FROM_PED_OR_VEHICLE(thisSwitchCamStruct.piPeds[1])
|
|
ELIF DOES_ENTITY_EXIST(thisSwitchCamStruct.viVehicles[1])
|
|
RETURN GET_ENTITY_FROM_PED_OR_VEHICLE(thisSwitchCamStruct.viVehicles[1])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN NULL
|
|
|
|
ENDFUNC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
BOOL bStopOnNode = TRUE
|
|
INT iActiveNode = 0
|
|
VECTOR vNodeDirection
|
|
#ENDIF
|
|
|
|
/// PURPOSE:
|
|
/// Check if a node is flagged as a jump-cut node
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to check for the jump cut node
|
|
/// iNode - Node to check
|
|
/// RETURNS:
|
|
/// TRUE if the node is a jump-cut node. FALSE otherwise.
|
|
FUNC BOOL IS_NODE_JUMP_CUT(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNode)
|
|
//CDEBUG3LN(DEBUG_MISSION, "IS_NODE_JUMP_CUT")
|
|
|
|
IF iNode > 0
|
|
AND iNode < (thisSwitchCam.iNumNodes - 1)
|
|
IF thisSwitchCam.nodes[iNode].bIsCamCutNode
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Reduce the gameplay graphic detail and budget to improve streaming.
|
|
/// PARAMS:
|
|
/// bRenderHDOnly - Render only High Detail geo (eg, detail closest to camera)
|
|
/// iPedPopulationBudget - Set the available ped population (0 = none, 3 = full)
|
|
/// iVehiclePopulationBudget - Set available vehcile population (0 = none, 3 = full)
|
|
/// bReducePedModelBudget - Reduce the memory dedicated to ped model budget
|
|
/// bReduceVehicleModelBudget - Reduce the memory dedicated to vehicle model budget
|
|
PROC SET_TO_LOW_DETAIL_RENDERING(INT iPedPopulationBudget = 0, INT iVehiclePopulationBudget = 0, BOOL bReducePedModelBudget = TRUE, BOOL bReduceVehicleModelBudget = TRUE)
|
|
|
|
CDEBUG3LN(DEBUG_MISSION, "SET_TO_LOW_DETAIL_RENDERING")
|
|
SET_PED_POPULATION_BUDGET(iPedPopulationBudget)
|
|
SET_VEHICLE_POPULATION_BUDGET(iVehiclePopulationBudget)
|
|
SET_REDUCE_PED_MODEL_BUDGET(bReducePedModelBudget)
|
|
SET_REDUCE_VEHICLE_MODEL_BUDGET(bReduceVehicleModelBudget)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Restore the graphic detail and budget to gameplay default.
|
|
/// PARAMS:
|
|
/// bRenderHDOnly - Render only High Detail geo (eg, detail closest to camera)
|
|
/// iPedPopulationBudget - Set the available ped population (0 = none, 3 = full)
|
|
/// iVehiclePopulationBudget - Set available vehcile population (0 = none, 3 = full)
|
|
/// bReducePedModelBudget - Reduce the memory dedicated to ped model budget
|
|
/// bReduceVehicleModelBudget - Reduce the memory dedicated to vehicle model budget
|
|
PROC SET_TO_DEFAULT_DETAIL_RENDERING(INT iPedPopulationBudget = 3, INT iVehiclePopulationBudget = 3, BOOL bReducePedModelBudget = FALSE, BOOL bReduceVehicleModelBudget = FALSE)
|
|
// CDEBUG3LN(DEBUG_MISSION, "SET_TO_DEFAULT_DETAIL_RENDERING")
|
|
|
|
SET_PED_POPULATION_BUDGET(iPedPopulationBudget)
|
|
SET_VEHICLE_POPULATION_BUDGET(iVehiclePopulationBudget)
|
|
SET_REDUCE_PED_MODEL_BUDGET(bReducePedModelBudget)
|
|
SET_REDUCE_VEHICLE_MODEL_BUDGET(bReduceVehicleModelBudget)
|
|
|
|
ENDPROC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
/// PURPOSE:
|
|
/// Save the data in a switch cam struct to a .txt file that will have the proper script formatting.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to save the data of.
|
|
PROC WRITE_SPLINE_CAM_DATA_TO_FILE(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
CDEBUG3LN(DEBUG_MISSION, "WRITE_SPLINE_CAM_DATA_TO_FILE")
|
|
|
|
STRING strFileName = thisSwitchCam.strOutputFileName
|
|
STRING strPath = ""
|
|
|
|
CLEAR_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
OPEN_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("//--- Start of Cam Data ---", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
INT index
|
|
REPEAT thisSwitchCam.iNumNodes index
|
|
|
|
IF NOT IS_NODE_JUMP_CUT(thisSwitchCam, index)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
IF thisSwitchCam.nodes[index].SwitchCamType != scnDefaultValues.SwitchCamType
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].SwitchCamType = ", strPath, strFileName)
|
|
SWITCH thisSwitchCam.nodes[index].SwitchCamType
|
|
CASE SWITCH_CAM_OLD_SYSTEM
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SWITCH_CAM_OLD_SYSTEM", strPath, strFileName)
|
|
BREAK
|
|
CASE SWITCH_ENTITY_ATTACHED_CAM
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SWITCH_ENTITY_ATTACHED_CAM", strPath, strFileName)
|
|
BREAK
|
|
CASE SWITCH_CAM_GAMEPLAY_CAM_COPY
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SWITCH_CAM_GAMEPLAY_CAM_COPY", strPath, strFileName)
|
|
BREAK
|
|
CASE SWITCH_CAM_WORLD_POS
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SWITCH_CAM_WORLD_POS", strPath, strFileName)
|
|
BREAK
|
|
CASE SWITCH_CAM_WORLD_POS_W_LOOK_AT
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SWITCH_CAM_WORLD_POS_W_LOOK_AT", strPath, strFileName)
|
|
BREAK
|
|
CASE SWITCH_CAM_PATH_RELATIVE
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SWITCH_CAM_PATH_RELATIVE", strPath, strFileName)
|
|
BREAK
|
|
CASE SWITCH_CAM_PATH_RELATIVE_ATTACHED
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SWITCH_CAM_PATH_RELATIVE_ATTACHED", strPath, strFileName)
|
|
BREAK
|
|
CASE SWITCH_CAM_PATH_RELATIVE_PED_TO_WORLD_COORD
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SWITCH_CAM_PATH_RELATIVE_PED_TO_WORLD_COORD", strPath, strFileName)
|
|
BREAK
|
|
CASE SWITCH_CAM_CLONE_NODE_WITH_OFFSET
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SWITCH_CAM_CLONE_NODE_WITH_OFFSET", strPath, strFileName)
|
|
BREAK
|
|
// CASE SWITCH_CAM_ENTITY_ATTACHED_W_WORLD_LOOK_AT
|
|
// SAVE_STRING_TO_NAMED_DEBUG_FILE("SWITCH_CAM_ENTITY_ATTACHED_W_WORLD_LOOK_AT", strPath, strFileName)
|
|
// BREAK
|
|
ENDSWITCH
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].iForceCamPointAtEntityIndex != scnDefaultValues.iForceCamPointAtEntityIndex
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].iForceCamPointAtEntityIndex = ", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].iForceCamPointAtEntityIndex , strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].bIsGameplayCamCopy != scnDefaultValues.bIsGameplayCamCopy
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].bIsGameplayCamCopy = ", strPath, strFileName)
|
|
SAVE_BOOL_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].bIsGameplayCamCopy, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].iNodeTime != scnDefaultValues.iNodeTime
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].iNodeTime = ", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].iNodeTime, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF NOT ARE_VECTORS_EQUAL(thisSwitchCam.nodes[index].vNodePos, scnDefaultValues.vNodePos)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].vNodePos = ", strPath, strFileName)
|
|
WRITE_VECTOR_TO_NAMED_FILE(thisSwitchCam.nodes[index].vNodePos, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF NOT ARE_VECTORS_EQUAL(thisSwitchCam.nodes[index].vWorldPosLookAt, scnDefaultValues.vWorldPosLookAt)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].vWorldPosLookAt = ", strPath, strFileName)
|
|
WRITE_VECTOR_TO_NAMED_FILE(thisSwitchCam.nodes[index].vWorldPosLookAt, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fNodeOffsetDist != scnDefaultValues.fNodeOffsetDist
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fNodeOffsetDist = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fNodeOffsetDist, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fNodeVerticleOffset != scnDefaultValues.fNodeVerticleOffset
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fNodeVerticleOffset = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fNodeVerticleOffset, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].bAttachToOriginPed != scnDefaultValues.bAttachToOriginPed
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].bAttachToOriginPed = ", strPath, strFileName)
|
|
SAVE_BOOL_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].bAttachToOriginPed, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF NOT ARE_VECTORS_EQUAL(thisSwitchCam.nodes[index].vNodeDir, scnDefaultValues.vNodeDir)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].vNodeDir = ", strPath, strFileName)
|
|
WRITE_VECTOR_TO_NAMED_FILE(thisSwitchCam.nodes[index].vNodeDir, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].bPointAtEntity != scnDefaultValues.bPointAtEntity
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].bPointAtEntity = ", strPath, strFileName)
|
|
SAVE_BOOL_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].bPointAtEntity, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].bPointAtOffsetIsRelative != scnDefaultValues.bPointAtOffsetIsRelative
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].bPointAtOffsetIsRelative = ", strPath, strFileName)
|
|
SAVE_BOOL_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].bPointAtOffsetIsRelative, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].bAttachOffsetIsRelative != scnDefaultValues.bAttachOffsetIsRelative
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].bAttachOffsetIsRelative = ", strPath, strFileName)
|
|
SAVE_BOOL_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].bAttachOffsetIsRelative, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fNodeFOV != scnDefaultValues.fNodeFOV
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fNodeFOV = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fNodeFOV, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF NOT ARE_VECTORS_EQUAL(thisSwitchCam.nodes[index].vClonedNodeOffset, scnDefaultValues.vClonedNodeOffset)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].vClonedNodeOffset = ", strPath, strFileName)
|
|
WRITE_VECTOR_TO_NAMED_FILE(thisSwitchCam.nodes[index].vClonedNodeOffset, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].iNodeToClone != scnDefaultValues.iNodeToClone
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].iNodeToClone = ", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].iNodeToClone, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].NodeTimePostFX_Type != scnDefaultValues.NodeTimePostFX_Type
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].NodeTimePostFX_Type = ", strPath, strFileName)
|
|
|
|
SWITCH thisSwitchCam.nodes[index].NodeTimePostFX_Type
|
|
CASE NO_EFFECT
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("NO_EFFECT", strPath, strFileName)
|
|
BREAK
|
|
CASE SEPIA_EFFECT
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SEPIA_EFFECT", strPath, strFileName)
|
|
BREAK
|
|
CASE SCANLINE_EFFECT
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCANLINE_EFFECT", strPath, strFileName)
|
|
BREAK
|
|
CASE APFX_SWITCH_HUD_IN
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("APFX_SWITCH_HUD_IN", strPath, strFileName)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fNodeTimePostFXBlendTime != scnDefaultValues.fNodeTimePostFXBlendTime
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fNodeTimePostFXBlendTime = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fNodeTimePostFXBlendTime, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fNodeTimePostFXTimeOffset != scnDefaultValues.fNodeTimePostFXTimeOffset
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fNodeTimePostFXTimeOffset = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fNodeTimePostFXTimeOffset, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fNodeMotionBlur != scnDefaultValues.fNodeMotionBlur
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fNodeMotionBlur = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fNodeMotionBlur, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].NodeCamShakeType != scnDefaultValues.NodeCamShakeType
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].NodeCamShakeType = ", strPath, strFileName)
|
|
SWITCH thisSwitchCam.nodes[index].NodeCamShakeType
|
|
CASE CAM_SHAKE_DEFAULT
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("CAM_SHAKE_DEFAULT", strPath, strFileName)
|
|
BREAK
|
|
CASE CAM_SHAKE_LIGHT
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("CAM_SHAKE_LIGHT", strPath, strFileName)
|
|
BREAK
|
|
CASE CAM_SHAKE_MEDIUM
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("CAM_SHAKE_MEDIUM", strPath, strFileName)
|
|
BREAK
|
|
CASE CAM_SHAKE_HEAVY
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("CAM_SHAKE_HEAVY", strPath, strFileName)
|
|
BREAK
|
|
ENDSWITCH
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fNodeCamShake != scnDefaultValues.fNodeCamShake
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fNodeCamShake = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fNodeCamShake, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].iCamEaseType != scnDefaultValues.iCamEaseType
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].iCamEaseType = ", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].iCamEaseType, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fCamEaseScaler != scnDefaultValues.fCamEaseScaler
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fCamEaseScaler = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fCamEaseScaler, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fCamNodeVelocityScale != scnDefaultValues.fCamNodeVelocityScale
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fCamNodeVelocityScale = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fCamNodeVelocityScale, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].bCamEaseForceLinear != scnDefaultValues.bCamEaseForceLinear
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].bCamEaseForceLinear = ", strPath, strFileName)
|
|
SAVE_BOOL_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].bCamEaseForceLinear, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].bCamEaseForceLevel != scnDefaultValues.bCamEaseForceLevel
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].bCamEaseForceLevel = ", strPath, strFileName)
|
|
SAVE_BOOL_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].bCamEaseForceLevel, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fTimeScale != scnDefaultValues.fTimeScale
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fTimeScale = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fTimeScale, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].iTimeScaleEaseType != scnDefaultValues.iTimeScaleEaseType
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].iTimeScaleEaseType = ", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].iTimeScaleEaseType, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fTimeScaleEaseScaler != scnDefaultValues.fTimeScaleEaseScaler
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fTimeScaleEaseScaler = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fTimeScaleEaseScaler, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].bFlashEnabled != scnDefaultValues.bFlashEnabled
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].bFlashEnabled = ", strPath, strFileName)
|
|
WRITE_BOOL_TO_NAMED_FILE(thisSwitchCam.nodes[index].bFlashEnabled, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].SCFE_FlashEffectUsed != scnDefaultValues.SCFE_FlashEffectUsed
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].SCFE_FlashEffectUsed = ", strPath, strFileName)
|
|
SWITCH thisSwitchCam.nodes[index].SCFE_FlashEffectUsed
|
|
CASE SCFE_CODE_FLASH
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_CODE_FLASH", strPath, strFileName)
|
|
BREAK
|
|
CASE SCFE_DefaultFlash
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_DefaultFlash", strPath, strFileName)
|
|
BREAK
|
|
CASE SCFE_FocusOut
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_FocusOut", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_MinigameEndNeutral
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_MinigameEndNeutral", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_MinigameTransitionOut
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_MinigameTransitionOut", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_PauseMenuOut
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_PauseMenuOut", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchShortNeutralIn
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchShortNeutralIn", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchShortNeutralMid
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchShortNeutralMid", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchShortMichaelMid
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchShortMichaelMid", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchShortMichaelIn
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchShortMichaelIn", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchSceneMichael
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchSceneMichael", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchShortTrevorMid
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchShortTrevorMid", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchShortFranklinIn
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchShortFranklinIn", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchShortFranklinMid
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchShortFranklinMid", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchShortTrevorIn
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchShortTrevorIn", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchOpenFranklinOut
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchOpenFranklinOut", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchOpenMichaelIn
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchOpenMichaelIn", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchOpenMichaelOut
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchOpenMichaelOut", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchOpenTrevorIn
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchOpenTrevorIn", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchOpenTrevorOut
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchOpenTrevorOut", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchSceneFranklin
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchSceneFranklin", strPath, strFileName)
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchSceneTrevor
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("SCFE_SwitchSceneTrevor", strPath, strFileName)
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fMinExposure != scnDefaultValues.fMinExposure
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fMinExposure = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fMinExposure, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fMaxExposure != scnDefaultValues.fMaxExposure
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fMaxExposure = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fMaxExposure, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].iRampUpDuration != scnDefaultValues.iRampUpDuration
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].iRampUpDuration = ", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].iRampUpDuration, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].iRampDownDuration != scnDefaultValues.iRampDownDuration
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].iRampDownDuration = ", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].iRampDownDuration, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].iHoldDuration != scnDefaultValues.iHoldDuration
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].iHoldDuration = ", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].iHoldDuration, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].fFlashNodePhaseOffset != scnDefaultValues.fFlashNodePhaseOffset
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fFlashNodePhaseOffset = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].fFlashNodePhaseOffset, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].bIsLowDetailNode != scnDefaultValues.bIsLowDetailNode
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].bIsLowDetailNode = ", strPath, strFileName)
|
|
WRITE_BOOL_TO_NAMED_FILE(thisSwitchCam.nodes[index].bIsLowDetailNode, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].bUseCustomDOF != scnDefaultValues.bUseCustomDOF
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].bUseCustomDOF = ", strPath, strFileName)
|
|
WRITE_BOOL_TO_NAMED_FILE(thisSwitchCam.nodes[index].bUseCustomDOF, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].NodeDOF_Info.fDOF_NearDOF != scnDefaultValues.NodeDOF_Info.fDOF_NearDOF
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].NodeDOF_Info.fDOF_NearDOF = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].NodeDOF_Info.fDOF_NearDOF, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].NodeDOF_Info.fDOF_FarDOF != scnDefaultValues.NodeDOF_Info.fDOF_FarDOF
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].NodeDOF_Info.fDOF_FarDOF = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].NodeDOF_Info.fDOF_FarDOF, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].NodeDOF_Info.fDOF_EffectStrength != scnDefaultValues.NodeDOF_Info.fDOF_EffectStrength
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].NodeDOF_Info.fDOF_EffectStrength = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].NodeDOF_Info.fDOF_EffectStrength, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
|
|
ELSE
|
|
|
|
// this allows the camera cut in between the nodes to be saved out
|
|
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".nodes[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].bIsCamCutNode = ", strPath, strFileName)
|
|
SAVE_BOOL_TO_NAMED_DEBUG_FILE(thisSwitchCam.nodes[index].bIsCamCutNode, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
ENDIF
|
|
|
|
ENDREPEAT
|
|
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
REPEAT MAX_NUM_CAM_VELOCITY_OVERRIDES index
|
|
IF thisSwitchCam.camVelocityOverrides[index].fSpeed > -1
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".camVelocityOverrides[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fStartPoint = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.camVelocityOverrides[index].fStartPoint, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".camVelocityOverrides[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fSpeed = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.camVelocityOverrides[index].fSpeed, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
|
|
ENDREPEAT
|
|
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
REPEAT MAX_NUM_CAM_BLUR_OVERRIDES index
|
|
IF thisSwitchCam.camBlurOverrides[index].fBlurOverrideBlurLevel > -1
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".camBlurOverrides[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fBlurOverrideStartPoint = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.camBlurOverrides[index].fBlurOverrideStartPoint, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".camBlurOverrides[", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(index, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("].fBlurOverrideBlurLevel = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.camBlurOverrides[index].fBlurOverrideBlurLevel, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
|
|
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".iNumNodes = ", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(thisSwitchCam.iNumNodes, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".iCamSwitchFocusNode = ", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(thisSwitchCam.iCamSwitchFocusNode, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".fSwitchSoundAudioStartPhase = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.fSwitchSoundAudioStartPhase, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".fSwitchSoundAudioEndPhase = ", strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(thisSwitchCam.fSwitchSoundAudioEndPhase, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".bSwitchSoundPlayOpeningPulse = ", strPath, strFileName)
|
|
SAVE_BOOL_TO_NAMED_DEBUG_FILE(thisSwitchCam.bSwitchSoundPlayOpeningPulse, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".bSwitchSoundPlayMoveLoop = ", strPath, strFileName)
|
|
SAVE_BOOL_TO_NAMED_DEBUG_FILE(thisSwitchCam.bSwitchSoundPlayMoveLoop, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".bSwitchSoundPlayExitPulse = ", strPath, strFileName)
|
|
SAVE_BOOL_TO_NAMED_DEBUG_FILE(thisSwitchCam.bSwitchSoundPlayExitPulse, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".bSplineNoSmoothing = ", strPath, strFileName)
|
|
WRITE_BOOL_TO_NAMED_FILE(thisSwitchCam.bSplineNoSmoothing, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".bAddGameplayCamAsLastNode = ", strPath, strFileName)
|
|
WRITE_BOOL_TO_NAMED_FILE(thisSwitchCam.bAddGameplayCamAsLastNode, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(thisSwitchCam.strOutputStructName, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(".iGameplayNodeBlendDuration = ", strPath, strFileName)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(thisSwitchCam.iGameplayNodeBlendDuration, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("//--- End of Cam Data ---", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
CLOSE_DEBUG_FILE()
|
|
|
|
ENDPROC
|
|
|
|
PROC SAVE_BOOL_VALUE_XML_TAG(STRING strTagName, BOOL bValue, INT iNumTabs, STRING strPath, STRING strFileName)
|
|
//CDEBUG3LN(DEBUG_MISSION, "BUILD_INT_VALUE_XML_TAG")
|
|
|
|
TEXT_LABEL_63 txtData
|
|
INT i
|
|
REPEAT iNumTabs i
|
|
txtData += " "
|
|
ENDREPEAT
|
|
txtData += "<"
|
|
txtData += strTagName
|
|
txtData += " value=\""
|
|
IF bValue
|
|
txtData += "true"
|
|
ELSE
|
|
txtData += "false"
|
|
ENDIF
|
|
txtData += "\" />"
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(txtData, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDPROC
|
|
|
|
PROC SAVE_INT_VALUE_XML_TAG(STRING strTagName, INT iValue, INT iNumTabs, STRING strPath, STRING strFileName)
|
|
//CDEBUG3LN(DEBUG_MISSION, "BUILD_INT_VALUE_XML_TAG")
|
|
|
|
TEXT_LABEL_63 txtData
|
|
INT i
|
|
REPEAT iNumTabs i
|
|
txtData += " "
|
|
ENDREPEAT
|
|
txtData += "<"
|
|
txtData += strTagName
|
|
txtData += " value=\""
|
|
txtData += iValue
|
|
txtData += "\" />"
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(txtData, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDPROC
|
|
|
|
PROC SAVE_FLOAT_VALUE_XML_TAG(STRING strTagName, FLOAT fValue, INT iNumTabs, STRING strPath, STRING strFileName)
|
|
|
|
TEXT_LABEL_63 txtData
|
|
INT i
|
|
REPEAT iNumTabs i
|
|
txtData += " "
|
|
ENDREPEAT
|
|
txtData += "<"
|
|
txtData += strTagName
|
|
txtData += " value=\""
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(txtData, strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(fValue, strPath, strFileName)
|
|
txtData = "\" />"
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(txtData, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
ENDPROC
|
|
|
|
PROC SAVE_VECTOR_VALUE_XML_TAG(STRING strTagName, VECTOR vVector, INT iNumTabs, STRING strPath, STRING strFileName)
|
|
//CDEBUG3LN(DEBUG_MISSION, "BUILD_VECTOR_VALUE_XML_TAG")
|
|
|
|
TEXT_LABEL_63 txtData
|
|
INT i
|
|
REPEAT iNumTabs i
|
|
txtData += " "
|
|
ENDREPEAT
|
|
txtData += "<"
|
|
txtData += strTagName
|
|
txtData += " x=\""
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(txtData, strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(vVector.x, strPath, strFileName)
|
|
txtData = "\" y=\""
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(txtData, strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(vVector.y, strPath, strFileName)
|
|
txtData = "\" z=\""
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(txtData, strPath, strFileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(vVector.z, strPath, strFileName)
|
|
txtData = "\" />"
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(txtData, strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Save the data in a switch cam struct to an .xml file
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to save the data of.
|
|
PROC OUTPUT_SPLINE_CAM_DATA_TO_XML(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
CDEBUG3LN(DEBUG_MISSION, "OUTPUT_SPLINE_CAM_DATA_TO_XML")
|
|
|
|
STRING strFileName = thisSwitchCam.strXMLFileName
|
|
STRING strPath = "common:/data/script/xml/"
|
|
|
|
CLEAR_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
OPEN_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("<CustomCamData>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(" <SwitchNodes>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
INT i
|
|
REPEAT thisSwitchCam.iNumNodes i
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(" <Node>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_INT_VALUE_XML_TAG("Index", i, 3, strPath, strFileName)
|
|
SAVE_INT_VALUE_XML_TAG("Time", thisSwitchCam.nodes[i].iNodeTime, 3, strPath, strFileName)
|
|
SAVE_BOOL_VALUE_XML_TAG("IsGameplayCamCopy", thisSwitchCam.nodes[i].bIsGameplayCamCopy, 3, strPath, strFileName)
|
|
SAVE_VECTOR_VALUE_XML_TAG("Position", thisSwitchCam.nodes[i].vNodePos, 3, strPath, strFileName)
|
|
SAVE_VECTOR_VALUE_XML_TAG("Direction", thisSwitchCam.nodes[i].vNodeDir, 3, strPath, strFileName)
|
|
SAVE_BOOL_VALUE_XML_TAG("PointAtEntity", thisSwitchCam.nodes[i].bPointAtEntity, 3, strPath, strFileName)
|
|
SAVE_BOOL_VALUE_XML_TAG("PointAtOffsetIsRelative", thisSwitchCam.nodes[i].bPointAtOffsetIsRelative, 3, strPath, strFileName)
|
|
SAVE_BOOL_VALUE_XML_TAG("AttachOffsetIsRelative", thisSwitchCam.nodes[i].bAttachOffsetIsRelative, 3, strPath, strFileName)
|
|
|
|
SAVE_INT_VALUE_XML_TAG("SwitchCamType", ENUM_TO_INT(thisSwitchCam.nodes[i].SwitchCamType), 3, strPath, strFileName)
|
|
SAVE_INT_VALUE_XML_TAG("ForceCamPointAtEntityIndex", ENUM_TO_INT(thisSwitchCam.nodes[i].iForceCamPointAtEntityIndex), 3, strPath, strFileName)
|
|
SAVE_VECTOR_VALUE_XML_TAG("WorldCamLookAtCoord", thisSwitchCam.nodes[i].vWorldPosLookAt, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("WorldCamLookAtOffset", thisSwitchCam.nodes[i].fNodeOffsetDist, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("NodeVerticleOffset", thisSwitchCam.nodes[i].fNodeVerticleOffset, 3, strPath, strFileName)
|
|
SAVE_BOOL_VALUE_XML_TAG("AttachToOriginPed", thisSwitchCam.nodes[i].bAttachToOriginPed, 3, strPath, strFileName)
|
|
|
|
SAVE_FLOAT_VALUE_XML_TAG("FOV", thisSwitchCam.nodes[i].fNodeFOV, 3, strPath, strFileName)
|
|
|
|
SAVE_INT_VALUE_XML_TAG("TimePostFXType", ENUM_TO_INT(thisSwitchCam.nodes[i].NodeTimePostFX_Type), 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("PostFXBlendTime", thisSwitchCam.nodes[i].fNodeTimePostFXBlendTime, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("PostFXNodeStartOffset", thisSwitchCam.nodes[i].fNodeTimePostFXTimeOffset, 3, strPath, strFileName)
|
|
|
|
SAVE_INT_VALUE_XML_TAG("CamShakeType", ENUM_TO_INT(thisSwitchCam.nodes[i].NodeCamShakeType), 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("MotionBlur", thisSwitchCam.nodes[i].fNodeMotionBlur, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("CamShake", thisSwitchCam.nodes[i].fNodeCamShake, 3, strPath, strFileName)
|
|
|
|
SAVE_INT_VALUE_XML_TAG("CamEaseType", thisSwitchCam.nodes[i].iCamEaseType, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("CamEaseScaler", thisSwitchCam.nodes[i].fCamEaseScaler, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("CamNodeVelocityScale", thisSwitchCam.nodes[i].fCamNodeVelocityScale, 3, strPath, strFileName)
|
|
SAVE_BOOL_VALUE_XML_TAG("CamEaseForceLinear", thisSwitchCam.nodes[i].bCamEaseForceLinear, 3, strPath, strFileName)
|
|
SAVE_BOOL_VALUE_XML_TAG("CamEaseForceLevel", thisSwitchCam.nodes[i].bCamEaseForceLevel, 3, strPath, strFileName)
|
|
|
|
SAVE_FLOAT_VALUE_XML_TAG("TimeScale", thisSwitchCam.nodes[i].fTimeScale, 3, strPath, strFileName)
|
|
SAVE_INT_VALUE_XML_TAG("TimeScaleEaseType", thisSwitchCam.nodes[i].iTimeScaleEaseType, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("TimeScaleEaseScaler", thisSwitchCam.nodes[i].fTimeScaleEaseScaler, 3, strPath, strFileName)
|
|
|
|
SAVE_BOOL_VALUE_XML_TAG("FlashEnabled", thisSwitchCam.nodes[i].bFlashEnabled, 3, strPath, strFileName)
|
|
SAVE_INT_VALUE_XML_TAG("FlashType", ENUM_TO_INT(thisSwitchCam.nodes[i].SCFE_FlashEffectUsed), 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("FlashNodePhaseOffset", thisSwitchCam.nodes[i].fFlashNodePhaseOffset, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("FlashMinExposure", thisSwitchCam.nodes[i].fMinExposure, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("FlashMaxExposure", thisSwitchCam.nodes[i].fMaxExposure, 3, strPath, strFileName)
|
|
SAVE_INT_VALUE_XML_TAG("FlashRampUpDur", thisSwitchCam.nodes[i].iRampUpDuration, 3, strPath, strFileName)
|
|
SAVE_INT_VALUE_XML_TAG("FlashRampDownDur", thisSwitchCam.nodes[i].iRampDownDuration, 3, strPath, strFileName)
|
|
SAVE_INT_VALUE_XML_TAG("FlashHoldDur", thisSwitchCam.nodes[i].iHoldDuration, 3, strPath, strFileName)
|
|
|
|
SAVE_BOOL_VALUE_XML_TAG("IsJumpCut", thisSwitchCam.nodes[i].bIsCamCutNode, 3, strPath, strFileName)
|
|
|
|
SAVE_BOOL_VALUE_XML_TAG("IsLowDetailNode", thisSwitchCam.nodes[i].bIsLowDetailNode, 3, strPath, strFileName)
|
|
|
|
SAVE_BOOL_VALUE_XML_TAG("UseCustomDOF", thisSwitchCam.nodes[i].bUseCustomDOF, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("DOF_NearDOF", thisSwitchCam.nodes[i].NodeDOF_Info.fDOF_NearDOF, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("DOF_FarDOF", thisSwitchCam.nodes[i].NodeDOF_Info.fDOF_FarDOF, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("DOF_EffectStrength", thisSwitchCam.nodes[i].NodeDOF_Info.fDOF_EffectStrength, 3, strPath, strFileName)
|
|
|
|
SAVE_INT_VALUE_XML_TAG("NodeToClone", thisSwitchCam.nodes[i].iNodeToClone, 3, strPath, strFileName)
|
|
SAVE_VECTOR_VALUE_XML_TAG("ClonedNodeOffset", thisSwitchCam.nodes[i].vClonedNodeOffset, 3, strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(" </Node>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDREPEAT
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(" </SwitchNodes>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(" <VelocityOverride>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
REPEAT MAX_NUM_CAM_VELOCITY_OVERRIDES i
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(" <VelNode>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
SAVE_INT_VALUE_XML_TAG("VelIndex", i, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("VelStartPoint", thisSwitchCam.camVelocityOverrides[i].fStartPoint, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("VelSpeed", thisSwitchCam.camVelocityOverrides[i].fSpeed, 3, strPath, strFileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(" </VelNode>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDREPEAT
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(" </VelocityOverride>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(" <BlurOverride>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
REPEAT MAX_NUM_CAM_VELOCITY_OVERRIDES i
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(" <BlurNode>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
SAVE_INT_VALUE_XML_TAG("BlurIndex", i, 3, strPath, strFileName)
|
|
|
|
SAVE_FLOAT_VALUE_XML_TAG("BlurStartPoint", thisSwitchCam.camBlurOverrides[i].fBlurOverrideStartPoint, 3, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("BlurLevel", thisSwitchCam.camBlurOverrides[i].fBlurOverrideBlurLevel, 3, strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(" </BlurNode>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
ENDREPEAT
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(" </BlurOverride>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
SAVE_INT_VALUE_XML_TAG("NumNodes", thisSwitchCam.iNumNodes, 1, strPath, strFileName)
|
|
SAVE_INT_VALUE_XML_TAG("SwitchFocusNode", thisSwitchCam.iCamSwitchFocusNode, 1, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("SwitchSoundAudioStartPhase", thisSwitchCam.fSwitchSoundAudioStartPhase, 1, strPath, strFileName)
|
|
SAVE_FLOAT_VALUE_XML_TAG("SwitchSoundAudioEndPhase", thisSwitchCam.fSwitchSoundAudioEndPhase, 1, strPath, strFileName)
|
|
SAVE_BOOL_VALUE_XML_TAG("SwitchSoundAudioPlayStartPulse", thisSwitchCam.bSwitchSoundPlayOpeningPulse, 1, strPath, strFileName)
|
|
SAVE_BOOL_VALUE_XML_TAG("SwitchSoundAudioPlayMoveLoop", thisSwitchCam.bSwitchSoundPlayMoveLoop, 1, strPath, strFileName)
|
|
SAVE_BOOL_VALUE_XML_TAG("SwitchSoundAudioPlayEndPulse", thisSwitchCam.bSwitchSoundPlayExitPulse, 1, strPath, strFileName)
|
|
|
|
SAVE_BOOL_VALUE_XML_TAG("SplineNoSmoothing", thisSwitchCam.bSplineNoSmoothing, 1, strPath, strFileName)
|
|
SAVE_BOOL_VALUE_XML_TAG("AddGameplayCamAsLastNode", thisSwitchCam.bAddGameplayCamAsLastNode, 1, strPath, strFileName)
|
|
SAVE_INT_VALUE_XML_TAG("GameplayNodeBlendDur", thisSwitchCam.iGameplayNodeBlendDuration, 1, strPath, strFileName)
|
|
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("</CustomCamData>", strPath, strFileName)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(strPath, strFileName)
|
|
|
|
CLOSE_DEBUG_FILE()
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Load in the data from an .xml to the switch cam struct.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to populate with the .xml data.
|
|
PROC LOAD_SPLINE_CAM_DATA_FROM_XML(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
CDEBUG3LN(DEBUG_MISSION, "LOAD_SPLINE_CAM_DATA_FROM_XML")
|
|
|
|
//X:\gta5\build\dev\common\data\script\xml\...
|
|
//strFileName = "playerswitchestablishingshots.xml"
|
|
|
|
STRING strFileName = thisSwitchCam.strXMLFileName
|
|
|
|
IF IS_STRING_NULL_OR_EMPTY(strFileName)
|
|
TEXT_LABEL_63 txtAssert
|
|
txtAssert += strFileName
|
|
txtAssert += " file name is empty!!!"
|
|
SCRIPT_ASSERT(txtAssert)
|
|
EXIT
|
|
ENDIF
|
|
|
|
CDEBUG3LN(DEBUG_MISSION, "Loading XML file...")
|
|
|
|
IF LOAD_XML_FILE(strFileName)
|
|
|
|
INT iNumNodes
|
|
TEXT_LABEL_63 txtNodeName
|
|
|
|
iNumNodes = GET_NUMBER_OF_XML_NODES()
|
|
CDEBUG3LN(DEBUG_MISSION, "Number of Nodes: ", iNumNodes)
|
|
|
|
INT iIndex = 0
|
|
INT iVelIndex = 0
|
|
INT iBlurIndex = 0
|
|
|
|
INT i
|
|
REPEAT iNumNodes i
|
|
|
|
txtNodeName = GET_XML_NODE_NAME()
|
|
|
|
SWITCH GET_HASH_KEY(txtNodeName)
|
|
|
|
CASE HASH("Node")
|
|
iIndex = 0
|
|
BREAK
|
|
CASE HASH("Index")
|
|
iIndex = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("SwitchCamType")
|
|
thisSwitchCam.nodes[iIndex].iSwitchCamTypeDebugSelect = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
thisSwitchCam.nodes[iIndex].SwitchCamType = INT_TO_ENUM(SWITCH_CAM_TYPE, thisSwitchCam.nodes[iIndex].iSwitchCamTypeDebugSelect)
|
|
BREAK
|
|
|
|
CASE HASH("ForceCamPointAtEntityIndex")
|
|
thisSwitchCam.nodes[iIndex].iForceCamPointAtEntityIndex = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("Time")
|
|
thisSwitchCam.nodes[iIndex].iNodeTime = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("IsGameplayCamCopy")
|
|
thisSwitchCam.nodes[iIndex].bIsGameplayCamCopy = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("Position")
|
|
thisSwitchCam.nodes[iIndex].vNodePos.x = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
thisSwitchCam.nodes[iIndex].vNodePos.y = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(1)
|
|
thisSwitchCam.nodes[iIndex].vNodePos.z = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(2)
|
|
BREAK
|
|
CASE HASH("Direction")
|
|
thisSwitchCam.nodes[iIndex].vNodeDir.x = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
thisSwitchCam.nodes[iIndex].vNodeDir.y = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(1)
|
|
thisSwitchCam.nodes[iIndex].vNodeDir.z = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(2)
|
|
BREAK
|
|
CASE HASH("WorldCamLookAtCoord")
|
|
thisSwitchCam.nodes[iIndex].vWorldPosLookAt.x = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
thisSwitchCam.nodes[iIndex].vWorldPosLookAt.y = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(1)
|
|
thisSwitchCam.nodes[iIndex].vWorldPosLookAt.z = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(2)
|
|
BREAK
|
|
CASE HASH("WorldCamLookAtOffset")
|
|
thisSwitchCam.nodes[iIndex].fNodeOffsetDist = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("NodeVerticleOffset")
|
|
thisSwitchCam.nodes[iIndex].fNodeVerticleOffset = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("AttachToOriginPed")
|
|
thisSwitchCam.nodes[iIndex].bAttachToOriginPed = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("PointAtEntity")
|
|
thisSwitchCam.nodes[iIndex].bPointAtEntity = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("PointAtOffsetIsRelative")
|
|
thisSwitchCam.nodes[iIndex].bPointAtOffsetIsRelative = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("AttachOffsetIsRelative")
|
|
thisSwitchCam.nodes[iIndex].bAttachOffsetIsRelative = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("FOV")
|
|
thisSwitchCam.nodes[iIndex].fNodeFOV = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("TimePostFXType")
|
|
thisSwitchCam.nodes[iIndex].iNodeTimePostFX_WidgetValue = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
thisSwitchCam.nodes[iIndex].NodeTimePostFX_Type = INT_TO_ENUM(SWITCH_CAM_POST_FX_TYPE, thisSwitchCam.nodes[iIndex].iNodeTimePostFX_WidgetValue)
|
|
BREAK
|
|
|
|
CASE HASH("PostFXBlendTime")
|
|
thisSwitchCam.nodes[iIndex].fNodeTimePostFXBlendTime = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("PostFXNodeStartOffset")
|
|
thisSwitchCam.nodes[iIndex].fNodeTimePostFXTimeOffset = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("MotionBlur")
|
|
thisSwitchCam.nodes[iIndex].fNodeMotionBlur = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("CamShakeType")
|
|
thisSwitchCam.nodes[iIndex].iNodeCamShakeType_WidgetValue = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
thisSwitchCam.nodes[iIndex].NodeCamShakeType = INT_TO_ENUM(SWITCH_CAM_SHAKE_TYPE, thisSwitchCam.nodes[iIndex].iNodeCamShakeType_WidgetValue)
|
|
BREAK
|
|
CASE HASH("CamShake")
|
|
thisSwitchCam.nodes[iIndex].fNodeCamShake = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("CamEaseType")
|
|
thisSwitchCam.nodes[iIndex].iCamEaseType = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("CamEaseScaler")
|
|
thisSwitchCam.nodes[iIndex].fCamEaseScaler = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("CamNodeVelocityScale")
|
|
thisSwitchCam.nodes[iIndex].fCamNodeVelocityScale = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("CamEaseForceLinear")
|
|
thisSwitchCam.nodes[iIndex].bCamEaseForceLinear = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("CamEaseForceLevel")
|
|
thisSwitchCam.nodes[iIndex].bCamEaseForceLevel = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("TimeScale")
|
|
thisSwitchCam.nodes[iIndex].fTimeScale = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("TimeScaleEaseType")
|
|
thisSwitchCam.nodes[iIndex].iTimeScaleEaseType = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("TimeScaleEaseScaler")
|
|
thisSwitchCam.nodes[iIndex].fTimeScaleEaseScaler = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("FlashEnabled")
|
|
thisSwitchCam.nodes[iIndex].bFlashEnabled = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("FlashType")
|
|
thisSwitchCam.nodes[iIndex].iFlashEffectUsed_WidgetValue = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
thisSwitchCam.nodes[iIndex].SCFE_FlashEffectUsed = INT_TO_ENUM(SWITCH_CAM_FLASH_EFFECT, thisSwitchCam.nodes[iIndex].iFlashEffectUsed_WidgetValue)
|
|
BREAK
|
|
CASE HASH("FlashNodePhaseOffset")
|
|
thisSwitchCam.nodes[iIndex].fFlashNodePhaseOffset = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("FlashMinExposure")
|
|
thisSwitchCam.nodes[iIndex].fMinExposure = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("FlashMaxExposure")
|
|
thisSwitchCam.nodes[iIndex].fMaxExposure = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("FlashRampUpDur")
|
|
thisSwitchCam.nodes[iIndex].iRampUpDuration = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("FlashRampDownDur")
|
|
thisSwitchCam.nodes[iIndex].iRampDownDuration = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("FlashHoldDur")
|
|
thisSwitchCam.nodes[iIndex].iHoldDuration = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("IsJumpCut")
|
|
thisSwitchCam.nodes[iIndex].bIsCamCutNode = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("IsLowDetailNode")
|
|
thisSwitchCam.nodes[iIndex].bIsLowDetailNode = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("NumNodes")
|
|
thisSwitchCam.iNumNodes = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("SwitchFocusNode")
|
|
thisSwitchCam.iCamSwitchFocusNode = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("SplineNoSmoothing")
|
|
thisSwitchCam.bSplineNoSmoothing = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("AddGameplayCamAsLastNode")
|
|
CASE HASH("SplineLastFrameUseGamePlay")
|
|
thisSwitchCam.bAddGameplayCamAsLastNode = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("GameplayNodeBlendDur")
|
|
CASE HASH("LastNodeTime")
|
|
thisSwitchCam.iGameplayNodeBlendDuration = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("UseCustomDOF")
|
|
thisSwitchCam.nodes[iIndex].bUseCustomDOF = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("DOF_NearDOF")
|
|
thisSwitchCam.nodes[iIndex].NodeDOF_Info.fDOF_NearDOF = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("DOF_FarDOF")
|
|
thisSwitchCam.nodes[iIndex].NodeDOF_Info.fDOF_FarDOF = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("DOF_EffectStrength")
|
|
thisSwitchCam.nodes[iIndex].NodeDOF_Info.fDOF_EffectStrength = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("ClonedNodeOffset")
|
|
thisSwitchCam.nodes[iIndex].vClonedNodeOffset.x = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
thisSwitchCam.nodes[iIndex].vClonedNodeOffset.y = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(1)
|
|
thisSwitchCam.nodes[iIndex].vClonedNodeOffset.z = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(2)
|
|
BREAK
|
|
|
|
CASE HASH("NodeToClone")
|
|
thisSwitchCam.nodes[iIndex].iNodeToClone = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("VelNode")
|
|
iVelIndex = 0
|
|
BREAK
|
|
CASE HASH("VelIndex")
|
|
iVelIndex = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("VelStartPoint")
|
|
thisSwitchCam.camVelocityOverrides[iVelIndex].fStartPoint = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("VelSpeed")
|
|
thisSwitchCam.camVelocityOverrides[iVelIndex].fSpeed = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
|
|
CASE HASH("BlurNode")
|
|
iBlurIndex = 0
|
|
BREAK
|
|
CASE HASH("BlurIndex")
|
|
iBlurIndex = GET_INT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("BlurStartPoint")
|
|
thisSwitchCam.camBlurOverrides[iBlurIndex].fBlurOverrideStartPoint = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("BlurLevel")
|
|
thisSwitchCam.camBlurOverrides[iBlurIndex].fBlurOverrideBlurLevel = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("SwitchSoundAudioEndPhase")
|
|
thisSwitchCam.fSwitchSoundAudioEndPhase = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
CASE HASH("SwitchSoundAudioStartPhase")
|
|
thisSwitchCam.fSwitchSoundAudioStartPhase = GET_FLOAT_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("SwitchSoundAudioPlayStartPulse")
|
|
thisSwitchCam.bSwitchSoundPlayOpeningPulse = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("SwitchSoundAudioPlayMoveLoop")
|
|
thisSwitchCam.bSwitchSoundPlayMoveLoop = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
CASE HASH("SwitchSoundAudioPlayEndPulse")
|
|
thisSwitchCam.bSwitchSoundPlayExitPulse = GET_BOOL_FROM_XML_NODE_ATTRIBUTE(0)
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
GET_NEXT_XML_NODE()
|
|
|
|
ENDREPEAT
|
|
|
|
DELETE_XML_FILE()
|
|
|
|
ELSE
|
|
CDEBUG3LN(DEBUG_MISSION, strFileName, " Could not be found!")
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Have this node copy the settings of the node after it and make it's time 0, thus causing the spline to appear to 'jump cut' to this node.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Camera spline to apply the cut node to
|
|
/// iNodeToMakeCutNode - Node on switch cam spline to set as cut node.
|
|
PROC SET_NODE_AS_CUT_NODE(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeToMakeCutNode)
|
|
|
|
IF iNodeToMakeCutNode < thisSwitchCam.iNumNodes - 1
|
|
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].iNodeTime = 0
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].vNodePos = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].vNodePos
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].vNodeDir = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].vNodeDir
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].bPointAtEntity = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].bPointAtEntity
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].fNodeFOV = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].fNodeFOV
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].fNodeMotionBlur = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].fNodeMotionBlur
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].fNodeCamShake = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].fNodeCamShake
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].iCamEaseType = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].iCamEaseType
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].fCamEaseScaler = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].fCamEaseScaler
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].bCamEaseForceLinear = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].bCamEaseForceLinear
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].bCamEaseForceLevel = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].bCamEaseForceLevel
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].fTimeScale = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].fTimeScale
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].iTimeScaleEaseType = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].iTimeScaleEaseType
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].fTimeScaleEaseScaler = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].fTimeScaleEaseScaler
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].bFlashEnabled = FALSE
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].fMinExposure = 0.0000
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].fMaxExposure = 0.0000
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].iRampUpDuration = 0
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].iRampDownDuration = 0
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].iHoldDuration = 0
|
|
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].bUseCustomDOF = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].bUseCustomDOF
|
|
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].bIsGameplayCamCopy = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].bIsGameplayCamCopy
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].fNodeOffsetDist = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].fNodeOffsetDist
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].vWorldPosLookAt = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].vWorldPosLookAt
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].bPointAtOffsetIsRelative = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].bPointAtOffsetIsRelative
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].bAttachOffsetIsRelative = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].bAttachOffsetIsRelative
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].NodeTimePostFX_Type = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].NodeTimePostFX_Type
|
|
thisSwitchCam.nodes[iNodeToMakeCutNode].bIsLowDetailNode = thisSwitchCam.nodes[iNodeToMakeCutNode + 1].bIsLowDetailNode
|
|
|
|
ENDIF
|
|
|
|
|
|
ENDPROC
|
|
|
|
func float magnitude_of_vector(vector &vec)
|
|
|
|
return sqrt(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z)
|
|
|
|
endfunc
|
|
|
|
FUNC VECTOR GET_VECTOR_FROM_DIRECTION_AND_MAGNITUDE(VECTOR v, FLOAT m)
|
|
VECTOR n = NORMALISE_VECTOR(v)
|
|
n.x = n.x * m
|
|
n.y = n.y * m
|
|
n.z = n.z * m
|
|
RETURN n
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Returns the location of the switch cam look at target for the indicated target index
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam to get the target entity coord ah
|
|
/// iTargetIndex - Target Index to get coords of (0 or 1)
|
|
/// RETURNS:
|
|
/// Vector position of the entity at the indicated target index
|
|
FUNC VECTOR GET_POSITION_OF_SWITCH_CAM_TARGET_ENTITY(SWITCH_CAM_STRUCT &thisSwitchCam, INT iTargetIndex)
|
|
|
|
IF iTargetIndex < NUM_SWITCH_ENTITIES
|
|
//[MF] Check if the target is a vehicle
|
|
IF DOES_ENTITY_EXIST(thisSwitchCam.viVehicles[iTargetIndex])
|
|
RETURN GET_ENTITY_COORDS(thisSwitchCam.viVehicles[iTargetIndex])
|
|
ENDIF
|
|
|
|
//[MF] Check if the target is ped
|
|
IF DOES_ENTITY_EXIST(thisSwitchCam.piPeds[iTargetIndex])
|
|
RETURN GET_ENTITY_COORDS(thisSwitchCam.piPeds[iTargetIndex])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SCRIPT_ASSERT("GET_POSITION_OF_WORLD_CAM_WITH_ENTITY_LOOK_AT_TARGET - Switch cam Struct Not Properly Initialized or iTargetIndex is invalid. No target ped has been designated to point cam at!")
|
|
RETURN <<0.0, 0.0, 0.0>>
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Copy the current gameplay cam info to a Switch Cam Struct. This creates a switch cam spline node that is effectively a carbon copy of the gameplay cam, however is more stable on fast moving vehicles.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to create the gameplay cam clone in
|
|
/// index - Node of switch cam struct to copy info to
|
|
PROC CLONE_GAMEPLAY_CAM_TO_SWITCH_CAM_STRUCT_NODE(SWITCH_CAM_STRUCT &thisSwitchCam, INT index)
|
|
|
|
thisSwitchCam.nodes[index].vNodePos = GET_GAMEPLAY_CAM_COORD()
|
|
thisSwitchCam.nodes[index].vNodeDir = GET_GAMEPLAY_CAM_ROT()
|
|
thisSwitchCam.nodes[index].fNodeFov = GET_GAMEPLAY_CAM_FOV()
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks if we are in an instance where it is better to clone the gameplay cam instead of natively use it for the spline.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to process
|
|
/// index - Index of the spline cam node to check if we should clone it
|
|
/// RETURNS:
|
|
/// FALSE if it is better to use a native copy of the gameplay cam in the spline. TRUE if it's better for us to use a clone.
|
|
FUNC BOOL DO_WE_WANT_TO_CLONE_GAMEPLAY_CAM(SWITCH_CAM_STRUCT &thisSwitchCam, INT index)
|
|
|
|
//[SP] super hack for using the real gameplay cam as the first node... as seen in jewelryheist.sc
|
|
// This is done by making the first [0] and second [1] node of a spline cam to be type SWITCH_CAM_GAMEPLAY_CAM_COPY both with nodetime = 0
|
|
// Using just SWITCH_CAM_GAMEPLAY_CAM_COPY makes an actual copy (pos/dir) instead of using the dynamic values of a gameplay cam.
|
|
|
|
//[MF] We only want to clone the gameplay cam if the first node of the switch cam is a gameplay cam copy and it is NOT followed by another gameplay cam copy.
|
|
// Otherwise it's better to just use a native gameplay cam in the spline.
|
|
IF index = 0
|
|
IF (thisSwitchCam.nodes[index].SwitchCamType = SWITCH_CAM_GAMEPLAY_CAM_COPY OR thisSwitchCam.nodes[index].bIsGameplayCamCopy)
|
|
AND (thisSwitchCam.nodes[index + 1].SwitchCamType != SWITCH_CAM_GAMEPLAY_CAM_COPY AND thisSwitchCam.nodes[index + 1].bIsGameplayCamCopy = FALSE)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF index = 1
|
|
IF (thisSwitchCam.nodes[index].SwitchCamType = SWITCH_CAM_GAMEPLAY_CAM_COPY OR thisSwitchCam.nodes[index].bIsGameplayCamCopy)
|
|
AND (thisSwitchCam.nodes[index - 1].SwitchCamType != SWITCH_CAM_GAMEPLAY_CAM_COPY AND thisSwitchCam.nodes[index - 1].bIsGameplayCamCopy = FALSE)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Sets a spline cam node to copy the gameplay cam and then attaches that to the spline node's focus entity. This is useful for instances where a native gameplay cam clone can cause pops, usually occurs on fast moving vehicles.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to create the gameplay cam copy in
|
|
/// index - Index of the switch cam to set as a gameplay cam clone.
|
|
PROC ATTACH_GAMEPLAY_CAM_CLONE_TO_ENTITY(SWITCH_CAM_STRUCT &thisSwitchCam, INT index)
|
|
|
|
ATTACH_CAM_TO_ENTITY(thisSwitchCam.nodes[index].ciSwitchNode, GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, index), GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, index), GET_GAMEPLAY_CAM_COORD()))
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Check if we should attach the spline cam to it's a target entity based on the node properies
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to check
|
|
/// iNodeIndex - Node of Switch Cam Struct to check
|
|
/// RETURNS:
|
|
/// TRUE if the cam should be attached to an entity. FALSE otherwise (eg, gameplay cam copy, world pos cam, certain cut cams).
|
|
FUNC BOOL DO_WE_WANT_TO_ATTACH_CAM_TO_ENTITY(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
BOOL bWantToAttach = FALSE
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
bWantToAttach = TRUE
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_ENTITY_ATTACHED_CAM
|
|
// OR thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_ENTITY_ATTACHED_W_WORLD_LOOK_AT
|
|
bWantToAttach = TRUE
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].bIsGameplayCamCopy
|
|
OR thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_GAMEPLAY_CAM_COPY
|
|
bWantToAttach = FALSE
|
|
ENDIF
|
|
|
|
//[MF] Handle Cloned Node With Offset camera type
|
|
IF iNodeIndex > 0
|
|
IF thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_CLONE_NODE_WITH_OFFSET
|
|
IF thisSwitchCam.nodes[thisSwitchCam.nodes[iNodeIndex].iNodeToClone].SwitchCamType = SWITCH_CAM_OLD_SYSTEM
|
|
bWantToAttach = TRUE
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[thisSwitchCam.nodes[iNodeIndex].iNodeToClone].SwitchCamType = SWITCH_ENTITY_ATTACHED_CAM
|
|
// OR thisSwitchCam.nodes[thisSwitchCam.nodes[iNodeIndex].iNodeToClone].SwitchCamType = SWITCH_CAM_ENTITY_ATTACHED_W_WORLD_LOOK_AT
|
|
bWantToAttach = TRUE
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[thisSwitchCam.nodes[iNodeIndex].iNodeToClone].bIsGameplayCamCopy
|
|
OR thisSwitchCam.nodes[thisSwitchCam.nodes[iNodeIndex].iNodeToClone].SwitchCamType = SWITCH_CAM_GAMEPLAY_CAM_COPY
|
|
bWantToAttach = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//[MF] TODO: Figure out how to go from a cut cam to a gameplay copy cam
|
|
|
|
//[MF]We don't want to attach the cam if we're going from a cut cam to a non-attached cam type.
|
|
IF iNodeIndex < (thisSwitchCam.iNumNodes - 1)
|
|
IF thisSwitchCam.nodes[iNodeIndex].bIsCamCutNode
|
|
IF thisSwitchCam.nodes[iNodeIndex + 1].SwitchCamType = SWITCH_CAM_GAMEPLAY_CAM_COPY
|
|
OR thisSwitchCam.nodes[iNodeIndex + 1].bIsGameplayCamCopy
|
|
OR thisSwitchCam.nodes[iNodeIndex + 1].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
OR thisSwitchCam.nodes[iNodeIndex + 1].SwitchCamType = SWITCH_CAM_WORLD_POS_W_LOOK_AT
|
|
OR thisSwitchCam.nodes[iNodeIndex + 1].SwitchCamType = SWITCH_CAM_PATH_RELATIVE
|
|
OR thisSwitchCam.nodes[iNodeIndex + 1].SwitchCamType = SWITCH_CAM_PATH_RELATIVE_ATTACHED
|
|
bWantToAttach = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN bWantToAttach
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Set the Depth Of Field stats for a camera node
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam Struct to get DOF settings from
|
|
/// index - Node index to apply the settings to
|
|
PROC P_UPDATE_NODE_DOF(SWITCH_CAM_STRUCT &thisSwitchCam, INT index)
|
|
|
|
SET_CAM_NEAR_DOF(thisSwitchCam.nodes[index].ciSwitchNode, thisSwitchCam.nodes[index].NodeDOF_Info.fDOF_NearDOF)
|
|
SET_CAM_FAR_DOF(thisSwitchCam.nodes[index].ciSwitchNode, thisSwitchCam.nodes[index].NodeDOF_Info.fDOF_FarDOF)
|
|
SET_CAM_DOF_STRENGTH(thisSwitchCam.nodes[index].ciSwitchNode, thisSwitchCam.nodes[index].NodeDOF_Info.fDOF_EffectStrength)
|
|
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Setup the position and rotation data for a CLONE_PREVIOUS_WITH_OFFSET switch cam node type
|
|
/// PARAMS:
|
|
/// thisSwitchCam -
|
|
/// iNodeIndex -
|
|
PROC SETUP_CAM_NODE_POSITION_TYPE_CLONE_NODE_WITH_OFFSET(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
IF iNodeIndex = 0
|
|
SCRIPT_ASSERT("Cannot use Node Type CLONE PREVIOUS WITH OFFSET on first node of spline cam! No previous node to copy data from.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT iNodeToCloneFrom = thisSwitchCam.nodes[iNodeIndex].iNodeToClone
|
|
|
|
IF thisSwitchCam.nodes[iNodeToCloneFrom].bIsGameplayCamCopy
|
|
OR thisSwitchCam.nodes[iNodeToCloneFrom].SwitchCamType = SWITCH_CAM_GAMEPLAY_CAM_COPY
|
|
thisSwitchCam.nodes[iNodeIndex].vNodePos = GET_GAMEPLAY_CAM_COORD() + thisSwitchCam.nodes[iNodeIndex].vClonedNodeOffset
|
|
thisSwitchCam.nodes[iNodeIndex].vNodeDir = GET_GAMEPLAY_CAM_ROT()
|
|
ELSE
|
|
thisSwitchCam.nodes[iNodeIndex].vNodePos = thisSwitchCam.nodes[iNodeToCloneFrom].vNodePos + thisSwitchCam.nodes[iNodeIndex].vClonedNodeOffset
|
|
thisSwitchCam.nodes[iNodeIndex].vNodeDir = thisSwitchCam.nodes[iNodeToCloneFrom].vNodeDir
|
|
ENDIF
|
|
|
|
thisSwitchCam.nodes[iNodeIndex].fNodeFOV = thisSwitchCam.nodes[iNodeToCloneFrom].fNodeFOV
|
|
IF thisSwitchCam.nodes[iNodeIndex].fNodeFOV = 0.0
|
|
thisSwitchCam.nodes[iNodeIndex].fNodeFOV = GET_GAMEPLAY_CAM_FOV()
|
|
ENDIF
|
|
|
|
thisSwitchCam.nodes[iNodeIndex].bPointAtEntity = thisSwitchCam.nodes[iNodeToCloneFrom].bPointAtEntity
|
|
|
|
thisSwitchCam.nodes[iNodeIndex].fNodeOffsetDist = thisSwitchCam.nodes[iNodeToCloneFrom].fNodeOffsetDist
|
|
thisSwitchCam.nodes[iNodeIndex].vWorldPosLookAt = thisSwitchCam.nodes[iNodeToCloneFrom].vWorldPosLookAt
|
|
thisSwitchCam.nodes[iNodeIndex].bPointAtOffsetIsRelative = thisSwitchCam.nodes[iNodeToCloneFrom].bPointAtOffsetIsRelative
|
|
thisSwitchCam.nodes[iNodeIndex].bAttachOffsetIsRelative = thisSwitchCam.nodes[iNodeToCloneFrom].bAttachOffsetIsRelative
|
|
|
|
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Create a specific node for a switch cam spline.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to create the node from
|
|
/// iNodeIndex - Index of the node to create
|
|
PROC BUILD_SWITCH_CAM_NODE(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
CDEBUG3LN(DEBUG_MISSION, "BUILD_SWITCH_CAM_NODE - START - Index: ", iNodeIndex)
|
|
|
|
//[MF] if our first node is a gameplay copy node, create a copy of the gameplay cam that we'll render instead of using the actual gameplay cam.
|
|
//This resolves popping issues on small splines of < 3 nodes
|
|
IF DO_WE_WANT_TO_CLONE_GAMEPLAY_CAM(thisSwitchCam, iNodeIndex)
|
|
CLONE_GAMEPLAY_CAM_TO_SWITCH_CAM_STRUCT_NODE(thisSwitchCam, iNodeIndex)
|
|
ENDIF
|
|
|
|
FLOAT fFOV
|
|
IF thisSwitchCam.nodes[iNodeIndex].fNodeFOV = 0.0
|
|
fFOV = GET_GAMEPLAY_CAM_FOV()
|
|
ELSE
|
|
fFOV = thisSwitchCam.nodes[iNodeIndex].fNodeFOV
|
|
ENDIF
|
|
|
|
IF IS_NODE_JUMP_CUT(thisSwitchCam, iNodeIndex)
|
|
SET_NODE_AS_CUT_NODE(thisSwitchCam, iNodeIndex)
|
|
//[MF] Ensure that the last node can't be a jump cut node.
|
|
IF iNodeIndex = thisSwitchCam.iNumNodes - 1
|
|
thisSwitchCam.nodes[iNodeIndex].bIsCamCutNode = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF iNodeIndex = thisSwitchCam.iNumNodes - 1
|
|
thisSwitchCam.nodes[iNodeIndex].bIsCamCutNode = FALSE
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_WORLD_POS_W_LOOK_AT
|
|
VECTOR vLookatCoords
|
|
IF thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex > -1
|
|
vLookatCoords = GET_POSITION_OF_SWITCH_CAM_TARGET_ENTITY(thisSwitchCam, thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex)
|
|
ELSE
|
|
vLookatCoords = thisSwitchCam.nodes[iNodeIndex].vWorldPosLookAt
|
|
ENDIF
|
|
|
|
VECTOR vStartingObserverLoc
|
|
IF iNodeIndex = 0
|
|
OR iNodeIndex >0 AND thisSwitchCam.nodes[iNodeIndex - 1].bIsGameplayCamCopy
|
|
OR iNodeIndex >0 AND thisSwitchCam.nodes[iNodeIndex - 1].SwitchCamType = SWITCH_CAM_GAMEPLAY_CAM_COPY
|
|
vStartingObserverLoc = GET_GAMEPLAY_CAM_COORD()
|
|
ELSE
|
|
vStartingObserverLoc = thisSwitchCam.nodes[iNodeIndex - 1].vNodePos
|
|
|
|
IF DO_WE_WANT_TO_ATTACH_CAM_TO_ENTITY(thisSwitchCam, iNodeIndex - 1)
|
|
VECTOR vEntityForward, vEntityRight, vEntityUp, vEntityPosition
|
|
GET_ENTITY_MATRIX(GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iNodeIndex - 1), vEntityForward, vEntityRight, vEntityUp, vEntityPosition)
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].bAttachOffsetIsRelative
|
|
|
|
vStartingObserverLoc = vEntityPosition + (vEntityForward * thisSwitchCam.nodes[iNodeIndex - 1].vNodePos.y)
|
|
+ (vEntityRight * thisSwitchCam.nodes[iNodeIndex - 1].vNodePos.x)
|
|
+ (vEntityUp * thisSwitchCam.nodes[iNodeIndex - 1].vNodePos.z)
|
|
ELSE
|
|
vStartingObserverLoc = vEntityPosition + thisSwitchCam.nodes[iNodeIndex - 1].vNodePos
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
VECTOR vTargetDirection = vLookatCoords - vStartingObserverLoc
|
|
FLOAT fDistToTarget = (VMAG(vTargetDirection) - thisSwitchCam.nodes[iNodeIndex].fNodeOffsetDist)
|
|
|
|
vTargetDirection = NORMALISE_VECTOR(vTargetDirection)
|
|
|
|
vTargetDirection *= fDistToTarget
|
|
|
|
thisSwitchCam.nodes[iNodeIndex].vNodePos = vStartingObserverLoc + vTargetDirection
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex > -1
|
|
thisSwitchCam.nodes[iNodeIndex].vWorldPosLookAt = vLookatCoords
|
|
ENDIF
|
|
|
|
ELIF thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_PATH_RELATIVE
|
|
OR thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_PATH_RELATIVE_ATTACHED
|
|
VECTOR vTargetPosition = <<0.0, 0.0, 0.0>>
|
|
IF DOES_ENTITY_EXIST(GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, thisSwitchCam.iCamSwitchFocusNode))
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex > -1
|
|
vTargetPosition = GET_POSITION_OF_SWITCH_CAM_TARGET_ENTITY(thisSwitchCam, thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex)
|
|
ELSE
|
|
vTargetPosition = GET_ENTITY_COORDS(GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, thisSwitchCam.iCamSwitchFocusNode))
|
|
ENDIF
|
|
|
|
ENDIF
|
|
VECTOR vGameCamRot = GET_GAMEPLAY_CAM_ROT()
|
|
VECTOR vGameCamPosition = GET_GAMEPLAY_CAM_COORD()
|
|
VECTOR vGameCamForward = vTargetPosition - vGameCamPosition
|
|
|
|
FLOAT fCameraOffset = 0.0
|
|
IF iNodeIndex < thisSwitchCam.iCamSwitchFocusNode
|
|
OR thisSwitchCam.iCamSwitchFocusNode = 0
|
|
fCameraOffset = thisSwitchCam.nodes[iNodeIndex].fNodeOffsetDist
|
|
ENDIF
|
|
FLOAT fDistanceToTarget = VMAG(vGameCamForward) - fCameraOffset
|
|
|
|
vGameCamForward = CONVERT_EULER_TO_DIRECTION_VECTOR(vGameCamRot)
|
|
vGameCamPosition = vGameCamPosition + (vGameCamForward * fCameraOffset) // offset forward by NodeOffsetDist
|
|
|
|
IF iNodeIndex < thisSwitchCam.iCamSwitchFocusNode
|
|
// For initial nodes, camera is game camera plus offset along game camera forward.
|
|
thisSwitchCam.nodes[iNodeIndex].vNodePos = vGameCamPosition
|
|
ELSE
|
|
// For ending nodes, camera is game camera + ((distance to target minus offset) along camera forward)
|
|
thisSwitchCam.nodes[iNodeIndex].vNodePos = vGameCamPosition
|
|
+ (vGameCamForward * (fDistanceToTarget - thisSwitchCam.nodes[iNodeIndex].fNodeOffsetDist))
|
|
ENDIF
|
|
|
|
thisSwitchCam.nodes[iNodeIndex].vNodeDir = vGameCamRot
|
|
|
|
ELIF thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_PATH_RELATIVE_PED_TO_WORLD_COORD
|
|
|
|
VECTOR vTargetPosition = thisSwitchCam.nodes[iNodeIndex].vWorldPosLookAt
|
|
VECTOR vOriginPedPosition = GET_ENTITY_COORDS(GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iNodeIndex))
|
|
VECTOR vOriginPedForward = vTargetPosition - vOriginPedPosition
|
|
FLOAT fCameraOffset = 0.0
|
|
|
|
fCameraOffset = thisSwitchCam.nodes[iNodeIndex].fNodeOffsetDist
|
|
|
|
vOriginPedForward = NORMALISE_VECTOR(vOriginPedForward)
|
|
VECTOR vCamLocation
|
|
vCamLocation = vOriginPedPosition + (vOriginPedForward * fCameraOffset)
|
|
|
|
vCamLocation.z += thisSwitchCam.nodes[iNodeIndex].fNodeVerticleOffset
|
|
|
|
thisSwitchCam.nodes[iNodeIndex].vNodePos = vCamLocation
|
|
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_CLONE_NODE_WITH_OFFSET
|
|
SETUP_CAM_NODE_POSITION_TYPE_CLONE_NODE_WITH_OFFSET(thisSwitchCam, iNodeIndex)
|
|
fFOV = thisSwitchCam.nodes[iNodeIndex].fNodeFOV
|
|
ENDIF
|
|
|
|
//[MF] Create the node
|
|
thisSwitchCam.nodes[iNodeIndex].ciSwitchNode = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, thisSwitchCam.nodes[iNodeIndex].vNodePos, thisSwitchCam.nodes[iNodeIndex].vNodeDir, fFOV, TRUE)
|
|
|
|
CAMERA_INDEX ciSwitchCamNodeIndex
|
|
ciSwitchCamNodeIndex = thisSwitchCam.nodes[iNodeIndex].ciSwitchNode
|
|
|
|
|
|
IF DOES_CAM_EXIST(thisSwitchCam.nodes[iNodeIndex].ciSwitchNode)
|
|
|
|
SET_CAM_MOTION_BLUR_STRENGTH(ciSwitchCamNodeIndex, thisSwitchCam.nodes[iNodeIndex].fNodeMotionBlur)
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_WORLD_POS_W_LOOK_AT
|
|
POINT_CAM_AT_COORD(ciSwitchCamNodeIndex, thisSwitchCam.nodes[iNodeIndex].vWorldPosLookAt)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
AND thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex > -1
|
|
POINT_CAM_AT_ENTITY(ciSwitchCamNodeIndex, GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iNodeIndex, thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex), thisSwitchCam.nodes[iNodeIndex].vNodeDir, thisSwitchCam.nodes[iNodeIndex].bPointAtOffsetIsRelative)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_PATH_RELATIVE_ATTACHED
|
|
IF thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex > -1
|
|
PRINTLN("Attaching Cam Path Relative Attached cam to forced look-at entity")
|
|
ATTACH_CAM_TO_ENTITY(ciSwitchCamNodeIndex, GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iNodeIndex, thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex), thisSwitchCam.nodes[iNodeIndex].vNodePos - GET_POSITION_OF_SWITCH_CAM_TARGET_ENTITY(thisSwitchCam, thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex) + thisSwitchCam.nodes[iNodeIndex].vClonedNodeOffset, FALSE)
|
|
ELSE
|
|
PRINTLN("Attaching Cam Path Relative Attached cam to default entity")
|
|
ATTACH_CAM_TO_ENTITY(ciSwitchCamNodeIndex, GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iNodeIndex), thisSwitchCam.nodes[iNodeIndex].vNodeDir, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_PATH_RELATIVE_PED_TO_WORLD_COORD
|
|
IF thisSwitchCam.nodes[iNodeIndex].bAttachToOriginPed
|
|
PRINTLN("Attaching Cam Path Relative Attached cam to default entity")
|
|
ATTACH_CAM_TO_ENTITY(ciSwitchCamNodeIndex, GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iNodeIndex), thisSwitchCam.nodes[iNodeIndex].vNodePos - GET_ENTITY_COORDS(GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iNodeIndex)), FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DO_WE_WANT_TO_ATTACH_CAM_TO_ENTITY(thisSwitchCam, iNodeIndex)
|
|
IF DOES_ENTITY_EXIST(GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iNodeIndex))
|
|
CDEBUG3LN(DEBUG_MISSION, "Attaching Cam Node " , iNodeIndex, " to Focus Entity: ", NATIVE_TO_INT(GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iNodeIndex)))
|
|
ATTACH_CAM_TO_ENTITY(ciSwitchCamNodeIndex, GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iNodeIndex), thisSwitchCam.nodes[iNodeIndex].vNodePos, thisSwitchCam.nodes[iNodeIndex].bAttachOffsetIsRelative)
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].bPointAtEntity
|
|
// AND thisSwitchCam.nodes[iNodeIndex].SwitchCamType != SWITCH_CAM_ENTITY_ATTACHED_W_WORLD_LOOK_AT
|
|
IF thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex > -1
|
|
POINT_CAM_AT_ENTITY(ciSwitchCamNodeIndex, GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iNodeIndex, thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex), thisSwitchCam.nodes[iNodeIndex].vNodeDir, thisSwitchCam.nodes[iNodeIndex].bPointAtOffsetIsRelative)
|
|
ELSE
|
|
POINT_CAM_AT_ENTITY(ciSwitchCamNodeIndex, GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iNodeIndex), thisSwitchCam.nodes[iNodeIndex].vNodeDir, thisSwitchCam.nodes[iNodeIndex].bPointAtOffsetIsRelative)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// IF thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_ENTITY_ATTACHED_W_WORLD_LOOK_AT
|
|
IF thisSwitchCam.nodes[iNodeIndex].SwitchCamType = SWITCH_CAM_PATH_RELATIVE_PED_TO_WORLD_COORD
|
|
PRINTLN("Pointing cam at world coord ", iNodeIndex)
|
|
POINT_CAM_AT_COORD(ciSwitchCamNodeIndex, thisSwitchCam.nodes[iNodeIndex].vWorldPosLookAt)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].bUseCustomDOF
|
|
PRINTLN("Enabling custom DOF for Switch Cam Node: ", iNodeIndex)
|
|
P_UPDATE_NODE_DOF(thisSwitchCam, iNodeIndex)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
thisSwitchCam.nodes[iNodeIndex].bHaveNodeSettingsBeenApplied = FALSE
|
|
thisSwitchCam.nodes[iNodeIndex].bHaveNodePostFX_BeenApplied = FALSE
|
|
|
|
CDEBUG3LN(DEBUG_MISSION, "BUILD_SWITCH_CAM_NODE - END")
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Check if the switch cam struct requires the animated cam shake libraries to be loaded.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to check if we need to load the animated cam shake anim library for
|
|
/// RETURNS:
|
|
/// TRUE the struct uses a cam shake that requires the animated cam shake library. FALSE otherwise
|
|
FUNC BOOL ARE_ANIM_CAM_SHAKE_LIBRARIES_NEEDED_FOR_STRUCT(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
|
|
BOOL bIsCamShakeLibraryNeeded = FALSE
|
|
|
|
INT i
|
|
REPEAT thisSwitchCam.iNumNodes i
|
|
IF thisSwitchCam.nodes[i].NodeCamShakeType != CAM_SHAKE_DEFAULT
|
|
bIsCamShakeLibraryNeeded = TRUE
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN bIsCamShakeLibraryNeeded
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Load in all the cam shake libraries needed for a switch cam struct
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to load the libraries for
|
|
/// RETURNS:
|
|
/// TRUE when all libraries needed by the switch cam have loaded. FALSE otherwise.
|
|
FUNC BOOL LOAD_CAM_SHAKE_LIBRARIES(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
|
|
thisSwitchCam.bInitialized = thisSwitchCam.bInitialized
|
|
|
|
IF ARE_ANIM_CAM_SHAKE_LIBRARIES_NEEDED_FOR_STRUCT(thisSwitchCam)
|
|
REQUEST_ANIM_DICT("shake_cam_all@")
|
|
IF HAS_ANIM_DICT_LOADED("shake_cam_all@")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Remove all animated camera libraried (light, medium, heavy) from memory
|
|
PROC UNLOAD_ALL_CAM_SHAKE_ANIM_LIBRARIES()
|
|
CDEBUG3LN(DEBUG_MISSION, "UNLOAD_ALL_CAM_SHAKE_ANIMS")
|
|
|
|
REMOVE_ANIM_DICT("shake_cam_all@")
|
|
|
|
ENDPROC
|
|
|
|
PROC PLAY_SWITCH_CAM_NODE_FLASH(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
STRING sFlashEffectName
|
|
SWITCH thisSwitchCam.nodes[iNodeIndex].SCFE_FlashEffectUsed
|
|
|
|
CASE SCFE_CODE_FLASH
|
|
CDEBUG3LN(DEBUG_MISSION, "Playing CODE Camera Flash...", iNodeIndex)
|
|
SET_FLASH(thisSwitchCam.nodes[iNodeIndex].fMinExposure, thisSwitchCam.nodes[iNodeIndex].fMaxExposure, thisSwitchCam.nodes[iNodeIndex].iRampUpDuration, thisSwitchCam.nodes[iNodeIndex].iRampDownDuration, thisSwitchCam.nodes[iNodeIndex].iHoldDuration)
|
|
BREAK
|
|
|
|
CASE SCFE_DefaultFlash
|
|
sFlashEffectName = "DefaultFlash"
|
|
BREAK
|
|
|
|
CASE SCFE_FocusOut
|
|
sFlashEffectName = "FocusOut"
|
|
BREAK
|
|
|
|
CASE SCFE_MinigameEndNeutral
|
|
sFlashEffectName = "MinigameEndNeutral"
|
|
BREAK
|
|
|
|
CASE SCFE_MinigameTransitionOut
|
|
sFlashEffectName = "MinigameTransitionOut"
|
|
BREAK
|
|
|
|
CASE SCFE_PauseMenuOut
|
|
sFlashEffectName = "PauseMenuOut"
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchShortNeutralIn
|
|
sFlashEffectName = "SwitchShortNeutralIn"
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchShortNeutralMid
|
|
sFlashEffectName = "SwitchShortNeutralMid"
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchShortMichaelMid
|
|
sFlashEffectName = "SwitchShortMichaelMid"
|
|
BREAK
|
|
CASE SCFE_SwitchShortMichaelIn
|
|
sFlashEffectName = "SwitchShortMichaelIn"
|
|
BREAK
|
|
CASE SCFE_SwitchSceneMichael
|
|
sFlashEffectName = "SwitchSceneMichael"
|
|
BREAK
|
|
CASE SCFE_SwitchShortTrevorMid
|
|
sFlashEffectName = "SwitchShortTrevorMid"
|
|
BREAK
|
|
CASE SCFE_SwitchShortFranklinIn
|
|
sFlashEffectName = "SwitchShortFranklinIn"
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchShortFranklinMid
|
|
sFlashEffectName = "SwitchShortFranklinMid"
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchShortTrevorIn
|
|
sFlashEffectName = "SwitchShortTrevorIn"
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchOpenFranklinOut
|
|
sFlashEffectName = "SwitchOpenFranklinOut"
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchOpenMichaelIn
|
|
sFlashEffectName = "SwitchOpenMichaelIn"
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchOpenMichaelOut
|
|
sFlashEffectName = "SwitchOpenMichaelOut"
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchOpenTrevorIn
|
|
sFlashEffectName = "SwitchOpenTrevorIn"
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchOpenTrevorOut
|
|
sFlashEffectName = "SwitchOpenTrevorOut"
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchSceneFranklin
|
|
sFlashEffectName = "SwitchSceneFranklin"
|
|
BREAK
|
|
|
|
CASE SCFE_SwitchSceneTrevor
|
|
sFlashEffectName = "SwitchSceneTrevor"
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].SCFE_FlashEffectUsed > SCFE_CODE_FLASH
|
|
CDEBUG3LN(DEBUG_MISSION, "Playing APFX Camera Flash: ", sFlashEffectName, " ", iNodeIndex)
|
|
ANIMPOSTFX_PLAY(sFlashEffectName, 0, false)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Get the string name of the currently active ANIM POST FX
|
|
/// RETURNS:
|
|
/// String name of currently active ANIM POST FX. Return an empty string of "" if no ANIM POST FX is active.
|
|
FUNC STRING GET_NAME_OF_ACTIVE_ANIM_POST_FX()
|
|
|
|
STRING sNameOfActiveFX = ""
|
|
|
|
IF ANIMPOSTFX_IS_RUNNING("SwitchSceneMichael")
|
|
sNameOfActiveFX = "SwitchSceneMichael"
|
|
ELIF ANIMPOSTFX_IS_RUNNING("SwitchSceneFranklin")
|
|
sNameOfActiveFX = "SwitchSceneFranklin"
|
|
ELIF ANIMPOSTFX_IS_RUNNING("SwitchSceneTrevor")
|
|
sNameOfActiveFX = "SwitchSceneTrevor"
|
|
ELIF ANIMPOSTFX_IS_RUNNING("SwitchSceneNeutral")
|
|
sNameOfActiveFX = "SwitchSceneNeutral"
|
|
ELIF ANIMPOSTFX_IS_RUNNING("SwitchHUDIn")
|
|
sNameOfActiveFX = "SwitchHUDIn"
|
|
ENDIF
|
|
|
|
RETURN sNameOfActiveFX
|
|
|
|
ENDFUNC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Stop current Anim Post FX with the corresponding blend out if one exists.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct playing APFX
|
|
/// iNodeIndex - Node of Switch Cam blend out has been tagged in
|
|
PROC BLEND_OUT_FROM_SWITCH_CAM_APFX(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
//[MF] If we're playing the 'SwitchHUDIn', play it's exit effect 'SwitchHUDOut'
|
|
IF ARE_STRINGS_EQUAL(GET_NAME_OF_ACTIVE_ANIM_POST_FX(), "SwitchHUDIn")
|
|
AND thisSwitchCam.nodes[iNodeIndex].fNodeTimePostFXBlendTime > 0
|
|
ANIMPOSTFX_STOP(GET_NAME_OF_ACTIVE_ANIM_POST_FX())
|
|
ANIMPOSTFX_PLAY("SwitchHUDOut", FLOOR(thisSwitchCam.nodes[iNodeIndex].fNodeTimePostFXBlendTime) * 1000, FALSE)
|
|
NET_NL()NET_PRINT("BLEND_OUT_FROM_SWITCH_CAM_APFX SwitchHUDOut 4 ")
|
|
ELSE
|
|
ANIMPOSTFX_STOP(GET_NAME_OF_ACTIVE_ANIM_POST_FX())
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Handle the playback of the 'woosh' audio during switch cams.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam to play the audio of.
|
|
PROC HANDLE_CUSTOM_SWITCH_CAM_AUDIO(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
|
|
IF thisSwitchCam.fSwitchSoundAudioStartPhase >= 0
|
|
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= thisSwitchCam.fSwitchSoundAudioStartPhase
|
|
AND GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) < thisSwitchCam.fSwitchSoundAudioEndPhase
|
|
IF thisSwitchCam.iSwitchAudioCameraHitInID = -1
|
|
IF thisSwitchCam.bSwitchSoundPlayOpeningPulse
|
|
thisSwitchCam.iSwitchAudioCameraHitInID = GET_SOUND_ID()
|
|
PLAY_SOUND_FRONTEND(thisSwitchCam.iSwitchAudioCameraHitInID, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.iSwitchAudioCameraMoveLoopID = -1
|
|
IF thisSwitchCam.bSwitchSoundPlayMoveLoop
|
|
thisSwitchCam.iSwitchAudioCameraMoveLoopID = GET_SOUND_ID()
|
|
PLAY_SOUND_FRONTEND(thisSwitchCam.iSwitchAudioCameraMoveLoopID, "Camera_Move_Loop", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.fSwitchSoundAudioEndPhase >= 0
|
|
IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= thisSwitchCam.fSwitchSoundAudioEndPhase
|
|
OR GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) = 1.0
|
|
|
|
IF thisSwitchCam.iSwitchAudioCameraMoveLoopID != -1
|
|
IF thisSwitchCam.bSwitchSoundPlayMoveLoop
|
|
STOP_SOUND(thisSwitchCam.iSwitchAudioCameraMoveLoopID)
|
|
thisSwitchCam.iSwitchAudioCameraMoveLoopID = -1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF thisSwitchCam.iSwitchAudioCameraHitOutID = -1
|
|
IF thisSwitchCam.bSwitchSoundPlayExitPulse
|
|
thisSwitchCam.iSwitchAudioCameraHitOutID = GET_SOUND_ID()
|
|
PLAY_SOUND_FRONTEND(thisSwitchCam.iSwitchAudioCameraHitOutID, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Stop all sounds associated with a spline and reset the audio IDs to 0
|
|
/// PARAMS:
|
|
/// thisSwitchCam -
|
|
PROC STOP_ALL_SWITCH_CAM_SOUNDS(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
|
|
PRINTLN("Stopping all switch cam sounds...")
|
|
|
|
STOP_SOUND(thisSwitchCam.iSwitchAudioCameraHitOutID)
|
|
STOP_SOUND(thisSwitchCam.iSwitchAudioCameraHitInID)
|
|
STOP_SOUND(thisSwitchCam.iSwitchAudioCameraMoveLoopID)
|
|
|
|
thisSwitchCam.iSwitchAudioCameraHitOutID = -1
|
|
thisSwitchCam.iSwitchAudioCameraHitInID = -1
|
|
thisSwitchCam.iSwitchAudioCameraMoveLoopID = -1
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// This takes a CLONE_WITH_OFFSET node that copies a gameplay cam and ensures it is updated with the current gameplay cam data.
|
|
/// VERY useful when copying a gameplay cam that happens after a character switch in a spline.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Spline node struct to update the gameplay cam clone for
|
|
/// iNodeIndex - Node of the currently processced gameplay cam struct
|
|
PROC UPDATE_CLONE_NODE_GAMEPLAY_CAM_DATA(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex, BOOL bForceGameplayCamNodeCloneUpdate = FALSE)
|
|
CDEBUG3LN(DEBUG_MISSION, "UPDATE_CLONE_NODE_GAMEPLAY_CAM_DATA. NODE: ", iNodeIndex)
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(thisSwitchCam.nodes) i
|
|
IF (iNodeIndex >= thisSwitchCam.iCamSwitchFocusNode AND i >= thisSwitchCam.iCamSwitchFocusNode)
|
|
OR bForceGameplayCamNodeCloneUpdate
|
|
IF thisSwitchCam.nodes[thisSwitchCam.nodes[i].iNodeToClone].bIsGameplayCamCopy
|
|
OR thisSwitchCam.nodes[thisSwitchCam.nodes[i].iNodeToClone].SwitchCamType = SWITCH_CAM_GAMEPLAY_CAM_COPY
|
|
PRINTLN("Updating Clone Cam Node To Copy Gameplay Cam")
|
|
SET_CAM_COORD(thisSwitchCam.nodes[i].ciSwitchNode, (GET_GAMEPLAY_CAM_COORD() + thisSwitchCam.nodes[i].vClonedNodeOffset))
|
|
SET_CAM_ROT(thisSwitchCam.nodes[i].ciSwitchNode, GET_GAMEPLAY_CAM_ROT())
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create a script camera spline based on the data saved to the Switch Cam Struct
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch Cam Struct to build the switch script cam spline from.
|
|
PROC CREATE_SPLINE_CAM(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
CDEBUG3LN(DEBUG_MISSION, "CREATE_SPLINE_CAM")
|
|
|
|
IF NOT LOAD_CAM_SHAKE_LIBRARIES(thisSwitchCam)
|
|
//SCRIPT_ASSERT("CAM SHAKE ANIM LIBRARIES NOT LOADED! Function F_LOAD_CAM_SHAKE_LIBRARIES must return true before playing this switch cam.")
|
|
ENDIF
|
|
|
|
CAM_SPLINE_NODE_FLAGS ease = CAM_SPLINE_NODE_NO_FLAGS
|
|
thisSwitchCam.bIsSplineCamFinishedPlaying = FALSE
|
|
STOP_ALL_SWITCH_CAM_SOUNDS(thisSwitchCam)
|
|
|
|
INT index
|
|
REPEAT MAX_NUM_SWITCH_NODES index
|
|
thisSwitchCam.nodes[index].bHasFlashed = FALSE
|
|
ENDREPEAT
|
|
|
|
thisSwitchCam.bTimePostFXActive = FALSE
|
|
|
|
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
|
|
DESTROY_CAM(thisSwitchCam.ciSpline)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
thisSwitchCam.bIsApprovedTextDisplayed = FALSE
|
|
#ENDIF
|
|
|
|
thisSwitchCam.ciSpline = CREATE_CAMERA(CAMTYPE_SPLINE_TIMED_CUSTOM, FALSE)
|
|
|
|
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
|
|
|
|
REPEAT thisSwitchCam.iNumNodes index
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT (thisSwitchCam.bRecreateSpline AND index = 0 AND DO_WE_WANT_TO_CLONE_GAMEPLAY_CAM(thisSwitchCam, index)) //[MF] If we're recreating the spline in debug mode, don't recreate an initial node gameplay cam clone.
|
|
#ENDIF
|
|
BUILD_SWITCH_CAM_NODE(thisSwitchCam, index)
|
|
#IF IS_DEBUG_BUILD
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
//[MF] if we're creating a non 0 node gameplay cam copy, attach an actual gameplay cam to the spline. Otherwise we use a cloned gameplay cam.
|
|
IF (thisSwitchCam.nodes[index].bIsGameplayCamCopy OR thisSwitchCam.nodes[index].SwitchCamType = SWITCH_CAM_GAMEPLAY_CAM_COPY)
|
|
IF DO_WE_WANT_TO_CLONE_GAMEPLAY_CAM(thisSwitchCam, index)
|
|
ADD_CAM_SPLINE_NODE_USING_CAMERA(thisSwitchCam.ciSpline, thisSwitchCam.nodes[index].ciSwitchNode, thisSwitchCam.nodes[index].iNodeTime, CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS)
|
|
ELSE
|
|
ADD_CAM_SPLINE_NODE_USING_GAMEPLAY_FRAME(thisSwitchCam.ciSpline, thisSwitchCam.nodes[index].iNodeTime, CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS)
|
|
ENDIF
|
|
ELSE
|
|
ADD_CAM_SPLINE_NODE_USING_CAMERA(thisSwitchCam.ciSpline, thisSwitchCam.nodes[index].ciSwitchNode, thisSwitchCam.nodes[index].iNodeTime, CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT (thisSwitchCam.bRecreateSpline AND index = 0 AND DO_WE_WANT_TO_CLONE_GAMEPLAY_CAM(thisSwitchCam, index)) //[MF] If we're recreating the spline in debug mode, don't recreate an initial node gameplay cam clone.
|
|
#ENDIF
|
|
IF DO_WE_WANT_TO_CLONE_GAMEPLAY_CAM(thisSwitchCam, index)
|
|
ATTACH_GAMEPLAY_CAM_CLONE_TO_ENTITY(thisSwitchCam, index)
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].iCamEaseType > 0
|
|
AND thisSwitchCam.nodes[index].fCamEaseScaler > 0.0
|
|
SWITCH thisSwitchCam.nodes[index].iCamEaseType
|
|
CASE 1
|
|
ease = CAM_SPLINE_NODE_EASE_IN
|
|
BREAK
|
|
CASE 2
|
|
ease = CAM_SPLINE_NODE_EASE_OUT
|
|
BREAK
|
|
CASE 3
|
|
ease = CAM_SPLINE_NODE_EASE_INOUT
|
|
BREAK
|
|
ENDSWITCH
|
|
SET_CAM_SPLINE_NODE_EASE(thisSwitchCam.ciSpline, index, ease, thisSwitchCam.nodes[index].fCamEaseScaler)
|
|
ENDIF
|
|
|
|
INT iSplineNodeExtraValue = 0
|
|
IF thisSwitchCam.nodes[index].bCamEaseForceLinear
|
|
iSplineNodeExtraValue += (ENUM_TO_INT(CAM_SPLINE_NODE_FORCE_LINEAR))
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[index].bCamEaseForceLevel
|
|
iSplineNodeExtraValue += (ENUM_TO_INT(CAM_SPLINE_NODE_FORCE_LEVEL))
|
|
ENDIF
|
|
|
|
SET_CAM_SPLINE_NODE_VELOCITY_SCALE(thisSwitchCam.ciSpline, index, thisSwitchCam.nodes[index].fCamNodeVelocityScale)
|
|
SET_CAM_SPLINE_NODE_EXTRA_FLAGS(thisSwitchCam.ciSpline, index, INT_TO_ENUM(CAM_SPLINE_NODE_FORCE_FLAGS, iSplineNodeExtraValue))
|
|
|
|
ENDREPEAT
|
|
|
|
|
|
IF thisSwitchCam.bAddGameplayCamAsLastNode
|
|
IF thisSwitchCam.iGameplayNodeBlendDuration >= 0
|
|
ADD_CAM_SPLINE_NODE_USING_GAMEPLAY_FRAME(thisSwitchCam.ciSpline, thisSwitchCam.iGameplayNodeBlendDuration, CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.bSplineNoSmoothing
|
|
SET_CAM_SPLINE_SMOOTHING_STYLE(thisSwitchCam.ciSpline, CAM_SPLINE_NO_SMOOTH)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT thisSwitchCam.bDEBUGSplineCam_DisableVelocityOverride
|
|
#ENDIF
|
|
REPEAT MAX_NUM_CAM_VELOCITY_OVERRIDES index
|
|
IF thisSwitchCam.camVelocityOverrides[index].fSpeed > -1
|
|
PRINTLN("Applying Switch Cam Node velocity override...", index)
|
|
OVERRIDE_CAM_SPLINE_VELOCITY(thisSwitchCam.ciSpline, index, thisSwitchCam.camVelocityOverrides[index].fStartPoint, thisSwitchCam.camVelocityOverrides[index].fSpeed)
|
|
ENDIF
|
|
ENDREPEAT
|
|
#IF IS_DEBUG_BUILD
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
REPEAT MAX_NUM_CAM_BLUR_OVERRIDES index
|
|
OVERRIDE_CAM_SPLINE_MOTION_BLUR(thisSwitchCam.ciSpline, index, thisSwitchCam.camBlurOverrides[index].fBlurOverrideStartPoint, thisSwitchCam.camBlurOverrides[index].fBlurOverrideBlurLevel)
|
|
ENDREPEAT
|
|
|
|
//[MF] Fix motion blur so it better matches what we need for the switch cams.
|
|
ALLOW_MOTION_BLUR_DECAY(thisSwitchCam.ciSpline, FALSE)
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC FLOAT SLOW_IN_INTERP(FLOAT fVal1, FLOAT fVal2, FLOAT fAlpha)
|
|
FLOAT alpha2 = (1.0 - COS(RAD_TO_DEG(fAlpha * CONST_PI* 0.5)))
|
|
RETURN fVal1*(1.0 - alpha2) + fVal2*alpha2
|
|
ENDFUNC
|
|
|
|
|
|
FUNC FLOAT SLOW_OUT_INTERP(FLOAT fVal1, FLOAT fVal2, FLOAT fAlpha)
|
|
FLOAT alpha2 = (SIN(RAD_TO_DEG(fAlpha * CONST_PI* 0.5)))
|
|
RETURN fVal1*(1.0 - alpha2) + fVal2*alpha2
|
|
ENDFUNC
|
|
|
|
FUNC FLOAT SLOW_INOUT_INTERP(FLOAT fVal1, FLOAT fVal2, FLOAT fAlpha)
|
|
FLOAT alpha2 = 0.5*(1.0 - COS(RAD_TO_DEG(fAlpha * CONST_PI)))
|
|
RETURN fVal1*(1.0 - alpha2) + fVal2*alpha2
|
|
ENDFUNC
|
|
|
|
FLOAT fCurrentLerp = 1.0
|
|
/// PURPOSE:
|
|
/// Process logic to be played during the spline cam. This handles things like Post FX, DOF, Animated camera shake and other effects.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to process
|
|
/// RETURNS:
|
|
/// Index of currently active camera node in spline.
|
|
FUNC INT UPDATE_SPLINE_CAM(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
//CDEBUG3LN(DEBUG_MISSION, "UPDATE_SWITCH_CAM")
|
|
|
|
|
|
INT iIndex = GET_CAM_SPLINE_NODE_INDEX(thisSwitchCam.ciSpline)
|
|
|
|
//[MF] Have to grab the index of the next cam node as the widget layout makes that node effects appear to apply to the incorrect node.
|
|
//[MF] EG. If we're shown as being on node 2 in the debug widget, GET_CAM_SPLINE_NODE_INDEX still returns Node 1
|
|
INT iIndexOffset = GET_CAM_SPLINE_NODE_INDEX(thisSwitchCam.ciSpline) + 1
|
|
|
|
//[MF] Safety to ensure we don't get an array overrun error
|
|
IF iIndexOffset > thisSwitchCam.iNumNodes
|
|
iIndexOffset = thisSwitchCam.iNumNodes
|
|
ENDIF
|
|
|
|
//[MF] Matt P logic to handle camera time scaler ease types
|
|
IF iIndexOffset < thisSwitchCam.iNumNodes - 1
|
|
SWITCH thisSwitchCam.nodes[iIndexOffset].iTimeScaleEaseType
|
|
CASE 0
|
|
fCurrentLerp = LERP_FLOAT(thisSwitchCam.nodes[iIndexOffset].fTimeScale, thisSwitchCam.nodes[iIndexOffset + 1].fTimeScale, GET_CAM_SPLINE_NODE_PHASE(thisSwitchCam.ciSpline) )
|
|
BREAK
|
|
CASE 1
|
|
fCurrentLerp = SLOW_IN_INTERP(thisSwitchCam.nodes[iIndexOffset].fTimeScale, thisSwitchCam.nodes[iIndexOffset + 1].fTimeScale, CLAMP((GET_CAM_SPLINE_NODE_PHASE(thisSwitchCam.ciSpline) * (1 / thisSwitchCam.nodes[iIndexOffset].fTimeScaleEaseScaler)), 0.0, 1.0 ))
|
|
BREAK
|
|
CASE 2
|
|
fCurrentLerp = SLOW_OUT_INTERP(thisSwitchCam.nodes[iIndexOffset].fTimeScale, thisSwitchCam.nodes[iIndexOffset + 1].fTimeScale, CLAMP((GET_CAM_SPLINE_NODE_PHASE(thisSwitchCam.ciSpline) * (1 / thisSwitchCam.nodes[iIndexOffset].fTimeScaleEaseScaler)), 0.0, 1.0 ) )
|
|
BREAK
|
|
CASE 3
|
|
fCurrentLerp = SLOW_INOUT_INTERP(thisSwitchCam.nodes[iIndexOffset].fTimeScale, thisSwitchCam.nodes[iIndexOffset + 1].fTimeScale, CLAMP((GET_CAM_SPLINE_NODE_PHASE(thisSwitchCam.ciSpline) * (1 / thisSwitchCam.nodes[iIndexOffset].fTimeScaleEaseScaler)), 0.0, 1.0 ) )
|
|
BREAK
|
|
ENDSWITCH
|
|
SET_TIME_SCALE(fCurrentLerp)
|
|
ELSE
|
|
SET_TIME_SCALE(1.0)
|
|
ENDIF
|
|
|
|
//[MF] Make sure clone node is accurately representing gameplay cam data.
|
|
IF thisSwitchCam.nodes[iIndex].SwitchCamType = SWITCH_CAM_CLONE_NODE_WITH_OFFSET
|
|
UPDATE_CLONE_NODE_GAMEPLAY_CAM_DATA(thisSwitchCam, iIndex)
|
|
ENDIF
|
|
|
|
//[MF] Handle camera post FX types.
|
|
IF NOT thisSwitchCam.nodes[iIndexOffset].bHaveNodePostFX_BeenApplied
|
|
IF thisSwitchCam.nodes[iIndexOffset].NodeTimePostFX_Type != NO_EFFECT
|
|
IF NOT thisSwitchCam.bTimePostFXActive //[MF] If we're not yet playing a POST FX.
|
|
OR (iIndexOffset > 1 and (thisSwitchCam.nodes[iIndex].NodeTimePostFX_Type != thisSwitchCam.nodes[iIndexOffset].NodeTimePostFX_Type)) //[MF] Check if the previous effect doesn't match the current nodes effects (we've moved to a different effect)
|
|
IF GET_CAM_SPLINE_NODE_PHASE(thisSwitchCam.ciSpline) >= thisSwitchCam.nodes[iIndexOffset].fNodeTimePostFXTimeOffset
|
|
|
|
STRING sPostFX_Name
|
|
|
|
SWITCH thisSwitchCam.nodes[iIndexOffset].NodeTimePostFX_Type
|
|
CASE SEPIA_EFFECT
|
|
sPostFX_Name = "switch_cam_2"
|
|
BREAK
|
|
CASE SCANLINE_EFFECT
|
|
sPostFX_Name = "switch_cam_1"
|
|
BREAK
|
|
CASE APFX_SWITCH_HUD_IN
|
|
sPostFX_Name = "SwitchHUDIn"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SWITCH thisSwitchCam.nodes[iIndexOffset].NodeTimePostFX_Type
|
|
//[MF] Handle time Post FX
|
|
CASE SEPIA_EFFECT
|
|
CASE SCANLINE_EFFECT
|
|
|
|
BLEND_OUT_FROM_SWITCH_CAM_APFX(thisSwitchCam, iIndexOffset)
|
|
|
|
IF thisSwitchCam.nodes[iIndexOffset].fNodeTimePostFXBlendTime > 0
|
|
CDEBUG3LN(DEBUG_MISSION, "APPLYING TIME POSTFX. Index: ",iIndexOffset)
|
|
SET_TRANSITION_TIMECYCLE_MODIFIER(sPostFX_Name, thisSwitchCam.nodes[iIndexOffset].fNodeTimePostFXBlendTime)
|
|
ELSE
|
|
CDEBUG3LN(DEBUG_MISSION, "APPLYING TIME POSTFX. Index: ",iIndexOffset)
|
|
SET_TIMECYCLE_MODIFIER(sPostFX_Name)
|
|
ENDIF
|
|
BREAK
|
|
|
|
//[MF] Handle Anim Post FX
|
|
CASE APFX_SWITCH_HUD_IN
|
|
BLEND_OUT_FROM_SWITCH_CAM_APFX(thisSwitchCam, iIndexOffset)
|
|
CDEBUG3LN(DEBUG_MISSION, "APPLYING ANIM POSTFX. Index: ",iIndexOffset)
|
|
ANIMPOSTFX_PLAY(sPostFX_Name, FLOOR(1000* thisSwitchCam.nodes[iIndexOffset].fNodeTimePostFXBlendTime), FALSE)
|
|
BREAK
|
|
ENDSWITCH
|
|
thisSwitchCam.bTimePostFXActive = TRUE
|
|
thisSwitchCam.nodes[iIndexOffset].bHaveNodePostFX_BeenApplied = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
//[MF] Handle the cancelling of previously selected effects
|
|
IF thisSwitchCam.bTimePostFXActive
|
|
IF GET_CAM_SPLINE_NODE_PHASE(thisSwitchCam.ciSpline) >= thisSwitchCam.nodes[iIndexOffset].fNodeTimePostFXTimeOffset
|
|
IF GET_TIMECYCLE_MODIFIER_INDEX() != -1
|
|
CDEBUG3LN(DEBUG_MISSION, "TIME CYCLE OUTPUT TEST: REMOVING TIME POST FX. Index: ", iIndexOffset)
|
|
SET_TRANSITION_OUT_OF_TIMECYCLE_MODIFIER(thisSwitchCam.nodes[iIndexOffset].fNodeTimePostFXBlendTime)
|
|
thisSwitchCam.bTimePostFXActive = FALSE
|
|
thisSwitchCam.nodes[iIndexOffset].bHaveNodePostFX_BeenApplied = TRUE
|
|
ELIF NOT ARE_STRINGS_EQUAL(GET_NAME_OF_ACTIVE_ANIM_POST_FX(), "")
|
|
|
|
BLEND_OUT_FROM_SWITCH_CAM_APFX(thisSwitchCam, iIndexOffset)
|
|
|
|
thisSwitchCam.bTimePostFXActive = FALSE
|
|
thisSwitchCam.nodes[iIndexOffset].bHaveNodePostFX_BeenApplied = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//visual fx
|
|
IF thisSwitchCam.nodes[iIndexOffset].bFlashEnabled
|
|
IF NOT thisSwitchCam.nodes[iIndexOffset].bHasFlashed
|
|
IF GET_CAM_SPLINE_NODE_PHASE(thisSwitchCam.ciSpline) >= thisSwitchCam.nodes[iIndexOffset].fFlashNodePhaseOffset
|
|
PRINTLN("Playing Node Flash...")
|
|
PLAY_SWITCH_CAM_NODE_FLASH(thisSwitchCam, iIndexOffset)
|
|
thisSwitchCam.nodes[iIndexOffset].bHasFlashed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//[MF] If we miss a flash due to a frame rate issue, play the skipped flash as soon as possible.
|
|
IF thisSwitchCam.nodes[iIndex].bFlashEnabled
|
|
IF NOT thisSwitchCam.nodes[iIndex].bHasFlashed
|
|
PRINTLN("Playing Skipped Node Flash...")
|
|
PLAY_SWITCH_CAM_NODE_FLASH(thisSwitchCam, iIndex)
|
|
thisSwitchCam.nodes[iIndex].bHasFlashed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RESET_ADAPTATION()
|
|
|
|
//[MF] Handle Camera Node Effects
|
|
IF iIndexOffset < thisSwitchCam.iNumNodes - 1
|
|
|
|
//[MF] Camera shakes
|
|
IF NOT thisSwitchCam.nodes[iIndexOffset].bHaveNodeSettingsBeenApplied
|
|
STRING CamShake
|
|
STRING CamShakeLib
|
|
|
|
//[MF] So cam shakes won't persist through cut nodes
|
|
IF thisSwitchCam.nodes[iIndexOffset].bIsCamCutNode
|
|
STOP_CAM_SHAKING(thisSwitchCam.nodes[iIndexOffset].ciSwitchNode, TRUE)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[iIndexOffset].NodeCamShakeType != CAM_SHAKE_DEFAULT
|
|
CamShakeLib = "shake_cam_all@"
|
|
IF thisSwitchCam.nodes[iIndexOffset].NodeCamShakeType = CAM_SHAKE_LIGHT
|
|
CamShake = "light"
|
|
ELIF thisSwitchCam.nodes[iIndexOffset].NodeCamShakeType = CAM_SHAKE_MEDIUM
|
|
CamShake = "medium"
|
|
ELIF thisSwitchCam.nodes[iIndexOffset].NodeCamShakeType = CAM_SHAKE_HEAVY
|
|
CamShake = "heavy"
|
|
ENDIF
|
|
|
|
ANIMATED_SHAKE_CAM(thisSwitchCam.nodes[iIndexOffset].ciSwitchNode, CamShakeLib, CamShake, "", thisSwitchCam.nodes[iIndexOffset].fNodeCamShake)
|
|
ELSE
|
|
SHAKE_CAM(thisSwitchCam.ciSpline, "SKY_DIVING_SHAKE", thisSwitchCam.nodes[iIndexOffset].fNodeCamShake)
|
|
ENDIF
|
|
|
|
|
|
|
|
thisSwitchCam.nodes[iIndexOffset].bHaveNodeSettingsBeenApplied = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//[MF] Low/Regular detail nodes.
|
|
IF thisSwitchCam.nodes[iIndex].bIsLowDetailNode
|
|
SET_TO_LOW_DETAIL_RENDERING()
|
|
ELSE
|
|
SET_TO_DEFAULT_DETAIL_RENDERING()
|
|
ENDIF
|
|
|
|
BOOL bUseHighDOF
|
|
|
|
//[MF] Check if the next node uses custom DOF so we can start interpolating to that value
|
|
IF GET_CAM_SPLINE_NODE_INDEX(thisSwitchCam.ciSpline) < thisSwitchCam.iNumNodes
|
|
IF thisSwitchCam.nodes[GET_CAM_SPLINE_NODE_INDEX(thisSwitchCam.ciSpline) + 1].bUseCustomDOF
|
|
bUseHighDOF = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//[MF] check if current Node uses custom DOF
|
|
IF thisSwitchCam.nodes[GET_CAM_SPLINE_NODE_INDEX(thisSwitchCam.ciSpline)].bUseCustomDOF
|
|
bUseHighDOF = TRUE
|
|
ENDIF
|
|
|
|
//[MF] Set the cam to use High Quality DOF (must be set every frame)
|
|
IF bUseHighDOF
|
|
SET_USE_HI_DOF()
|
|
ENDIF
|
|
|
|
HANDLE_CUSTOM_SWITCH_CAM_AUDIO(thisSwitchCam)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT thisSwitchCam.bIsApproved
|
|
IF NOT thisSwitchCam.bIsApprovedTextDisplayed
|
|
//DISPLAY_TEXT_WITH_LITERAL_STRING(0.77, 0.84, "STRING", "Unapproved")
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
RETURN iIndex //[MF] Returning actual cam node we're on.
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Check if the switch cam or any of it's nodes exist
|
|
/// PARAMS:
|
|
/// thisSwitchCam -
|
|
/// RETURNS:
|
|
/// TRUE if Switch cam exists or if ANY of it's nodes are still existing
|
|
FUNC BOOL DOES_SWITCH_CAM_EXIST(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
BOOL bDoesCamExist = FALSE
|
|
|
|
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
|
|
bDoesCamExist = TRUE
|
|
ENDIF
|
|
|
|
INT i
|
|
|
|
REPEAT COUNT_OF(thisSwitchCam.nodes) i
|
|
DOES_CAM_EXIST(thisSwitchCam.nodes[i].ciSwitchNode)
|
|
bDoesCamExist = TRUE
|
|
ENDREPEAT
|
|
|
|
RETURN bDoesCamExist
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Destroy all the cam indexes in the switch cam. The spline itself and each of it's nodes. NOTE: This does not reset the switch cam data.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam to destroy
|
|
PROC DESTROY_SWITCH_CAM(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
|
|
INT i
|
|
|
|
REPEAT COUNT_OF(thisSwitchCam.nodes) i
|
|
DESTROY_CAM(thisSwitchCam.nodes[i].ciSwitchNode)
|
|
ENDREPEAT
|
|
|
|
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
|
|
DESTROY_CAM(thisSwitchCam.ciSpline)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
/// PURPOSE:
|
|
/// Create a spline cam widget using our old style of widget. CAUTION: These contain several inputs that can contridict each other.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to build the widget from
|
|
/// iNodeIndex - Index of the camera
|
|
PROC CREATE_SPLINE_CAM_WIDGET_OLD_STYLE(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
ADD_WIDGET_INT_SLIDER("Cam Time", thisSwitchCam.nodes[iNodeIndex].iNodeTime, 0, 20000, 25)
|
|
ADD_WIDGET_BOOL("Is Gameplay Cam Copy", thisSwitchCam.nodes[iNodeIndex].bIsGameplayCamCopy)
|
|
START_WIDGET_GROUP("Camera Position and Orientation")
|
|
ADD_WIDGET_VECTOR_SLIDER("Positon", thisSwitchCam.nodes[iNodeIndex].vNodePos, -100000.0, 100000.0, 1.0)
|
|
ADD_WIDGET_BOOL("Point at subject", thisSwitchCam.nodes[iNodeIndex].bPointAtEntity)
|
|
ADD_WIDGET_BOOL("Point At Offset Is Relative", thisSwitchCam.nodes[iNodeIndex].bPointAtOffsetIsRelative)
|
|
ADD_WIDGET_BOOL("Attach Offset Is Relative", thisSwitchCam.nodes[iNodeIndex].bAttachOffsetIsRelative)
|
|
ADD_WIDGET_VECTOR_SLIDER("Direction", thisSwitchCam.nodes[iNodeIndex].vNodeDir, -10000.0, 10000.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("FOV", thisSwitchCam.nodes[iNodeIndex].fNodeFOV, 0.0, 360.0, 1.0)
|
|
ADD_WIDGET_INT_SLIDER("Look At Entity Index Override", thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex, -1, (NUM_SWITCH_ENTITIES - 1), 1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_POST_FX_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("Motion Blur", thisSwitchCam.nodes[iNodeIndex].fNodeMotionBlur, 0.0, 1.0, 0.01)
|
|
|
|
CREATE_SPLINE_CAM_SHAKE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
IF iNodeIndex > 0 AND iNodeIndex < (thisSwitchCam.iNumNodes - 1) //[MF] Ensure that the first or last node of a cam can't be set as a jump-cut node.
|
|
ADD_WIDGET_BOOL("Is Jump-Cut Node", thisSwitchCam.nodes[iNodeIndex].bIsCamCutNode)
|
|
ENDIF
|
|
|
|
CREATE_SPLINE_CAM_EASE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Time Scale")
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScale, 0.0, 12.0, 0.01)
|
|
CREATE_SPLINE_CAM_TIME_EASE_COMBO(thisSwitchCam.nodes[iNodeIndex].iTimeScaleEaseType)
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Ease Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScaleEaseScaler, 0.0, 2.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_FLASH_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
CREATE_SPLINE_CAM_DOF_WIDGET_GROUP(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_BOOL("Is Low Detail Node", thisSwitchCam.nodes[iNodeIndex].bIsLowDetailNode)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create a spline cam widget for an entity attached camera node
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to build the widget from
|
|
/// iNodeIndex - Index of the camera
|
|
PROC CREATE_SPLINE_CAM_WIDGET_ATTACHED_CAM(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
ADD_WIDGET_INT_SLIDER("Cam Time", thisSwitchCam.nodes[iNodeIndex].iNodeTime, 0, 20000, 25)
|
|
START_WIDGET_GROUP("Camera Position and Orientation")
|
|
ADD_WIDGET_VECTOR_SLIDER("Positon", thisSwitchCam.nodes[iNodeIndex].vNodePos, -100000.0, 100000.0, 1.0)
|
|
ADD_WIDGET_BOOL("Point at subject", thisSwitchCam.nodes[iNodeIndex].bPointAtEntity)
|
|
ADD_WIDGET_BOOL("Point At Offset Is Relative", thisSwitchCam.nodes[iNodeIndex].bPointAtOffsetIsRelative)
|
|
ADD_WIDGET_BOOL("Attach Offset Is Relative", thisSwitchCam.nodes[iNodeIndex].bAttachOffsetIsRelative)
|
|
ADD_WIDGET_VECTOR_SLIDER("Direction", thisSwitchCam.nodes[iNodeIndex].vNodeDir, -10000.0, 10000.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("FOV", thisSwitchCam.nodes[iNodeIndex].fNodeFOV, 0.0, 360.0, 1.0)
|
|
ADD_WIDGET_INT_SLIDER("Look At Entity Index Override", thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex, -1, (NUM_SWITCH_ENTITIES - 1), 1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_POST_FX_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("Motion Blur", thisSwitchCam.nodes[iNodeIndex].fNodeMotionBlur, 0.0, 1.0, 0.01)
|
|
|
|
CREATE_SPLINE_CAM_SHAKE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
IF iNodeIndex > 0 AND iNodeIndex < (thisSwitchCam.iNumNodes - 1) //[MF] Ensure that the first or last node of a cam can't be set as a jump-cut node.
|
|
ADD_WIDGET_BOOL("Is Jump-Cut Node", thisSwitchCam.nodes[iNodeIndex].bIsCamCutNode)
|
|
ENDIF
|
|
|
|
CREATE_SPLINE_CAM_EASE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Time Scale")
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScale, 0.0, 12.0, 0.01)
|
|
CREATE_SPLINE_CAM_TIME_EASE_COMBO(thisSwitchCam.nodes[iNodeIndex].iTimeScaleEaseType)
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Ease Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScaleEaseScaler, 0.0, 2.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_FLASH_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
CREATE_SPLINE_CAM_DOF_WIDGET_GROUP(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_BOOL("Is Low Detail Node", thisSwitchCam.nodes[iNodeIndex].bIsLowDetailNode)
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Create a spline cam widget for an entity attached camera node
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to build the widget from
|
|
/// iNodeIndex - Index of the camera
|
|
PROC CREATE_SPLINE_CAM_WIDGET_ATTACHED_CAM_W_WORLD_LOOK_AT(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
IF thisSwitchCam.nodes[iNodeIndex].bIsGameplayCamCopy
|
|
PRINTLN("Creating Entity Attached With World Look At Cam. Disabling Gameplay cam copy for node: ", iNodeIndex)
|
|
thisSwitchCam.nodes[iNodeIndex].bIsGameplayCamCopy = FALSE
|
|
ENDIF
|
|
|
|
ADD_WIDGET_INT_SLIDER("Cam Time", thisSwitchCam.nodes[iNodeIndex].iNodeTime, 0, 20000, 25)
|
|
START_WIDGET_GROUP("Camera Position and Orientation")
|
|
ADD_WIDGET_VECTOR_SLIDER("Positon", thisSwitchCam.nodes[iNodeIndex].vNodePos, -100000.0, 100000.0, 1.0)
|
|
ADD_WIDGET_BOOL("Attach Offset Is Relative", thisSwitchCam.nodes[iNodeIndex].bAttachOffsetIsRelative)
|
|
ADD_WIDGET_VECTOR_SLIDER("World Look At Coord", thisSwitchCam.nodes[iNodeIndex].vWorldPosLookAt, -10000.0, 10000.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("FOV", thisSwitchCam.nodes[iNodeIndex].fNodeFOV, 0.0, 360.0, 1.0)
|
|
ADD_WIDGET_INT_SLIDER("Look At Entity Index Override", thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex, -1, (NUM_SWITCH_ENTITIES - 1), 1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_POST_FX_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("Motion Blur", thisSwitchCam.nodes[iNodeIndex].fNodeMotionBlur, 0.0, 1.0, 0.01)
|
|
|
|
CREATE_SPLINE_CAM_SHAKE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
IF iNodeIndex > 0 AND iNodeIndex < (thisSwitchCam.iNumNodes - 1) //[MF] Ensure that the first or last node of a cam can't be set as a jump-cut node.
|
|
ADD_WIDGET_BOOL("Is Jump-Cut Node", thisSwitchCam.nodes[iNodeIndex].bIsCamCutNode)
|
|
ENDIF
|
|
|
|
CREATE_SPLINE_CAM_EASE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Time Scale")
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScale, 0.0, 12.0, 0.01)
|
|
CREATE_SPLINE_CAM_TIME_EASE_COMBO(thisSwitchCam.nodes[iNodeIndex].iTimeScaleEaseType)
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Ease Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScaleEaseScaler, 0.0, 2.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_FLASH_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
CREATE_SPLINE_CAM_DOF_WIDGET_GROUP(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_BOOL("Is Low Detail Node", thisSwitchCam.nodes[iNodeIndex].bIsLowDetailNode)
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Create a spline cam widget for a Gameplay cam copy node
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to build the widget from
|
|
/// iNodeIndex - Index of the camera
|
|
PROC CREATE_SPLINE_CAM_WIDGET_GAMEPLAY_CAM_COPY(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
ADD_WIDGET_INT_SLIDER("Cam Time", thisSwitchCam.nodes[iNodeIndex].iNodeTime, 0, 20000, 25)
|
|
ADD_WIDGET_FLOAT_SLIDER("Motion Blur", thisSwitchCam.nodes[iNodeIndex].fNodeMotionBlur, 0.0, 1.0, 0.01)
|
|
|
|
CREATE_SPLINE_CAM_SHAKE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
CREATE_SPLINE_CAM_POST_FX_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
IF iNodeIndex > 0 AND iNodeIndex < (thisSwitchCam.iNumNodes - 1) //[MF] Ensure that the first or last node of a cam can't be set as a jump-cut node.
|
|
ADD_WIDGET_BOOL("Is Jump-Cut Node", thisSwitchCam.nodes[iNodeIndex].bIsCamCutNode)
|
|
ENDIF
|
|
|
|
CREATE_SPLINE_CAM_EASE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Time Scale")
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScale, 0.0, 12.0, 0.01)
|
|
CREATE_SPLINE_CAM_TIME_EASE_COMBO(thisSwitchCam.nodes[iNodeIndex].iTimeScaleEaseType)
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Ease Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScaleEaseScaler, 0.0, 2.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_FLASH_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
CREATE_SPLINE_CAM_DOF_WIDGET_GROUP(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_BOOL("Is Low Detail Node", thisSwitchCam.nodes[iNodeIndex].bIsLowDetailNode)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create a spline cam widget for a world position cam node
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to build the widget from
|
|
/// iNodeIndex - Index of the camera
|
|
PROC CREATE_SPLINE_CAM_WIDGET_WORLD_POS(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
ADD_WIDGET_INT_SLIDER("Cam Time", thisSwitchCam.nodes[iNodeIndex].iNodeTime, 0, 20000, 25)
|
|
START_WIDGET_GROUP("Camera Position and Orientation")
|
|
ADD_WIDGET_VECTOR_SLIDER("Positon", thisSwitchCam.nodes[iNodeIndex].vNodePos, -10000.0, 10000.0, 1.0)
|
|
ADD_WIDGET_VECTOR_SLIDER("Direction", thisSwitchCam.nodes[iNodeIndex].vNodeDir, -10000.0, 10000.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("FOV", thisSwitchCam.nodes[iNodeIndex].fNodeFOV, 0.0, 360.0, 1.0)
|
|
ADD_WIDGET_BOOL("Point at subject", thisSwitchCam.nodes[iNodeIndex].bPointAtEntity)
|
|
ADD_WIDGET_BOOL("Point At Offset Is Relative", thisSwitchCam.nodes[iNodeIndex].bPointAtOffsetIsRelative)
|
|
ADD_WIDGET_INT_SLIDER("Look At Entity Index Override", thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex, -1, (NUM_SWITCH_ENTITIES - 1), 1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_POST_FX_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("Motion Blur", thisSwitchCam.nodes[iNodeIndex].fNodeMotionBlur, 0.0, 1.0, 0.01)
|
|
CREATE_SPLINE_CAM_SHAKE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
IF iNodeIndex > 0 AND iNodeIndex < (thisSwitchCam.iNumNodes - 1) //[MF] Ensure that the first or last node of a cam can't be set as a jump-cut node.
|
|
ADD_WIDGET_BOOL("Is Jump-Cut Node", thisSwitchCam.nodes[iNodeIndex].bIsCamCutNode)
|
|
ENDIF
|
|
|
|
CREATE_SPLINE_CAM_EASE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Time Scale")
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScale, 0.0, 12.0, 0.01)
|
|
CREATE_SPLINE_CAM_TIME_EASE_COMBO(thisSwitchCam.nodes[iNodeIndex].iTimeScaleEaseType)
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Ease Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScaleEaseScaler, 0.0, 2.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_FLASH_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
CREATE_SPLINE_CAM_DOF_WIDGET_GROUP(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_BOOL("Is Low Detail Node", thisSwitchCam.nodes[iNodeIndex].bIsLowDetailNode)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create a spline cam widget for a world position cam node that tracks and looks at a world coord
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to build the widget from
|
|
/// iNodeIndex - Index of the camera
|
|
PROC CREATE_SPLINE_CAM_WIDGET_WORLD_POS_WITH_LOOK_AT(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
ADD_WIDGET_INT_SLIDER("Cam Time", thisSwitchCam.nodes[iNodeIndex].iNodeTime, 0, 20000, 25)
|
|
START_WIDGET_GROUP("Camera Position and Orientation")
|
|
ADD_WIDGET_VECTOR_SLIDER("Look at Coord", thisSwitchCam.nodes[iNodeIndex].vWorldPosLookAt, -10000.0, 10000.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("Offset", thisSwitchCam.nodes[iNodeIndex].fNodeOffsetDist, 0.0, 100.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("FOV", thisSwitchCam.nodes[iNodeIndex].fNodeFOV, 0.0, 360.0, 1.0)
|
|
ADD_WIDGET_INT_SLIDER("Look At Entity Index Override", thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex, -1, (NUM_SWITCH_ENTITIES - 1), 1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_POST_FX_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("Motion Blur", thisSwitchCam.nodes[iNodeIndex].fNodeMotionBlur, 0.0, 1.0, 0.01)
|
|
|
|
CREATE_SPLINE_CAM_SHAKE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
IF iNodeIndex > 0 AND iNodeIndex < (thisSwitchCam.iNumNodes - 1) //[MF] Ensure that the first or last node of a cam can't be set as a jump-cut node.
|
|
ADD_WIDGET_BOOL("Is Jump-Cut Node", thisSwitchCam.nodes[iNodeIndex].bIsCamCutNode)
|
|
ENDIF
|
|
|
|
CREATE_SPLINE_CAM_EASE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Time Scale")
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScale, 0.0, 12.0, 0.01)
|
|
CREATE_SPLINE_CAM_TIME_EASE_COMBO(thisSwitchCam.nodes[iNodeIndex].iTimeScaleEaseType)
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Ease Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScaleEaseScaler, 0.0, 2.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_FLASH_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
CREATE_SPLINE_CAM_DOF_WIDGET_GROUP(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_BOOL("Is Low Detail Node", thisSwitchCam.nodes[iNodeIndex].bIsLowDetailNode)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create a spline cam widget for a path relative cam node that sets a position along the gameplay camera forward from gameplay camera to target.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to build the widget from
|
|
/// iNodeIndex - Index of the camera
|
|
PROC CREATE_SPLINE_CAM_WIDGET_PATH_RELATIVE(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
ADD_WIDGET_INT_SLIDER("Cam Time", thisSwitchCam.nodes[iNodeIndex].iNodeTime, 0, 20000, 25)
|
|
START_WIDGET_GROUP("Camera Offset and FOV")
|
|
ADD_WIDGET_FLOAT_SLIDER("Distance Offset", thisSwitchCam.nodes[iNodeIndex].fNodeOffsetDist, 0.0, 100.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("FOV", thisSwitchCam.nodes[iNodeIndex].fNodeFOV, 0.0, 360.0, 1.0)
|
|
ADD_WIDGET_INT_SLIDER("Look At Entity Index Override", thisSwitchCam.nodes[iNodeIndex].iForceCamPointAtEntityIndex, -1, (NUM_SWITCH_ENTITIES - 1), 1)
|
|
ADD_WIDGET_VECTOR_SLIDER("Attach Position Offset", thisSwitchCam.nodes[iNodeIndex].vClonedNodeOffset, -10.0, 10.0, 0.1) //[MF] Bit of a hack to fix issue with cam being too high
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_POST_FX_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("Motion Blur", thisSwitchCam.nodes[iNodeIndex].fNodeMotionBlur, 0.0, 1.0, 0.01)
|
|
CREATE_SPLINE_CAM_SHAKE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
IF iNodeIndex > 0 AND iNodeIndex < (thisSwitchCam.iNumNodes - 1) //[MF] Ensure that the first or last node of a cam can't be set as a jump-cut node.
|
|
ADD_WIDGET_BOOL("Is Jump-Cut Node", thisSwitchCam.nodes[iNodeIndex].bIsCamCutNode)
|
|
ENDIF
|
|
|
|
CREATE_SPLINE_CAM_EASE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Time Scale")
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScale, 0.0, 12.0, 0.01)
|
|
CREATE_SPLINE_CAM_TIME_EASE_COMBO(thisSwitchCam.nodes[iNodeIndex].iTimeScaleEaseType)
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Ease Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScaleEaseScaler, 0.0, 2.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_FLASH_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
CREATE_SPLINE_CAM_DOF_WIDGET_GROUP(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_BOOL("Is Low Detail Node", thisSwitchCam.nodes[iNodeIndex].bIsLowDetailNode)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create a widget for a Path Relative cam that is attached to a ped, but looking at a world coord
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to create the widget for
|
|
/// iNodeIndex - Node of the struct to contruct the widget from
|
|
PROC CREATE_SPLINE_CAM_WIDGET_PATH_RELATIVE_PED_TO_WORLD_COORD(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
ADD_WIDGET_INT_SLIDER("Cam Time", thisSwitchCam.nodes[iNodeIndex].iNodeTime, 0, 20000, 25)
|
|
START_WIDGET_GROUP("Camera Offset and FOV")
|
|
ADD_WIDGET_VECTOR_SLIDER("Cam Look-At Coord", thisSwitchCam.nodes[iNodeIndex].vWorldPosLookAt, -10000.0, 10000.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("Cam Radius Offset From Origin Ped", thisSwitchCam.nodes[iNodeIndex].fNodeOffsetDist, -100.0, 100.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Cam Height Offset From Origin Ped", thisSwitchCam.nodes[iNodeIndex].fNodeVerticleOffset, -100.0, 100.0, 0.5)
|
|
ADD_WIDGET_FLOAT_SLIDER("FOV", thisSwitchCam.nodes[iNodeIndex].fNodeFOV, 0.0, 360.0, 1.0)
|
|
ADD_WIDGET_BOOL("Attach to origin Ped", thisSwitchCam.nodes[iNodeIndex].bAttachToOriginPed)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_POST_FX_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("Motion Blur", thisSwitchCam.nodes[iNodeIndex].fNodeMotionBlur, 0.0, 1.0, 0.01)
|
|
CREATE_SPLINE_CAM_SHAKE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
IF iNodeIndex > 0 AND iNodeIndex < (thisSwitchCam.iNumNodes - 1) //[MF] Ensure that the first or last node of a cam can't be set as a jump-cut node.
|
|
ADD_WIDGET_BOOL("Is Jump-Cut Node", thisSwitchCam.nodes[iNodeIndex].bIsCamCutNode)
|
|
ENDIF
|
|
|
|
CREATE_SPLINE_CAM_EASE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Time Scale")
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScale, 0.0, 12.0, 0.01)
|
|
CREATE_SPLINE_CAM_TIME_EASE_COMBO(thisSwitchCam.nodes[iNodeIndex].iTimeScaleEaseType)
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Ease Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScaleEaseScaler, 0.0, 2.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_FLASH_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
CREATE_SPLINE_CAM_DOF_WIDGET_GROUP(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_BOOL("Is Low Detail Node", thisSwitchCam.nodes[iNodeIndex].bIsLowDetailNode)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create a widget for a Path Relative cam that is attached to a ped, but looking at a world coord
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to create the widget for
|
|
/// iNodeIndex - Node of the struct to contruct the widget from
|
|
PROC CREATE_SPLINE_CAM_WIDGET_CLONE_NODE_WITH_OFFSET(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
ADD_WIDGET_INT_SLIDER("Cam Time", thisSwitchCam.nodes[iNodeIndex].iNodeTime, 0, 20000, 25)
|
|
START_WIDGET_GROUP("Camera Position and Orientation")
|
|
ADD_WIDGET_INT_SLIDER("Node Index To Clone From", thisSwitchCam.nodes[iNodeIndex].iNodeToClone, 0, (thisSwitchCam.iNumNodes -1), 1)
|
|
ADD_WIDGET_VECTOR_SLIDER("Offset From Cloned Node", thisSwitchCam.nodes[iNodeIndex].vClonedNodeOffset, -1000.0, 1000.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_POST_FX_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_FLOAT_SLIDER("Motion Blur", thisSwitchCam.nodes[iNodeIndex].fNodeMotionBlur, 0.0, 1.0, 0.01)
|
|
|
|
CREATE_SPLINE_CAM_SHAKE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
CREATE_SPLINE_CAM_EASE_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
START_WIDGET_GROUP("Time Scale")
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScale, 0.0, 12.0, 0.01)
|
|
CREATE_SPLINE_CAM_TIME_EASE_COMBO(thisSwitchCam.nodes[iNodeIndex].iTimeScaleEaseType)
|
|
ADD_WIDGET_FLOAT_SLIDER("Time Ease Scale", thisSwitchCam.nodes[iNodeIndex].fTimeScaleEaseScaler, 0.0, 2.0, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CREATE_SPLINE_CAM_FLASH_WIDGET(thisSwitchCam, iNodeIndex)
|
|
|
|
CREATE_SPLINE_CAM_DOF_WIDGET_GROUP(thisSwitchCam, iNodeIndex)
|
|
|
|
ADD_WIDGET_BOOL("Is Low Detail Node", thisSwitchCam.nodes[iNodeIndex].bIsLowDetailNode)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create a widget for a character switch spline cut cam (used for jumping instatly from one cam to another)
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to get the cut cam info from
|
|
/// iNodeIndex - Index of the cut cam.
|
|
PROC CREATE_SPLINE_CAM_WIDGET_CUT_CAM(SWITCH_CAM_STRUCT &thisSwitchCam, INT iNodeIndex)
|
|
|
|
ADD_WIDGET_STRING("This Camera DOES NOT RENDER. It merely jumps to the next Camera Node")
|
|
ADD_WIDGET_STRING("To modify this camera you must edit the next Camera Node")
|
|
ADD_WIDGET_INT_READ_ONLY("Cam Time", thisSwitchCam.nodes[iNodeIndex].iNodeTime)
|
|
ADD_WIDGET_INT_READ_ONLY("", thisSwitchCam.nodes[iNodeIndex].iNodeActiveFlag)
|
|
ADD_WIDGET_BOOL("Is Jump-Cut Node", thisSwitchCam.nodes[iNodeIndex].bIsCamCutNode)
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Create the debug widgets for a custom character switch splin cam
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam struct to create the widget for
|
|
/// strDebugEntity1Name - Display Name in the widget of the origin ped/vehicle EG. 'Franklin' or 'Car'
|
|
/// strDebugEntity2Name - Display Name in the widget of the destination ped/vehicle EG. 'Franklin' or 'Car'
|
|
/// wgidParent - ID of the widget group to parent the switch cam widget too
|
|
PROC CREATE_SPLINE_CAM_WIDGETS(SWITCH_CAM_STRUCT &thisSwitchCam, STRING strDebugEntity1Name, STRING strDebugEntity2Name, WIDGET_GROUP_ID wgidParent)
|
|
CDEBUG3LN(DEBUG_MISSION, "CREATE_SPLINE_CAM_WIDGETS")
|
|
|
|
thisSwitchCam.strCamTarget1WidgetLabel = strDebugEntity1Name
|
|
thisSwitchCam.strCamTarget2WidgetLabel = strDebugEntity2Name
|
|
|
|
TEXT_LABEL_63 txtGroupTitle = "Custom Switch Cameras - "
|
|
txtGroupTitle += thisSwitchCam.strCamTarget1WidgetLabel
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strDebugEntity2Name)
|
|
txtGroupTitle += " to "
|
|
txtGroupTitle += thisSwitchCam.strCamTarget2WidgetLabel
|
|
txtGroupTitle += " -"
|
|
ENDIF
|
|
|
|
IF DOES_WIDGET_GROUP_EXIST(thisSwitchCam.wgidWidgets)
|
|
DELETE_WIDGET_GROUP(thisSwitchCam.wgidWidgets)
|
|
ENDIF
|
|
|
|
thisSwitchCam.wgidParent = wgidParent
|
|
SET_CURRENT_WIDGET_GROUP(thisSwitchCam.wgidParent)
|
|
|
|
thisSwitchCam.wgidWidgets = START_WIDGET_GROUP(txtGroupTitle)
|
|
|
|
ADD_WIDGET_BOOL("Save Data to Text File", thisSwitchCam.bSaveTextFile)
|
|
ADD_WIDGET_BOOL("Save XML Data", thisSwitchCam.bSaveXMLFile)
|
|
ADD_WIDGET_BOOL("Load XML Data", thisSwitchCam.bLoadXMLFile)
|
|
ADD_WIDGET_BOOL("Recreate Camera Spline", thisSwitchCam.bRecreateSpline)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Spline Cam Phase", thisSwitchCam.fSplineCamPhase)
|
|
START_WIDGET_GROUP("Spline Cam Structure")
|
|
ADD_WIDGET_INT_SLIDER("Num Spline Cam Nodes", thisSwitchCam.iNumNodes, 0, MAX_NUM_SWITCH_NODES - 1, 1)
|
|
ADD_WIDGET_INT_SLIDER("Cam 'Switch Focus' Node", thisSwitchCam.iCamSwitchFocusNode, 0, MAX_NUM_SWITCH_NODES - 1, 1)
|
|
ADD_WIDGET_BOOL("Remove Spline Smoothing", thisSwitchCam.bSplineNoSmoothing)
|
|
ADD_WIDGET_BOOL("Recreate Widget", thisSwitchCam.bForceDebugWidgetRecreate)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
INT i
|
|
START_WIDGET_GROUP("Cam Velocity Overrides")
|
|
ADD_WIDGET_BOOL("DEBUG: Disable Velocity Override", thisSwitchCam.bDEBUGSplineCam_DisableVelocityOverride)
|
|
REPEAT MAX_NUM_CAM_VELOCITY_OVERRIDES i
|
|
CREATE_SPLINE_CAM_VELOCITY_OVERRIDE_WIDGET(thisSwitchCam, i)
|
|
ENDREPEAT
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Cam Blur Overrides")
|
|
REPEAT MAX_NUM_CAM_BLUR_OVERRIDES i
|
|
CREATE_SPLINE_CAM_BLUR_OVERRIDE_WIDGET(thisSwitchCam, i)
|
|
ENDREPEAT
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Switch Cam Audio")
|
|
ADD_WIDGET_FLOAT_SLIDER("Start Switch Cam Audio", thisSwitchCam.fSwitchSoundAudioStartPhase, -1.0, 1.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("End Switch Cam Audio", thisSwitchCam.fSwitchSoundAudioEndPhase, -1.0, 1.0, 0.1)
|
|
ADD_WIDGET_BOOL("Play Start Pulse Audio", thisSwitchCam.bSwitchSoundPlayOpeningPulse)
|
|
ADD_WIDGET_BOOL("Play Movement Loop Audio", thisSwitchCam.bSwitchSoundPlayMoveLoop)
|
|
ADD_WIDGET_BOOL("Play End Pulse Audio", thisSwitchCam.bSwitchSoundPlayExitPulse)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
TEXT_LABEL_63 txtLabel
|
|
REPEAT thisSwitchCam.iNumNodes i
|
|
|
|
txtLabel = "Cam "
|
|
txtLabel += i
|
|
txtLabel += " - "
|
|
|
|
IF thisSwitchCam.iCamSwitchFocusNode > 0
|
|
IF i < thisSwitchCam.iCamSwitchFocusNode
|
|
txtLabel += strDebugEntity1Name
|
|
ELIF i >= thisSwitchCam.iCamSwitchFocusNode
|
|
txtLabel += strDebugEntity2Name
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF i = (thisSwitchCam.iNumNodes - 1)
|
|
txtLabel += " End Cam"
|
|
ENDIF
|
|
|
|
IF IS_NODE_JUMP_CUT(thisSwitchCam, i)
|
|
txtLabel += " CUT NODE - IS READ ONLY"
|
|
ENDIF
|
|
START_WIDGET_GROUP(txtLabel)
|
|
IF NOT thisSwitchCam.nodes[i].bIsCamCutNode
|
|
thisSwitchCam.nodes[i].iSwitchCamTypeDebugSelect = ENUM_TO_INT(thisSwitchCam.nodes[i].SwitchCamType)
|
|
START_NEW_WIDGET_COMBO()
|
|
ADD_TO_WIDGET_COMBO("Old Switch Cam")
|
|
ADD_TO_WIDGET_COMBO("Entity Attached Cam")
|
|
ADD_TO_WIDGET_COMBO("Gameplay Cam Copy")
|
|
ADD_TO_WIDGET_COMBO("World Position Cam")
|
|
ADD_TO_WIDGET_COMBO("World Position Cam With Look At")
|
|
ADD_TO_WIDGET_COMBO("Path Relative")
|
|
ADD_TO_WIDGET_COMBO("Path Relative Attach")
|
|
ADD_TO_WIDGET_COMBO("Path Relative Ped to Coord")
|
|
ADD_TO_WIDGET_COMBO("Clone Node With Offset")
|
|
// ADD_TO_WIDGET_COMBO("Attached Cam With World Look At")
|
|
STOP_WIDGET_COMBO("Switch Cam Type", thisSwitchCam.nodes[i].iSwitchCamTypeDebugSelect)
|
|
ADD_WIDGET_INT_READ_ONLY("", thisSwitchCam.nodes[i].iNodeActiveFlag)
|
|
SWITCH thisSwitchCam.nodes[i].SwitchCamType
|
|
CASE SWITCH_CAM_OLD_SYSTEM
|
|
CREATE_SPLINE_CAM_WIDGET_OLD_STYLE(thisSwitchCam, i)
|
|
BREAK
|
|
CASE SWITCH_ENTITY_ATTACHED_CAM
|
|
CREATE_SPLINE_CAM_WIDGET_ATTACHED_CAM(thisSwitchCam, i)
|
|
BREAK
|
|
|
|
CASE SWITCH_CAM_GAMEPLAY_CAM_COPY
|
|
CREATE_SPLINE_CAM_WIDGET_GAMEPLAY_CAM_COPY(thisSwitchCam, i)
|
|
BREAK
|
|
CASE SWITCH_CAM_WORLD_POS
|
|
CREATE_SPLINE_CAM_WIDGET_WORLD_POS(thisSwitchCam, i)
|
|
BREAK
|
|
CASE SWITCH_CAM_WORLD_POS_W_LOOK_AT
|
|
CREATE_SPLINE_CAM_WIDGET_WORLD_POS_WITH_LOOK_AT(thisSwitchCam, i)
|
|
BREAK
|
|
CASE SWITCH_CAM_PATH_RELATIVE
|
|
CASE SWITCH_CAM_PATH_RELATIVE_ATTACHED
|
|
CREATE_SPLINE_CAM_WIDGET_PATH_RELATIVE(thisSwitchCam, i)
|
|
BREAK
|
|
CASE SWITCH_CAM_PATH_RELATIVE_PED_TO_WORLD_COORD
|
|
CREATE_SPLINE_CAM_WIDGET_PATH_RELATIVE_PED_TO_WORLD_COORD(thisSwitchCam, i)
|
|
BREAK
|
|
CASE SWITCH_CAM_CLONE_NODE_WITH_OFFSET
|
|
CREATE_SPLINE_CAM_WIDGET_CLONE_NODE_WITH_OFFSET(thisSwitchCam, i)
|
|
BREAK
|
|
// CASE SWITCH_CAM_ENTITY_ATTACHED_W_WORLD_LOOK_AT
|
|
// CREATE_SPLINE_CAM_WIDGET_ATTACHED_CAM_W_WORLD_LOOK_AT(thisSwitchCam, i)
|
|
// BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
CREATE_SPLINE_CAM_WIDGET_CUT_CAM(thisSwitchCam, i)
|
|
ENDIF
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ENDREPEAT
|
|
|
|
START_WIDGET_GROUP("Spline Use Gameplay Cam")
|
|
ADD_WIDGET_BOOL("Add Gameplay Cam As Last Node", thisSwitchCam.bAddGameplayCamAsLastNode)
|
|
ADD_WIDGET_INT_SLIDER("Gameplay Node Length", thisSwitchCam.iGameplayNodeBlendDuration, -1, 20000, 25)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
CLEAR_CURRENT_WIDGET_GROUP(thisSwitchCam.wgidParent)
|
|
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
|
|
FUNC VECTOR GET_NORMALISED_VERSION_OF_VECTOR(VECTOR vVector)
|
|
FLOAT magnitude = VMAG(vVector)
|
|
IF vVector.x <> 0
|
|
vVector.x = (vVector.x / magnitude)
|
|
ELSE
|
|
vVector.x = 0
|
|
ENDIF
|
|
IF vVector.y <> 0
|
|
vVector.y = (vVector.y / magnitude)
|
|
ELSE
|
|
vVector.y = 0
|
|
ENDIF
|
|
IF vVector.z <> 0
|
|
vVector.z = (vVector.z /magnitude)
|
|
ELSE
|
|
vVector.z = 0
|
|
ENDIF
|
|
RETURN vVector
|
|
ENDFUNC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
/// PURPOSE:
|
|
/// Update the widget displays and file saving of spline cam widgets. Must be called every frame.
|
|
/// PARAMS:
|
|
/// thisSwitchCam - Switch cam to update the widget from.
|
|
PROC UPDATE_SPLINE_CAM_WIDGETS(SWITCH_CAM_STRUCT &thisSwitchCam)
|
|
//CDEBUG3LN(DEBUG_MISSION, "UPDATE_SPLINE_CAM_WIDGETS")
|
|
|
|
IF thisSwitchCam.bSaveTextFile
|
|
WRITE_SPLINE_CAM_DATA_TO_FILE(thisSwitchCam)
|
|
thisSwitchCam.bSaveTextFile = FALSE
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.bSaveXMLFile
|
|
OUTPUT_SPLINE_CAM_DATA_TO_XML(thisSwitchCam)
|
|
thisSwitchCam.bSaveXMLFile = FALSE
|
|
ENDIF
|
|
IF thisSwitchCam.bLoadXMLFile
|
|
LOAD_SPLINE_CAM_DATA_FROM_XML(thisSwitchCam)
|
|
thisSwitchCam.bLoadXMLFile = FALSE
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.bForceDebugWidgetRecreate
|
|
thisSwitchCam.bForceDebugWidgetRecreate = FALSE
|
|
CREATE_SPLINE_CAM_WIDGETS(thisSwitchCam, thisSwitchCam.strCamTarget1WidgetLabel, thisSwitchCam.strCamTarget2WidgetLabel, thisSwitchCam.wgidParent)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.bRecreateSpline
|
|
thisSwitchCam.fSplineCamPhase = GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline)
|
|
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
|
|
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, FALSE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
IF NOT DO_WE_WANT_TO_CLONE_GAMEPLAY_CAM(thisSwitchCam, 0)
|
|
DESTROY_ALL_CAMS()
|
|
PRINTLN("RECREATING SPLINE AND DELETING ALL NODES")
|
|
ELSE
|
|
INT i
|
|
REPEAT thisSwitchCam.iNumNodes i
|
|
IF i > 0
|
|
PRINTLN("RECREATING SPLINE AND DELETING NODE: ", i)
|
|
DESTROY_CAM(thisSwitchCam.nodes[i].ciSwitchNode)
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CREATE_SPLINE_CAM(thisSwitchCam)
|
|
|
|
WAIT(0)//[MF] Allow the cam to be created so we can properly activate it.
|
|
|
|
SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
WAIT(0)//[MF] Allow the cam to be created so we can set the phase correctly
|
|
|
|
SET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline, thisSwitchCam.fSplineCamPhase)
|
|
thisSwitchCam.bRecreateSpline = FALSE
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
|
|
thisSwitchCam.fSplineCamPhase = GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline)
|
|
ELSE
|
|
thisSwitchCam.fSplineCamPhase = -1.0
|
|
ENDIF
|
|
|
|
INT i
|
|
REPEAT thisSwitchCam.iNumNodes i
|
|
IF ENUM_TO_INT(thisSwitchCam.nodes[i].SwitchCamType) != thisSwitchCam.nodes[i].iSwitchCamTypeDebugSelect
|
|
thisSwitchCam.nodes[i].SwitchCamType = INT_TO_ENUM(SWITCH_CAM_TYPE, thisSwitchCam.nodes[i].iSwitchCamTypeDebugSelect)
|
|
ENDIF
|
|
|
|
IF ENUM_TO_INT(thisSwitchCam.nodes[i].NodeTimePostFX_Type) != thisSwitchCam.nodes[i].iNodeTimePostFX_WidgetValue
|
|
thisSwitchCam.nodes[i].NodeTimePostFX_Type = INT_TO_ENUM(SWITCH_CAM_POST_FX_TYPE, thisSwitchCam.nodes[i].iNodeTimePostFX_WidgetValue)
|
|
ENDIF
|
|
|
|
IF ENUM_TO_INT(thisSwitchCam.nodes[i].NodeCamShakeType) != thisSwitchCam.nodes[i].iNodeCamShakeType_WidgetValue
|
|
thisSwitchCam.nodes[i].NodeCamShakeType = INT_TO_ENUM(SWITCH_CAM_SHAKE_TYPE, thisSwitchCam.nodes[i].iNodeCamShakeType_WidgetValue)
|
|
ENDIF
|
|
|
|
IF ENUM_TO_INT(thisSwitchCam.nodes[i].SCFE_FlashEffectUsed) != thisSwitchCam.nodes[i].iFlashEffectUsed_WidgetValue
|
|
thisSwitchCam.nodes[i].SCFE_FlashEffectUsed = INT_TO_ENUM(SWITCH_CAM_FLASH_EFFECT, thisSwitchCam.nodes[i].iFlashEffectUsed_WidgetValue)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF bStopOnNode
|
|
IF DOES_CAM_EXIST(thisSwitchCam.ciSpline)
|
|
|
|
iActiveNode = GET_CAM_SPLINE_NODE_INDEX(thisSwitchCam.ciSpline)
|
|
|
|
//display what node is active
|
|
REPEAT MAX_NUM_SWITCH_NODES i
|
|
IF thisSwitchCam.nodes[i].iNodeActiveFlag <> -1
|
|
thisSwitchCam.nodes[i].iNodeActiveFlag = -1
|
|
ENDIF
|
|
ENDREPEAT
|
|
IF thisSwitchCam.nodes[iActiveNode].iNodeActiveFlag = -1
|
|
thisSwitchCam.nodes[iActiveNode].iNodeActiveFlag = 9999
|
|
ENDIF
|
|
|
|
IF IS_CAM_ACTIVE(GET_DEBUG_CAM())
|
|
AND (IS_BUTTON_JUST_PRESSED(PAD1, TRIANGLE)//copy camera info into the current node
|
|
OR IS_BUTTON_JUST_PRESSED(DEBUG_PAD, TRIANGLE))
|
|
|
|
ENTITY_INDEX eiCameraTargetEntity
|
|
|
|
IF DOES_ENTITY_EXIST(GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iActiveNode))
|
|
eiCameraTargetEntity = GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iActiveNode)
|
|
ENDIF
|
|
|
|
VECTOR entityForward, entityRight, entityUp, entityPosition
|
|
|
|
GET_ENTITY_MATRIX(eiCameraTargetEntity, entityForward, entityRight, entityUp, entityPosition)
|
|
|
|
vNodeDirection = GET_CAM_ROT(GET_DEBUG_CAM())
|
|
thisSwitchCam.nodes[iActiveNode].vNodePos = GET_CAM_COORD(GET_DEBUG_CAM()) - entityPosition
|
|
|
|
IF thisSwitchCam.nodes[iActiveNode].bAttachOffsetIsRelative
|
|
VECTOR cameraPosition = GET_CAM_COORD(GET_DEBUG_CAM())
|
|
VECTOR entityToCamera = cameraPosition - entityPosition
|
|
|
|
thisSwitchCam.nodes[iActiveNode].vNodePos.y = DOT_PRODUCT(entityToCamera, entityForward)
|
|
thisSwitchCam.nodes[iActiveNode].vNodePos.x = DOT_PRODUCT(entityToCamera, entityRight)
|
|
thisSwitchCam.nodes[iActiveNode].vNodePos.z = DOT_PRODUCT(entityToCamera, entityUp)
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[iActiveNode].bPointAtEntity = FALSE
|
|
thisSwitchCam.nodes[iActiveNode].vNodeDir = vNodeDirection
|
|
ELSE
|
|
|
|
IF thisSwitchCam.nodes[iActiveNode].iForceCamPointAtEntityIndex > -1
|
|
eiCameraTargetEntity = GET_SWITCH_CAM_FOCUS_ENTITY(thisSwitchCam, iActiveNode, thisSwitchCam.nodes[iActiveNode].iForceCamPointAtEntityIndex)
|
|
entityPosition = GET_POSITION_OF_SWITCH_CAM_TARGET_ENTITY(thisSwitchCam, thisSwitchCam.nodes[iActiveNode].iForceCamPointAtEntityIndex)
|
|
ENDIF
|
|
|
|
VECTOR cameraPosition = GET_CAM_COORD(GET_DEBUG_CAM())
|
|
VECTOR cameraForward = CONVERT_EULER_TO_DIRECTION_VECTOR(vNodeDirection)
|
|
|
|
VECTOR cameraToEntity = entityPosition - cameraPosition
|
|
FLOAT dotProduct = DOT_PRODUCT(cameraToEntity, cameraForward)
|
|
VECTOR lookAtPoint = cameraForward * dotProduct
|
|
lookAtPoint = lookAtPoint + cameraPosition // add camera position to get look at point
|
|
|
|
IF thisSwitchCam.nodes[iActiveNode].bPointAtOffsetIsRelative = TRUE
|
|
thisSwitchCam.nodes[iActiveNode].vNodeDir = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(eiCameraTargetEntity, lookAtPoint)
|
|
ELSE
|
|
VECTOR entityToLookat = lookAtPoint - entityPosition
|
|
thisSwitchCam.nodes[iActiveNode].vNodeDir.y = DOT_PRODUCT(entityToLookat, entityForward)
|
|
thisSwitchCam.nodes[iActiveNode].vNodeDir.x = DOT_PRODUCT(entityToLookat, entityRight)
|
|
thisSwitchCam.nodes[iActiveNode].vNodeDir.z = DOT_PRODUCT(entityToLookat, entityUp)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[iActiveNode].SwitchCamType = SWITCH_CAM_WORLD_POS
|
|
|
|
thisSwitchCam.nodes[iActiveNode].vNodePos = GET_CAM_COORD(GET_DEBUG_CAM())
|
|
thisSwitchCam.nodes[iActiveNode].fNodeFOV = GET_CAM_FOV(GET_DEBUG_CAM())
|
|
|
|
ENDIF
|
|
|
|
IF thisSwitchCam.nodes[iActiveNode].SwitchCamType = SWITCH_CAM_WORLD_POS_W_LOOK_AT
|
|
thisSwitchCam.nodes[iActiveNode].vWorldPosLookAt = GET_CAM_COORD(GET_DEBUG_CAM())
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
#ENDIF
|