Files
gtav-src/script/dev_ng/Code/physics_perf_test.sc
T
2025-09-29 00:52:08 +02:00

1144 lines
40 KiB
Python
Executable File

// Do nothing in release mode
#IF IS_FINAL_BUILD
SCRIPT
ENDSCRIPT
#ENDIF
// Only include in debug mode
#IF IS_DEBUG_BUILD
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_camera.sch"
USING "commands_fire.sch"
USING "commands_object.sch"
USING "commands_player.sch"
USING "commands_script.sch"
USING "commands_streaming.sch"
USING "script_player.sch"
USING "commands_xml.sch"
USING "commands_physics.sch"
VECTOR vStartPos = << 180, -10, 9.65>>
VECTOR vWidgetStartPos = vStartPos
FLOAT fInitialPlayerHeading = 180
FLOAT fWidgetInitialHeading = fInitialPlayerHeading
VECTOR vInitialPlayerCoord = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<-7.5, -10, 0>>)
BOOL bSetNewStartPos
BOOL bForceCleanup
FLOAT SimUpdateTime, PreCollideTime, CollideTime, CollideJobsTime, PostCollideTime
INT frameNumber = 1000, numberOfTestFrames = 1000
BOOL bAutoTestRun, bToggleAutoTest
CONST_INT arraySize 32
OBJECT_INDEX prop[arraySize][arraySize]
VEHICLE_INDEX veh[arraySize][arraySize]
VEHICLE_INDEX vehRam
//VECTOR vehicleVelocity = <<0,-25,0>>
FLOAT offsetVehicleDist = 25
FLOAT vehicleSpeed = 25
PED_INDEX ped[arraySize][arraySize]
//PED_INDEX pedDriver
INT iTestSize = 5
INT iTestSizeMax = 16
INT iStackSize = 3
INT iStackSizeMax = 16
FLOAT tempZ = 9.7
TEXT_WIDGET_ID pedModelWidget, vehModelWidget, propModelWidget
MODEL_NAMES pedModel
MODEL_NAMES vehModel
MODEL_NAMES propModel
BOOL bClearCustomOptions
REL_GROUP_HASH relGroup[arraySize]
TEXT_LABEL sRelGroup[arraySize]
ENUM PHYSICS_TEST_TYPE
PPT_NONE=0,
PPT_BOXES_NOT_TOUCHING, // 1. A bunch of boxes all laying out in a field on the ground, not touching each other
PPT_BOXES_RANDOM_PILE, // 2. A bunch of boxes in a disorganized pile
PPT_BOXES_STACKED, // 3. A bunch of boxes in a stack (round towers are nice and stable, or a pyramid shape)
PPT_NM_GROUP_NOT_TOUCHING, // 4. A field of ragdolls falling on the ground but not touching each other. Create a bunch of peds and make them collapse through NM
PPT_NM_GROUP_RANDOM_PILE, // 5. A dog-pile of ragdolls, mostly all touching each other. Create a bunch of peds above the ground enough such that they go into NM.
PPT_VEH_NOT_TOUCHING, // 6. A field of vehicles all touching the ground but not each other
PPT_VEH_RANDOM_PILE, // 7. A field of vehicles in a pile.
PPT_PED_GROUP_STANDING, // 8. A bunch of characters standing around (potentially with character cloth)
PPT_PED_GROUP_SHOOTING, // 9. A bunch of invulnerable characters shooting at each other
PPT_PROPS_NOT_TOUCHING, // 10. A bunch of props not touching each other
// PPT_PROPS_CLOTH_NOT_TOUCHING, // 11. A bunch of props with cloth not touching each other
PPT_FRAG_PROPS_W_VEH_CRASH, // 12. A field of fragment props with a car crashing through it
PPT_FRAG_PROPS_W_EXP, // 13. A field of fragment props with an explosion going off in the middle
PPT_VEH_W_VEH_CRASH, // 14. A field of cars with a car crashing through it
PPT_VEH_W_EXP, // 15. A field of cars with an explosion going off in the middle
PPT_PED_GROUP_W_VEH_CRASH, // 16. A field of peds with a car crashing through them
PPT_PED_GROUP_W_EXP, // 17. A field of peds with an explosion going off in the middle
PPT_MIXED_GROUP,
PPT_PED_TABLE_GROUP_W_VEH_CRASH,
PPT_END
ENDENUM
INT iSelectedTest = (ENUM_TO_INT(PPT_NONE))
BOOL bRunSelectedTest = FALSE
// -----------------------------------------------------------------------------------------------------------
PROC Create_The_Player()
//IF GET_COMMANDLINE_PARAM_EXISTS("sc_physics_perf_test")
IF NOT ARE_VECTORS_ALMOST_EQUAL(vStartPos, <<0,0,0>>)
tempZ = vStartPos.z
vWidgetStartPos = vStartPos
fWidgetInitialHeading = fInitialPlayerHeading
vInitialPlayerCoord = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<-7.5, -10, 0>>)
ELSE
vStartPos = << 180, -25, 9.65>>//<< 180, -10, 9.65>>
tempZ = vStartPos.z
vWidgetStartPos = vStartPos
fInitialPlayerHeading = 180
fWidgetInitialHeading = fInitialPlayerHeading
vInitialPlayerCoord = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<-7.5, -10, 0>>)
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_HEADING(PLAYER_PED_ID(), fInitialPlayerHeading)
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vInitialPlayerCoord)
ENDIF
LOAD_SCENE(vInitialPlayerCoord)
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
SET_NUMBER_OF_PARKED_VEHICLES(0)
SET_VEHICLE_POPULATION_BUDGET(0)
SET_GARBAGE_TRUCKS(FALSE)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-9999.9, -9999.9, -9999.9>>, <<9999.9, 9999.9, 9999.9>>, FALSE)
CLEAR_AREA_OF_VEHICLES(vInitialPlayerCoord, 1000.0)
CLEAR_AREA_OF_PEDS(vInitialPlayerCoord, 1000.0)
SET_PLAYER_INVINCIBLE(PLAYER_ID(), TRUE)
PHYSICS_DEBUG_SET_SLEEP_ENABLED(false)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
DO_SCREEN_FADE_IN(0)
ENDPROC
PROC Cleanup_Previous_Performance_Test()
INT i
INT ii
REPEAT arraySize i
REPEAT arraySize ii
IF DOES_ENTITY_EXIST(prop[i][ii])
DELETE_OBJECT(prop[i][ii])
SET_MODEL_AS_NO_LONGER_NEEDED(propModel)
ENDIF
ENDREPEAT
ENDREPEAT
REPEAT arraySize i
REPEAT arraySize ii
IF DOES_ENTITY_EXIST(ped[i][ii])
DELETE_PED(ped[i][ii])
SET_MODEL_AS_NO_LONGER_NEEDED(propModel)
ENDIF
ENDREPEAT
ENDREPEAT
REPEAT arraySize i
REPEAT arraySize ii
IF DOES_ENTITY_EXIST(veh[i][ii])
DELETE_VEHICLE(veh[i][ii])
SET_MODEL_AS_NO_LONGER_NEEDED(propModel)
ENDIF
ENDREPEAT
ENDREPEAT
REPEAT arraySize i
REMOVE_RELATIONSHIP_GROUP(relGroup[i])
ENDREPEAT
// IF DOES_ENTITY_EXIST(pedDriver)
// DELETE_PED(pedDriver)
// SET_MODEL_AS_NO_LONGER_NEEDED(pedModel)
// ENDIF
IF DOES_ENTITY_EXIST(vehRam)
DELETE_VEHICLE(vehRam)
SET_MODEL_AS_NO_LONGER_NEEDED(vehModel)
ENDIF
REMOVE_DECALS_IN_RANGE(vStartPos, 150)
CLEAR_AREA(vStartPos, 150, TRUE)
ENDPROC
PROC Set_Creation_Defaults()
pedModel = S_M_Y_CLOWN_01
vehModel = SENTINEL
propModel = PROP_BOX_WOOD01A
iTestSize = 5
SET_CONTENTS_OF_TEXT_WIDGET(pedModelWidget, "New text widget")
SET_CONTENTS_OF_TEXT_WIDGET(vehModelWidget, "New text widget")
SET_CONTENTS_OF_TEXT_WIDGET(propModelWidget, "New text widget")
ENDPROC
PROC Run_Physics_Performance_Test()
INT i, ii, iBoxes, evenNumberTest
VECTOR vMin, vMax
VECTOR vTemp, vHeading
FLOAT fRadius, fBoxes, createAngle, createAngleHalved, fHeading, fTemp
FLOAT fMiddle = TO_FLOAT(iTestSize)/2
MODEL_NAMES chairModel = PROP_TABLE_02_CHR
MODEL_NAMES tableModel = PROP_TABLE_02
frameNumber = 0
START_PHYSICS_PROFILE_CAPTURE()
SWITCH INT_TO_ENUM(PHYSICS_TEST_TYPE, iSelectedTest)
CASE PPT_NONE
SCRIPT_ASSERT("PHYSICS_TEST_TYPE = PPT_NONE. You should select a test type.")
BREAK
CASE PPT_BOXES_NOT_TOUCHING
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_BOXES_NOT_TOUCHING", 10000, 1)
REQUEST_MODEL(propModel)
WHILE NOT HAS_MODEL_LOADED(propModel)
WAIT(0)
ENDWHILE
GET_MODEL_DIMENSIONS(propModel, vMin, vMax)
GET_GROUND_Z_FOR_3D_COORD(vStartPos, fTemp)
REPEAT iTestSize i
REPEAT iTestSize ii
prop[i][ii] = CREATE_OBJECT_NO_OFFSET(propModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(<<vStartPos.x, vStartPos.y, fTemp>>, fInitialPlayerHeading, <<(3*vMax.x)*i, (3*vMax.y)*ii, 0>>))
SET_ENTITY_DYNAMIC(prop[i][ii], TRUE)
ENDREPEAT
ENDREPEAT
BREAK
CASE PPT_BOXES_RANDOM_PILE
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_BOXES_RANDOM_PILE", 10000, 1)
REQUEST_MODEL(propModel)
WHILE NOT HAS_MODEL_LOADED(propModel)
WAIT(0)
ENDWHILE
GET_MODEL_DIMENSIONS(propModel, vMin, vMax)
GET_GROUND_Z_FOR_3D_COORD(vStartPos, fTemp)
REPEAT iTestSize i
REPEAT iTestSize ii
prop[i][ii] = CREATE_OBJECT_NO_OFFSET(propModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(<<vStartPos.x, vStartPos.y, fTemp>>, GET_RANDOM_FLOAT_IN_RANGE(0,360), <<0, vMax.y*i, (vMax.z*ii)>>))
SET_ENTITY_DYNAMIC(prop[i][ii], TRUE)
ENDREPEAT
ENDREPEAT
BREAK
CASE PPT_BOXES_STACKED
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_BOXES_STACKED", 10000, 1)
REQUEST_MODEL(propModel)
WHILE NOT HAS_MODEL_LOADED(propModel)
WAIT(0)
ENDWHILE
IF iTestSize < 4
iTestSize = 4
ENDIF
iBoxes = iTestSize
fBoxes = TO_FLOAT(iBoxes)
createAngle = 360/fBoxes
createAngleHalved = 180/fBoxes
GET_MODEL_DIMENSIONS(propModel, vMin, vMax)
fRadius = COS(createAngleHalved)*(vMax.x/SIN(createAngleHalved))
fRadius += (vMax.y)
PRINTSTRING("Adjacent = ")
PRINTFLOAT(fRadius)
PRINTNL()
PRINTSTRING("Hypotenuse = ")
PRINTFLOAT((vMax.y)*SIN(createAngleHalved))
PRINTNL()
PRINTSTRING("vMin.x = ")
PRINTFLOAT(vMin.x)
PRINTNL()
PRINTSTRING("vMax.y = ")
PRINTFLOAT(vMax.x)
PRINTNL()
PRINTSTRING("vMin.y = ")
PRINTFLOAT(vMin.y)
PRINTNL()
PRINTSTRING("vMax.y = ")
PRINTFLOAT(vMax.y)
PRINTNL()
PRINTSTRING("fRadius = ")
PRINTFLOAT(fRadius)
PRINTNL()
GET_GROUND_Z_FOR_3D_COORD(vStartPos, fTemp)
REPEAT iStackSize ii
REPEAT iTestSize i
evenNumberTest = ii / 2
IF evenNumberTest * 2 = ii
vTemp.x = vStartPos.x+(fRadius*SIN(TO_FLOAT(i)*createAngle))
vTemp.y = vStartPos.y+(fRadius*COS(TO_FLOAT(i)*createAngle))
ELSE
vTemp.x = vStartPos.x+(fRadius*SIN((TO_FLOAT(i)*createAngle)-createAngleHalved))
vTemp.y = vStartPos.y+(fRadius*COS((TO_FLOAT(i)*createAngle)-createAngleHalved))
ENDIF
vTemp.z = (fTemp+(vMax.z*ii))
prop[i][ii] = CREATE_OBJECT_NO_OFFSET(propModel, vTemp)
vTemp -= vStartPos
SET_ENTITY_HEADING(prop[i][ii], GET_HEADING_FROM_VECTOR_2D(vTemp.x, vTemp.y))
SET_ENTITY_DYNAMIC(prop[i][ii], TRUE)
PRINTSTRING("Created prop number ")
PRINTINT(i)
PRINTSTRING(" - ")
PRINTINT(ii)
PRINTNL()
ENDREPEAT
ENDREPEAT
BREAK
CASE PPT_NM_GROUP_NOT_TOUCHING
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_NM_GROUP_NOT_TOUCHING", 10000, 1)
REQUEST_MODEL(pedModel)
WHILE NOT HAS_MODEL_LOADED(pedModel)
WAIT(0)
ENDWHILE
GET_MODEL_DIMENSIONS(pedModel, vMin, vMax)
REPEAT iTestSize i
REPEAT iTestSize ii
ped[i][ii] = CREATE_PED(PEDTYPE_CIVMALE, pedModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(10*vMax.x)*i, (10*vMax.y)*ii, 4>>))
SET_PED_TO_RAGDOLL(ped[i][ii], 0, 10000, TASK_RELAX, FALSE, FALSE)
SET_ENTITY_HEALTH(ped[i][ii], 0)
ENDREPEAT
ENDREPEAT
BREAK
CASE PPT_NM_GROUP_RANDOM_PILE
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_NM_GROUP_RANDOM_PILE", 10000, 1)
REQUEST_MODEL(pedModel)
WHILE NOT HAS_MODEL_LOADED(pedModel)
WAIT(0)
ENDWHILE
GET_MODEL_DIMENSIONS(pedModel, vMin, vMax)
REPEAT iTestSize i
REPEAT iTestSize ii
ped[i][ii] = CREATE_PED(PEDTYPE_CIVMALE, pedModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<0, (vMax.y/i), ((vMax.z*ii)*2)>>))
SET_ENTITY_HEALTH(ped[i][ii], 0)
ENDREPEAT
ENDREPEAT
BREAK
CASE PPT_VEH_NOT_TOUCHING
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_VEH_NOT_TOUCHING", 10000, 1)
REQUEST_MODEL(vehModel)
WHILE NOT HAS_MODEL_LOADED(vehModel)
WAIT(0)
ENDWHILE
GET_MODEL_DIMENSIONS(vehModel, vMin, vMax)
REPEAT iTestSize i
REPEAT iTestSize ii
veh[i][ii] = CREATE_VEHICLE(vehModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(3*vMax.x)*i, (3*vMax.y)*ii, 0>>), fInitialPlayerHeading)
ENDREPEAT
ENDREPEAT
BREAK
CASE PPT_VEH_RANDOM_PILE
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_VEH_RANDOM_PILE", 10000, 1)
REQUEST_MODEL(vehModel)
WHILE NOT HAS_MODEL_LOADED(vehModel)
WAIT(0)
ENDWHILE
GET_MODEL_DIMENSIONS(vehModel, vMin, vMax)
REPEAT iTestSize i
REPEAT iTestSize ii
veh[i][ii] = CREATE_VEHICLE(vehModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<0, (3*vMax.y)*i, ((3*vMax.z)*(ii+1))>>), fInitialPlayerHeading)
//SET_ENTITY_COORDS(veh[i][ii], GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, GET_RANDOM_FLOAT_IN_RANGE(0,360), <<0, vMax.y/i, ((3*vMax.z)*ii)>>))
SET_ENTITY_DYNAMIC(veh[i][ii], TRUE)
SET_ENTITY_PROOFS(veh[i][ii], TRUE, TRUE, TRUE, TRUE, TRUE)
ENDREPEAT
ENDREPEAT
BREAK
CASE PPT_PED_GROUP_STANDING
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_PED_GROUP_STANDING", 10000, 1)
REQUEST_MODEL(pedModel)
WHILE NOT HAS_MODEL_LOADED(pedModel)
WAIT(0)
ENDWHILE
GET_MODEL_DIMENSIONS(pedModel, vMin, vMax)
REPEAT iTestSize i
REPEAT iTestSize ii
ped[i][ii] = CREATE_PED(PEDTYPE_CIVMALE, pedModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(3*vMax.x)*i, (3*vMax.y)*ii, 0>>))
ENDREPEAT
ENDREPEAT
BREAK
CASE PPT_PED_GROUP_SHOOTING
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_PED_GROUP_SHOOTING", 10000, 1)
REQUEST_MODEL(pedModel)
WHILE NOT HAS_MODEL_LOADED(pedModel)
WAIT(0)
ENDWHILE
REPEAT iTestSize i
sRelGroup[i] = "relgroup["
sRelGroup[i] += i
ADD_RELATIONSHIP_GROUP(sRelGroup[i], relGroup[i])
ENDREPEAT
REPEAT iTestSize i
REPEAT iTestSize ii
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relGroup[ii], relGroup[i])
ENDREPEAT
ENDREPEAT
iBoxes = iTestSize
fBoxes = TO_FLOAT(iBoxes)
createAngle = 360/fBoxes
createAngleHalved = 180/fBoxes
GET_MODEL_DIMENSIONS(pedModel, vMin, vMax)
fRadius = COS(createAngleHalved)*(vMax.x/SIN(createAngleHalved))
fRadius += (vMax.y+2)
REPEAT iTestSize i
vTemp.x = vStartPos.x+(fRadius*SIN(TO_FLOAT(i)*createAngle))
vTemp.y = vStartPos.y+(fRadius*COS(TO_FLOAT(i)*createAngle))
vTemp.z = tempZ
ped[0][i] = CREATE_PED(PEDTYPE_CIVMALE, pedModel, vTemp)
vTemp -= vStartPos
SET_ENTITY_HEADING(ped[0][i], GET_HEADING_FROM_VECTOR_2D(vTemp.x, vTemp.y))
SET_PED_RELATIONSHIP_GROUP_HASH(ped[0][i], relGroup[i])
TASK_COMBAT_HATED_TARGETS_AROUND_PED(ped[0][i], 50)
SET_ENTITY_INVINCIBLE(ped[0][i], TRUE)
GIVE_WEAPON_TO_PED(ped[0][i], WEAPONTYPE_PISTOL, 999, TRUE)
vTemp = GET_ENTITY_COORDS(ped[0][i])
GET_GROUND_Z_FOR_3D_COORD(vTemp, vTemp.z)
SET_ENTITY_COORDS(ped[0][i], vTemp)
ENDREPEAT
BREAK
CASE PPT_PROPS_NOT_TOUCHING
propModel = PROP_FORSALEJR1
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_PROPS_NOT_TOUCHING", 10000, 1)
REQUEST_MODEL(propModel)
WHILE NOT HAS_MODEL_LOADED(propModel)
WAIT(0)
ENDWHILE
GET_GROUND_Z_FOR_3D_COORD(vStartPos, fTemp)
GET_MODEL_DIMENSIONS(propModel, vMin, vMax)
REPEAT iTestSize i
REPEAT iTestSize ii
prop[i][ii] = CREATE_OBJECT_NO_OFFSET(propModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(<<vStartPos.x, vStartPos.y, fTemp>>, fInitialPlayerHeading, <<(2*vMax.x)*i, (2*vMax.y)*ii, 0>>))
ENDREPEAT
ENDREPEAT
BREAK
// CASE PPT_PROPS_CLOTH_NOT_TOUCHING
CASE PPT_FRAG_PROPS_W_VEH_CRASH
propModel = PROP_FORSALEJR1
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_FRAG_PROPS_W_VEH_CRASH", 10000, 1)
REQUEST_MODEL(propModel)
REQUEST_MODEL(pedModel)
REQUEST_MODEL(vehModel)
WHILE NOT HAS_MODEL_LOADED(propModel)
OR NOT HAS_MODEL_LOADED(pedModel)
OR NOT HAS_MODEL_LOADED(vehModel)
WAIT(0)
ENDWHILE
GET_GROUND_Z_FOR_3D_COORD(vStartPos, fTemp)
GET_MODEL_DIMENSIONS(propModel, vMin, vMax)
REPEAT iTestSize i
REPEAT iTestSize ii
prop[i][ii] = CREATE_OBJECT_NO_OFFSET(propModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(<<vStartPos.x, vStartPos.y, fTemp>>, fInitialPlayerHeading, <<(2*vMax.x)*i, (2*vMax.y)*ii, 0>>))
ENDREPEAT
ENDREPEAT
vehRam = CREATE_VEHICLE(vehModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(2*vMax.x)*(fMiddle), -offsetVehicleDist, 0>>), fInitialPlayerHeading)
// pedDriver = CREATE_PED_INSIDE_VEHICLE(vehRam, PEDTYPE_CIVMALE, pedModel)
// TASK_VEHICLE_DRIVE_TO_COORD(pedDriver, vehRam, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(2*vMax.x)*(fMiddle), (2*vMax.y)*(fMiddle), 2>>), 60, DRIVINGSTYLE_STRAIGHTLINE, vehModel, DRIVINGMODE_PLOUGHTHROUGH, 0.1, 100)
//SET_ENTITY_VELOCITY(vehRam, vehicleVelocity)
SET_VEHICLE_FORWARD_SPEED(vehRam, vehicleSpeed)
BREAK
CASE PPT_FRAG_PROPS_W_EXP
propModel = PROP_FORSALEJR1
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_FRAG_PROPS_W_EXP", 10000, 1)
REQUEST_MODEL(propModel)
WHILE NOT HAS_MODEL_LOADED(propModel)
WAIT(0)
ENDWHILE
GET_GROUND_Z_FOR_3D_COORD(vStartPos, fTemp)
GET_MODEL_DIMENSIONS(propModel, vMin, vMax)
REPEAT iTestSize i
REPEAT iTestSize ii
prop[i][ii] = CREATE_OBJECT_NO_OFFSET(propModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(<<vStartPos.x, vStartPos.y, fTemp>>, fInitialPlayerHeading, <<(2*vMax.x)*i, (2*vMax.y)*ii, 0>>))
SET_ENTITY_DYNAMIC(prop[i][ii], TRUE)
ENDREPEAT
ENDREPEAT
WAIT(0)
ADD_EXPLOSION(GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(2*vMax.x)*(fMiddle), (2*vMax.y)*(fMiddle), 2>>), EXP_TAG_PETROL_PUMP, 1)
BREAK
CASE PPT_VEH_W_VEH_CRASH
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_VEH_W_VEH_CRASH", 10000, 1)
REQUEST_MODEL(pedModel)
REQUEST_MODEL(vehModel)
WHILE NOT HAS_MODEL_LOADED(pedModel)
OR NOT HAS_MODEL_LOADED(vehModel)
WAIT(0)
ENDWHILE
GET_MODEL_DIMENSIONS(vehModel, vMin, vMax)
REPEAT iTestSize i
REPEAT iTestSize ii
veh[i][ii] = CREATE_VEHICLE(vehModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(3*vMax.x)*i, (3*vMax.y)*ii, 0>>), fInitialPlayerHeading)
ENDREPEAT
ENDREPEAT
vehRam = CREATE_VEHICLE(vehModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(2*vMax.x)*(fMiddle), -offsetVehicleDist, 0>>), fInitialPlayerHeading)
// pedDriver = CREATE_PED_INSIDE_VEHICLE(vehRam, PEDTYPE_CIVMALE, pedModel)
// TASK_VEHICLE_DRIVE_TO_COORD(pedDriver, vehRam, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(3*vMax.x)*fMiddle, (3*vMax.y)*fMiddle, 0>>), 60, DRIVINGSTYLE_STRAIGHTLINE, vehModel, DRIVINGMODE_PLOUGHTHROUGH, 0.1, 100)
//SET_ENTITY_VELOCITY(vehRam, vehicleVelocity)
SET_VEHICLE_FORWARD_SPEED(vehRam, vehicleSpeed)
BREAK
CASE PPT_VEH_W_EXP
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_VEH_W_EXP", 10000, 1)
REQUEST_MODEL(vehModel)
WHILE NOT HAS_MODEL_LOADED(vehModel)
WAIT(0)
ENDWHILE
GET_MODEL_DIMENSIONS(vehModel, vMin, vMax)
REPEAT iTestSize i
REPEAT iTestSize ii
veh[i][ii] = CREATE_VEHICLE(vehModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(3*vMax.x)*i, (3*vMax.y)*ii, 0>>), fInitialPlayerHeading)
ENDREPEAT
ENDREPEAT
ADD_EXPLOSION(GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(2*vMax.x)*(fMiddle), (3*vMax.y)*(fMiddle), 1>>), EXP_TAG_PETROL_PUMP, 1)//((1/TO_FLOAT(iTestSizeMax))*TO_FLOAT(iTestSize)))
BREAK
CASE PPT_PED_GROUP_W_VEH_CRASH
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_PED_GROUP_W_VEH_CRASH", 10000, 1)
REQUEST_MODEL(pedModel)
REQUEST_MODEL(vehModel)
WHILE NOT HAS_MODEL_LOADED(pedModel)
OR NOT HAS_MODEL_LOADED(vehModel)
WAIT(0)
ENDWHILE
GET_MODEL_DIMENSIONS(pedModel, vMin, vMax)
REPEAT iTestSize i
REPEAT iTestSize ii
ped[i][ii] = CREATE_PED(PEDTYPE_CIVMALE, pedModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(3*vMax.x)*i, (3*vMax.y)*ii, 0>>))
ENDREPEAT
ENDREPEAT
vehRam = CREATE_VEHICLE(vehModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(2*vMax.x)*(fMiddle), -offsetVehicleDist, 0>>), fInitialPlayerHeading)
// pedDriver = CREATE_PED_INSIDE_VEHICLE(vehRam, PEDTYPE_CIVMALE, pedModel)
//TASK_VEHICLE_DRIVE_TO_COORD(pedDriver, vehRam, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(3*vMax.x)*(fMiddle), (3*vMax.y)*(fMiddle), 1>>), 60, DRIVINGSTYLE_STRAIGHTLINE, vehModel, DRIVINGMODE_PLOUGHTHROUGH, 0.1, 100)
//SET_ENTITY_VELOCITY(vehRam, vehicleVelocity)
SET_VEHICLE_FORWARD_SPEED(vehRam, vehicleSpeed)
BREAK
CASE PPT_PED_GROUP_W_EXP
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_PED_GROUP_W_EXP", 10000, 1)
REQUEST_MODEL(pedModel)
WHILE NOT HAS_MODEL_LOADED(pedModel)
WAIT(0)
ENDWHILE
GET_MODEL_DIMENSIONS(pedModel, vMin, vMax)
REPEAT iTestSize i
REPEAT iTestSize ii
ped[i][ii] = CREATE_PED(PEDTYPE_CIVMALE, pedModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(3*vMax.y)*i, (3*vMax.y)*ii, 0>>))
ENDREPEAT
ENDREPEAT
WAIT(0)
ADD_EXPLOSION(GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(3*vMax.x)*(fMiddle), (3*vMax.y)*(fMiddle), 1>>), EXP_TAG_PETROL_PUMP, 1)//((1/TO_FLOAT(iTestSizeMax))*TO_FLOAT(iTestSize)))
BREAK
CASE PPT_MIXED_GROUP
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_MIXED_GROUP", 10000, 1)
REQUEST_MODEL(pedModel)
REQUEST_MODEL(vehModel)
REQUEST_MODEL(propModel)
WHILE NOT HAS_MODEL_LOADED(pedModel)
OR NOT HAS_MODEL_LOADED(vehModel)
OR NOT HAS_MODEL_LOADED(propModel)
WAIT(0)
ENDWHILE
IF iTestSize < 4
iTestSize = 4
ENDIF
iBoxes = iTestSize
fBoxes = TO_FLOAT(iBoxes)
createAngle = 360/fBoxes
createAngleHalved = 180/fBoxes
GET_MODEL_DIMENSIONS(propModel, vMin, vMax)
fRadius = COS(createAngleHalved)*(vMax.x/SIN(createAngleHalved))
fRadius += (vMax.y)
PRINTSTRING("Adjacent = ")
PRINTFLOAT(fRadius)
PRINTNL()
PRINTSTRING("Hypotenuse = ")
PRINTFLOAT((vMax.y)*SIN(createAngleHalved))
PRINTNL()
PRINTSTRING("vMin.x = ")
PRINTFLOAT(vMin.x)
PRINTNL()
PRINTSTRING("vMax.y = ")
PRINTFLOAT(vMax.x)
PRINTNL()
PRINTSTRING("vMin.y = ")
PRINTFLOAT(vMin.y)
PRINTNL()
PRINTSTRING("vMax.y = ")
PRINTFLOAT(vMax.y)
PRINTNL()
PRINTSTRING("fRadius = ")
PRINTFLOAT(fRadius)
PRINTNL()
REPEAT iStackSize ii
REPEAT iTestSize i
evenNumberTest = ii / 2
IF evenNumberTest * 2 = ii
vTemp.x = vStartPos.x+(fRadius*SIN(TO_FLOAT(i)*createAngle))
vTemp.y = vStartPos.y+(fRadius*COS(TO_FLOAT(i)*createAngle))
ELSE
vTemp.x = vStartPos.x+(fRadius*SIN((TO_FLOAT(i)*createAngle)-createAngleHalved))
vTemp.y = vStartPos.y+(fRadius*COS((TO_FLOAT(i)*createAngle)-createAngleHalved))
ENDIF
vTemp.z = (tempZ+(vMax.z*ii))
prop[i][ii] = CREATE_OBJECT_NO_OFFSET(propModel, vTemp)
vTemp -= vStartPos
SET_ENTITY_HEADING(prop[i][ii], GET_HEADING_FROM_VECTOR_2D(vTemp.x, vTemp.y))
SET_ENTITY_DYNAMIC(prop[i][ii], TRUE)
PRINTSTRING("Created prop number ")
PRINTINT(i)
PRINTSTRING(" - ")
PRINTINT(ii)
PRINTNL()
ENDREPEAT
ENDREPEAT
GET_MODEL_DIMENSIONS(pedModel, vMin, vMax)
REPEAT iTestSize i
REPEAT iTestSize ii
ped[i][ii] = CREATE_PED(PEDTYPE_CIVMALE, pedModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(10*vMax.x)*i, (10*vMax.y)*ii, 4>>))
SET_PED_TO_RAGDOLL(ped[i][ii], 0, 10000, TASK_RELAX, FALSE, FALSE)
SET_ENTITY_HEALTH(ped[i][ii], 0)
ENDREPEAT
ENDREPEAT
GET_MODEL_DIMENSIONS(vehModel, vMin, vMax)
vHeading = vStartPos - GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(2*vMax.x)*(fMiddle), -offsetVehicleDist, 0>>)
fHeading = GET_HEADING_FROM_VECTOR_2D(vHeading.x, vHeading.y)
veh[0][0] = CREATE_VEHICLE(vehModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(2*vMax.x)*(fMiddle), -offsetVehicleDist, 0>>), fHeading)
SET_VEHICLE_FORWARD_SPEED(veh[0][0], vehicleSpeed)
vHeading = vStartPos - GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(2*vMax.x)*(fMiddle), offsetVehicleDist, 0>>)
fHeading = GET_HEADING_FROM_VECTOR_2D(vHeading.x, vHeading.y)
veh[0][1] = CREATE_VEHICLE(vehModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<(2*vMax.x)*(fMiddle), offsetVehicleDist, 0>>), fHeading)
SET_VEHICLE_FORWARD_SPEED(veh[0][1], vehicleSpeed)
vHeading = vStartPos - GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<-offsetVehicleDist,(2*vMax.x)*(fMiddle), 0>>)
fHeading = GET_HEADING_FROM_VECTOR_2D(vHeading.x, vHeading.y)
veh[1][0] = CREATE_VEHICLE(vehModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<-offsetVehicleDist,(2*vMax.x)*(fMiddle), 0>>), fHeading)
SET_VEHICLE_FORWARD_SPEED(veh[1][0], vehicleSpeed)
vHeading = vStartPos - GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<offsetVehicleDist,(2*vMax.x)*(fMiddle), 0>>)
fHeading = GET_HEADING_FROM_VECTOR_2D(vHeading.x, vHeading.y)
veh[1][1] = CREATE_VEHICLE(vehModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<offsetVehicleDist,(2*vMax.x)*(fMiddle), 0>>), fHeading)
SET_VEHICLE_FORWARD_SPEED(veh[1][1], vehicleSpeed)
BREAK
CASE PPT_PED_TABLE_GROUP_W_VEH_CRASH
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "PPT_PED_TABLE_GROUP_W_VEH_CRASH", 10000, 1)
REQUEST_MODEL(pedModel)
REQUEST_MODEL(vehModel)
REQUEST_MODEL(chairModel)
REQUEST_MODEL(tableModel)
WHILE NOT HAS_MODEL_LOADED(pedModel)
OR NOT HAS_MODEL_LOADED(vehModel)
OR NOT HAS_MODEL_LOADED(chairModel)
OR NOT HAS_MODEL_LOADED(tableModel)
WAIT(0)
ENDWHILE
//
iBoxes = iTestSize
fBoxes = TO_FLOAT(iBoxes)
createAngle = 360/fBoxes
createAngleHalved = 180/fBoxes
GET_MODEL_DIMENSIONS(tableModel, vMin, vMax)
//fRadius = COS(createAngleHalved)*(vMax.x/SIN(createAngleHalved))
fRadius = vMax.x
GET_MODEL_DIMENSIONS(chairModel, vMin, vMax)
fRadius += (vMax.y)
//vStartPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<0, 6, 0>>)
GET_GROUND_Z_FOR_3D_COORD(vStartPos, fTemp)
prop[10][10] = CREATE_OBJECT_NO_OFFSET(tableModel, <<vStartPos.x, vStartPos.y, fTemp>>)
REPEAT iTestSize i
vTemp.x = vStartPos.x+(fRadius*SIN(TO_FLOAT(i)*createAngle))
vTemp.y = vStartPos.y+(fRadius*COS(TO_FLOAT(i)*createAngle))
vTemp.z = fTemp
ped[0][i] = CREATE_PED(PEDTYPE_CIVMALE, pedModel, vTemp)
vTemp += vStartPos
SET_ENTITY_HEADING(ped[0][i], GET_HEADING_FROM_VECTOR_2D(vTemp.x, vTemp.y))
vTemp.x = vStartPos.x+(fRadius*SIN(TO_FLOAT(i)*createAngle))
vTemp.y = vStartPos.y+(fRadius*COS(TO_FLOAT(i)*createAngle))
vTemp.z = fTemp
prop[0][i] = CREATE_OBJECT_NO_OFFSET(chairModel, vTemp)
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(ped[0][i], vTemp, 1.5)
vTemp -= vStartPos
SET_ENTITY_HEADING(prop[0][i], GET_HEADING_FROM_VECTOR_2D(vTemp.x, vTemp.y))
ENDREPEAT
vehRam = CREATE_VEHICLE(vehModel, GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<0, -offsetVehicleDist, 0>>), fInitialPlayerHeading)
//SET_ENTITY_VELOCITY(vehRam, vehicleVelocity)
SET_VEHICLE_FORWARD_SPEED(vehRam, vehicleSpeed)
BREAK
CASE PPT_END
SCRIPT_ASSERT("PHYSICS_TEST_TYPE = PPT_END. Most likely my fault.")
BREAK
ENDSWITCH
ENDPROC
PROC Output_Performance_Results()
STRING testName
IF iSelectedTest = ENUM_TO_INT(PPT_BOXES_NOT_TOUCHING)
testName = "PPT_BOXES_NOT_TOUCHING"
ELIF iSelectedTest = ENUM_TO_INT(PPT_BOXES_RANDOM_PILE)
testName = "PPT_BOXES_RANDOM_PILE"
ELIF iSelectedTest = ENUM_TO_INT(PPT_BOXES_STACKED)
testName = "PPT_BOXES_STACKED"
ELIF iSelectedTest = ENUM_TO_INT(PPT_NM_GROUP_NOT_TOUCHING)
testName = "PPT_NM_GROUP_NOT_TOUCHING"
ELIF iSelectedTest = ENUM_TO_INT(PPT_NM_GROUP_RANDOM_PILE)
testName = "PPT_NM_GROUP_RANDOM_PILE"
ELIF iSelectedTest = ENUM_TO_INT(PPT_VEH_NOT_TOUCHING)
testName = "PPT_VEH_NOT_TOUCHING"
ELIF iSelectedTest = ENUM_TO_INT(PPT_VEH_RANDOM_PILE)
testName = "PPT_VEH_RANDOM_PILE"
ELIF iSelectedTest = ENUM_TO_INT(PPT_PED_GROUP_STANDING)
testName = "PPT_PED_GROUP_STANDING"
ELIF iSelectedTest = ENUM_TO_INT(PPT_PED_GROUP_SHOOTING)
testName = "PPT_PED_GROUP_SHOOTING"
ELIF iSelectedTest = ENUM_TO_INT(PPT_PROPS_NOT_TOUCHING)
testName = "PPT_PROPS_NOT_TOUCHING"
ELIF iSelectedTest = ENUM_TO_INT(PPT_FRAG_PROPS_W_VEH_CRASH)
testName = "PPT_FRAG_PROPS_W_VEH_CRASH"
ELIF iSelectedTest = ENUM_TO_INT(PPT_FRAG_PROPS_W_EXP)
testName = "PPT_FRAG_PROPS_W_EXP"
ELIF iSelectedTest = ENUM_TO_INT(PPT_VEH_W_VEH_CRASH)
testName = "PPT_VEH_W_VEH_CRASH"
ELIF iSelectedTest = ENUM_TO_INT(PPT_VEH_W_EXP)
testName = "PPT_VEH_W_EXP"
ELIF iSelectedTest = ENUM_TO_INT(PPT_PED_GROUP_W_VEH_CRASH)
testName = "PPT_PED_GROUP_W_VEH_CRASH"
ELIF iSelectedTest = ENUM_TO_INT(PPT_PED_GROUP_W_EXP)
testName = "PPT_PED_GROUP_W_EXP"
ELIF iSelectedTest = ENUM_TO_INT(PPT_MIXED_GROUP)
testName = "PPT_MIXED_GROUP"
ELIF iSelectedTest = ENUM_TO_INT(PPT_PED_TABLE_GROUP_W_VEH_CRASH)
testName = "PPT_PED_TABLE_GROUP_W_VEH_CRASH"
ENDIF
OPEN_NAMED_DEBUG_FILE("X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_STRING_TO_NAMED_DEBUG_FILE(testName, "X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE("X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_STRING_TO_NAMED_DEBUG_FILE("SimUpdateTime over 1000 frames = ", "X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(SimUpdateTime, "X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE("X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_STRING_TO_NAMED_DEBUG_FILE("PreCollideTime over 1000 frames = ", "X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(PreCollideTime, "X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE("X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_STRING_TO_NAMED_DEBUG_FILE("CollideTime over 1000 frames = ", "X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(CollideTime, "X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE("X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_STRING_TO_NAMED_DEBUG_FILE("CollideJobsTime over 1000 frames = ", "X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(CollideJobsTime, "X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE("X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_STRING_TO_NAMED_DEBUG_FILE("PostCollideTime over 1000 frames = ", "X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(PostCollideTime, "X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE("X:/gta5/script/dev/Code/", "perftest.txt")
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE("X:/gta5/script/dev/Code/", "perftest.txt")
CLOSE_DEBUG_FILE()
SimUpdateTime = 0
PreCollideTime = 0
CollideTime = 0
CollideJobsTime = 0
PostCollideTime = 0
ENDPROC
PROC UPDATE_PROFILE_STATS()
FLOAT frameTime
frameTime = GET_PROFILE_STATS_FRAME_TIME("ph Simulator", "Simulator", "SimUpdate")
SimUpdateTime += frameTime
frameTime = GET_PROFILE_STATS_FRAME_TIME("ph Simulator", "Simulator", "PreCollide")
PreCollideTime += frameTime
frameTime = GET_PROFILE_STATS_FRAME_TIME("ph Simulator", "Simulator", "Collide")
CollideTime += frameTime
frameTime = GET_PROFILE_STATS_FRAME_TIME("ph Simulator", "Simulator", "CollideJobs")
CollideJobsTime += frameTime
frameTime = GET_PROFILE_STATS_FRAME_TIME("ph Simulator", "Simulator", "PostCollide")
PostCollideTime += frameTime
frameNumber++
ENDPROC
PROC Wait_for_Physics_Performance_Test_Selection()
// Use KEY_S to (S)tart auto test
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
OR bToggleAutoTest
IF bAutoTestRun
bAutoTestRun = FALSE
ELSE
Set_Creation_Defaults()
iSelectedTest = (ENUM_TO_INT(PPT_NONE))
frameNumber = numberOfTestFrames
bAutoTestRun = TRUE
ENDIF
bToggleAutoTest = FALSE
ENDIF
IF frameNumber > numberOfTestFrames-1
IF iSelectedTest <> ENUM_TO_INT(PPT_NONE)
IF SimUpdateTime > 0
Output_Performance_Results()
ENDIF
ENDIF
IF bAutoTestRun
iSelectedTest++
IF iSelectedTest = ENUM_TO_INT(PPT_END)
bAutoTestRun = FALSE
ELSE
bRunSelectedTest = TRUE
ENDIF
ENDIF
ELSE
UPDATE_PROFILE_STATS()
ENDIF
// Use KEY_DOWN to cycle through default tests
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_DOWN)
Set_Creation_Defaults()
iSelectedTest++
IF iSelectedTest = ENUM_TO_INT(PPT_END)
iSelectedTest = (ENUM_TO_INT(PPT_NONE)+1)
ENDIF
bRunSelectedTest = TRUE
ENDIF
// Use KEY_DOWN to cycle back through default tests
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_UP)
Set_Creation_Defaults()
iSelectedTest--
IF iSelectedTest <= ENUM_TO_INT(PPT_NONE)
iSelectedTest = (ENUM_TO_INT(PPT_END)-1)
ENDIF
bRunSelectedTest = TRUE
ENDIF
// Use KEY_RIGHT to replay current
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_RIGHT)
//Set_Creation_Defaults()
bRunSelectedTest = TRUE
ENDIF
IF bRunSelectedTest
// Remove all previous crap
Cleanup_Previous_Performance_Test()
// Ensure that custom options are valid, then set them.
IF NOT ARE_STRINGS_EQUAL(GET_CONTENTS_OF_TEXT_WIDGET(pedModelWidget), "New text widget")
pedModel = INT_TO_ENUM(MODEL_NAMES, GET_HASH_KEY(GET_CONTENTS_OF_TEXT_WIDGET(pedModelWidget)))
PRINTSTRING(GET_CONTENTS_OF_TEXT_WIDGET(pedModelWidget))
ENDIF
IF NOT ARE_STRINGS_EQUAL(GET_CONTENTS_OF_TEXT_WIDGET(vehModelWidget), "New text widget")
vehModel = INT_TO_ENUM(MODEL_NAMES, GET_HASH_KEY(GET_CONTENTS_OF_TEXT_WIDGET(vehModelWidget)))
PRINTSTRING(GET_CONTENTS_OF_TEXT_WIDGET(vehModelWidget))
ENDIF
IF NOT ARE_STRINGS_EQUAL(GET_CONTENTS_OF_TEXT_WIDGET(propModelWidget), "New text widget")
propModel = INT_TO_ENUM(MODEL_NAMES, GET_HASH_KEY(GET_CONTENTS_OF_TEXT_WIDGET(propModelWidget)))
PRINTSTRING(GET_CONTENTS_OF_TEXT_WIDGET(propModelWidget))
ENDIF
// Ensures the script doesn't terminate due to using an invalid model.
IF NOT IS_MODEL_IN_CDIMAGE(pedModel)
PRINTSTRING("Attempted to set an ped vehicle model. Reset to S_M_Y_CLOWN_01. \n")
pedModel = S_M_Y_CLOWN_01
ENDIF
IF NOT IS_MODEL_IN_CDIMAGE(vehModel)
PRINTSTRING("Attempted to set an invalid vehicle model. Reset to SENTINEL. \n")
vehModel = SENTINEL
ENDIF
IF NOT IS_MODEL_IN_CDIMAGE(propModel)
PRINTSTRING("Attempted to set an invalid prop model. Reset to PROP_BOX_WOOD01A. \n")
propModel = PROP_BOX_WOOD01A
ENDIF
Run_Physics_Performance_Test()
bRunSelectedTest = FALSE
ENDIF
ENDPROC
PROC Debug_Widget_Checks()
IF IS_MOUSE_BUTTON_JUST_RELEASED(MB_LEFT_BTN)
vWidgetStartPos = GET_SCRIPT_MOUSE_POINTER_IN_WORLD_COORDS()
ENDIF
IF bSetNewStartPos
vStartPos = vWidgetStartPos
tempZ = vStartPos.z
fInitialPlayerHeading = fWidgetInitialHeading
vInitialPlayerCoord = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vStartPos, fInitialPlayerHeading, <<-7.5, -10, 0>>)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_HEADING(PLAYER_PED_ID(), fInitialPlayerHeading)
SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vInitialPlayerCoord)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
ENDIF
bSetNewStartPos = FALSE
ENDIF
IF bForceCleanup
Cleanup_Previous_Performance_Test()
bForceCleanup = FALSE
ENDIF
IF bClearCustomOptions
Set_Creation_Defaults()
bClearCustomOptions = FALSE
ENDIF
ENDPROC
PROC Create_Performance_Test_Widgets()
START_WIDGET_GROUP("Physics Performance Tests")
ADD_WIDGET_FLOAT_SLIDER("vStartPos.x", vWidgetStartPos.x, -1000, 1000, 0.01)
ADD_WIDGET_FLOAT_SLIDER("vStartPos.y", vWidgetStartPos.y, -1000, 1000, 0.01)
ADD_WIDGET_FLOAT_SLIDER("vStartPos.z", vWidgetStartPos.z, -1000, 1000, 0.01)
ADD_WIDGET_FLOAT_SLIDER("Heading", fWidgetInitialHeading, 0, 359, 0.1)
ADD_WIDGET_BOOL("Set new test start position and heading", bSetNewStartPos)
ADD_WIDGET_BOOL("Force Cleanup", bForceCleanup)
ADD_WIDGET_BOOL("Set to defaults", bClearCustomOptions)
START_WIDGET_GROUP("Test type")
START_NEW_WIDGET_COMBO()
ADD_TO_WIDGET_COMBO("PPT_NONE")
ADD_TO_WIDGET_COMBO("PPT_BOXES_NOT_TOUCHING")
ADD_TO_WIDGET_COMBO("PPT_BOXES_RANDOM_PILE")
ADD_TO_WIDGET_COMBO("PPT_BOXES_STACKED")
ADD_TO_WIDGET_COMBO("PPT_NM_GROUP_NOT_TOUCHING")
ADD_TO_WIDGET_COMBO("PPT_NM_GROUP_RANDOM_PILE")
ADD_TO_WIDGET_COMBO("PPT_VEH_NOT_TOUCHING")
ADD_TO_WIDGET_COMBO("PPT_VEH_RANDOM_PILE")
ADD_TO_WIDGET_COMBO("PPT_PED_GROUP_STANDING")
ADD_TO_WIDGET_COMBO("PPT_PED_GROUP_SHOOTING")
ADD_TO_WIDGET_COMBO("PPT_PROPS_NOT_TOUCHING")
// ADD_TO_WIDGET_COMBO("PPT_PROPS_CLOTH_NOT_TOUCHING")
ADD_TO_WIDGET_COMBO("PPT_FRAG_PROPS_W_VEH_CRASH")
ADD_TO_WIDGET_COMBO("PPT_FRAG_PROPS_W_EXP")
ADD_TO_WIDGET_COMBO("PPT_VEH_W_VEH_CRASH")
ADD_TO_WIDGET_COMBO("PPT_VEH_W_EXP")
ADD_TO_WIDGET_COMBO("PPT_PED_GROUP_W_VEH_CRASH")
ADD_TO_WIDGET_COMBO("PPT_PED_GROUP_W_EXP")
ADD_TO_WIDGET_COMBO("PPT_MIXED_GROUP")
ADD_TO_WIDGET_COMBO("PPT_PED_TABLE_GROUP_W_VEH_CRASH")
STOP_WIDGET_COMBO("PHYSICS_TEST_TYPE", iSelectedTest)
ADD_WIDGET_BOOL("Run selected test", bRunSelectedTest)
STOP_WIDGET_GROUP()
// carJackStageWidget =
START_WIDGET_GROUP("Test options")
// Ped model
pedModelWidget = ADD_TEXT_WIDGET("Ped")
// Prop model
propModelWidget = ADD_TEXT_WIDGET("Prop")
// Veh model
vehModelWidget = ADD_TEXT_WIDGET("Vehicle")
//ADD_WIDGET_BOOL("Use selected model", bUseCustomOptions)
// Test size
ADD_WIDGET_INT_SLIDER("Test size", iTestSize, 1, iTestSizeMax, 1)
ADD_WIDGET_INT_SLIDER("Stack size (PPT_BOXES_STACKED)", iStackSize, 1, iStackSizeMax, 1)
ADD_WIDGET_BOOL("Run selected test", bRunSelectedTest)
// Use selected options
// Clear options after use
//ADD_WIDGET_BOOL("Clear/Reset custom options after run", bClearCustomOptions)
ADD_WIDGET_INT_SLIDER("Number of frames to collect profile stats", numberOfTestFrames, 50, 2000, 50)
ADD_WIDGET_BOOL("Toggle Auto Test ON/OFF", bToggleAutoTest)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
// ===========================================================================================================
SCRIPT(PHYSICS_PERF_STRUCT commandlineParams)
vStartPos = commandlineParams.vInput
fInitialPlayerHeading = commandlineParams.fInput
Create_The_Player()
WAIT(0)
Create_Performance_Test_Widgets()
WHILE TRUE
WAIT(0)
Wait_for_Physics_Performance_Test_Selection()
Debug_Widget_Checks()
ENDWHILE
// Allow Startup to terminate
TERMINATE_THIS_THREAD()
ENDSCRIPT
#ENDIF // IS_DEBUG_BUILD