#ifndef _WORLD_H_
#define _WORLD_H_
#include "brender/br_types.h"
#include "dr_types.h"
extern int gFunkotronics_array_size;
extern int gGroovidelics_array_size;
extern int gSpec_vol_mode;
extern tFunkotronic_spec* gFunkotronics_array;
extern tGroovidelic_spec* gGroovidelics_array;
extern char* gFunk_type_names[5];
extern char* gFunk_anim_names[2];
extern char* gTime_mode_names[2];
extern char* gFunk_move_names[6];
extern char* gFunk_nature_names[4];
extern char* gGroove_nature_names[2];
extern char* gAxis_names[3];
extern char* gLollipop_names[3];
extern char* gGroove_path_names[2];
extern char* gGroove_object_names[4];
extern char* gDepth_effect_names[2];
extern br_actor* gGroove_by_proxy_actor;
extern tRotate_mode gCurrent_rotate_mode;
extern tScale_mode gCurrent_scale_mode;
extern int gNumber_of_additional_models;
extern tRoad_texturing_level gRoad_texturing_level;
extern tWall_texturing_level gWall_texturing_level;
extern tCar_texturing_level gCar_texturing_level;
extern int gRendering_accessories;
extern int gNumber_of_actors;
extern int gNumber_of_lights;
extern br_actor* gActor_array[500];
extern float* gGroove_funk_bindings[960];
extern br_actor* gDelete_list[500];
extern br_actor* gLight_array[50];
extern br_model* gAdditional_models[1000];
extern br_actor* gSpec_vol_actors[100];
extern tPath_name gAdditional_actor_path;
extern tPath_name gAdditional_model_path;
extern tU32 gPrevious_groove_times[2];
extern int gRace_file_version;
extern br_vector3 gActor_centre;
extern float gTemp;
extern br_actor* gLast_actor;
extern br_actor* gKnown_actor;
extern br_actor* gAdditional_actors;
extern int gDelete_count;
extern br_scalar gNearest_distance;
extern br_actor* gNearest_actor;
extern br_actor* gStandard_lamp;
extern br_scalar gSight_distance_squared;
float MapSawToTriangle(float pNumber);
void SetSightDistance(br_scalar pYon);
br_actor* FindActorInArray(char* pThe_name);
br_actor* FindLightInArray(char* pThe_name);
br_actor* CloneActor(br_actor* pSource_actor);
void InitialiseStorageSpace(tBrender_storage* pStorage_space, int pMax_pixelmaps, int pMax_shade_tables, int pMax_materials, int pMax_models);
void DisposeStorageSpace(tBrender_storage* pStorage_space);
void ClearOutStorageSpace(tBrender_storage* pStorage_space);
tAdd_to_storage_result AddPixelmapToStorage(tBrender_storage* pStorage_space, br_pixelmap** pThe_pm);
tAdd_to_storage_result AddShadeTableToStorage(tBrender_storage* pStorage_space, br_pixelmap* pThe_st);
tAdd_to_storage_result AddMaterialToStorage(tBrender_storage* pStorage_space, br_material* pThe_mat);
tAdd_to_storage_result AddModelToStorage(tBrender_storage* pStorage_space, br_model* pThe_mod);
int LoadNPixelmaps(tBrender_storage* pStorage_space, FILE* pF, int pCount);
br_pixelmap* LoadSinglePixelmap(tBrender_storage* pStorage_space, char* pName);
br_material* LoadSingleMaterial(tBrender_storage* pStorage_space, char* pName);
int LoadNShadeTables(tBrender_storage* pStorage_space, FILE* pF, int pCount);
br_pixelmap* LoadSingleShadeTable(tBrender_storage* pStorage_space, char* pName);
int LoadNMaterials(tBrender_storage* pStorage_space, FILE* pF, int pCount);
int LoadNModels(tBrender_storage* pStorage_space, FILE* pF, int pCount);
void DodgyModelUpdate(br_model* pM);
br_material* SuffixedMaterial(br_material* pOld, char* pSuffix);
int FaceIsRoad(br_model* pModel, tU16 pFace);
br_material* RoadPerspToUntex(br_model* pModel, tU16 pFace);
br_material* WallPerspToLinear(br_model* pModel, tU16 pFace);
br_material* WallPerspToUntex(br_model* pModel, tU16 pFace);
void ProcessModelFaceMaterials2(br_model* pModel, tPMFM2CB pCallback);
void ProcessModelFaceMaterials(br_model* pModel, tPMFMCB pCallback);
int LoadNTrackModels(tBrender_storage* pStorage_space, FILE* pF, int pCount);
void LoadSomePixelmaps(tBrender_storage* pStorage_space, FILE* pF);
void LoadSomeShadeTables(tBrender_storage* pStorage_space, FILE* pF);
void LoadSomeMaterials(tBrender_storage* pStorage_space, FILE* pF);
void LoadSomeModels(tBrender_storage* pStorage_space, FILE* pF);
void LoadSomeTrackModels(tBrender_storage* pStorage_space, FILE* pF);
void AddFunkGrooveBinding(int pSlot_number, float* pPeriod_address);
void ControlBoundFunkGroove(int pSlot_number, float pValue);
float ControlBoundFunkGroovePlus(int pSlot_number, float pValue);
void ShiftBoundGrooveFunks(char* pStart, char* pEnd, ptrdiff_t pDelta);
tFunkotronic_spec* AddNewFunkotronic(void);
void DisposeFunkotronics(int pOwner);
void AddProximityVertex(br_vector3* pV, tFunkotronic_spec* pThe_funk);
void AddProximityVertexXYZ(br_scalar pX, br_scalar pY, br_scalar pZ, tFunkotronic_spec* pThe_funk);
br_uint_32 CalcProximities(br_actor* pActor, br_material* pMat, tFunkotronic_spec* pThe_funk);
br_uint_32 AddProximities(br_actor* pActor, br_material* pMat, tFunkotronic_spec* pThe_funk);
void Adjust2FloatsForExceptions(float* pVictim1, float* pVictim2, br_pixelmap* pCulprit);
void AddFunkotronics(FILE* pF, int pOwner, int pRef_offset);
void DisposeGroovidelics(int pOwner);
tGroovidelic_spec* AddNewGroovidelic(void);
void AddGroovidelics(FILE* pF, int pOwner, br_actor* pParent_actor, int pRef_offset, int pAllowed_to_be_absent);
void KillGroovadelic(int pOwner);
void KillFunkotronic(int pOwner);
br_uint_32 DeleteBastards(br_actor* pActor, br_matrix34* pMatrix, void* pArg);
void DeleteAnyZeroBastards(void);
br_uint_32 ApplyTransToModels(br_actor* pActor, br_matrix34* pMatrix, void* pArg);
int FindSpecVolIndex(br_actor* pActor);
void MungeMaterial(br_matrix34* pMat, br_material* pMat_1, br_material* pMat_2, int pAxis_0, int pAxis_1);
void SetSpecVolMatSize(br_actor* pActor);
void FindInverseAndWorldBox(tSpecial_volume* pSpec);
void UpdateSpecVol(void);
void SaveSpecialVolumes(void);
void SaveAdditionalStuff(void);
br_uint_32 ProcessMaterials(br_actor* pActor, tPMFM2CB pCallback);
br_uint_32 ProcessFaceMaterials2(br_actor* pActor, tPMFM2CB pCallback);
void ChangePerspToSubdivCB(br_material* pMaterial);
void ChangePerspToSubdiv(void);
void ChangeSubdivToPerspCB(br_material* pMaterial);
void ChangeSubdivToPersp(void);
intptr_t ProcessFaceMaterials(br_actor* pActor, tPMFMCB pCallback);
int DRPixelmapHasZeros(br_pixelmap* pm);
int StorageContainsPixelmap(tBrender_storage* pStorage, br_pixelmap* pMap);
void HideStoredOpaqueTextures(tBrender_storage* pStorage);
void RevealStoredTransparentTextures(tBrender_storage* pStorage);
void HideStoredTextures(tBrender_storage* pStorage);
void RevealStoredTextures(tBrender_storage* pStorage);
void SetCarStorageTexturingLevel(tBrender_storage* pStorage, tCar_texturing_level pNew, tCar_texturing_level pOld);
tCar_texturing_level GetCarTexturingLevel(void);
void SetCarTexturingLevel(tCar_texturing_level pLevel);
int HasThisSuffix(char* pIdent, char* pSuffix);
br_material* UnsuffixedMaterial(char* pOld_ident, char* pSuffix);
br_material* RoadUntexToPersp(br_model* pModel, tU16 pFace);
br_material* WallLinearToUntex(br_model* pModel, tU16 pFace);
br_material* WallUntexToLinear(br_model* pModel, tU16 pFace);
br_material* WallUntexToPersp(br_model* pModel, tU16 pFace);
br_material* WallLinearToPersp(br_model* pModel, tU16 pFace);
tRoad_texturing_level GetRoadTexturingLevel(void);
void SetRoadTexturingLevel(tRoad_texturing_level pLevel);
void ReallySetRoadTexturingLevel(tRoad_texturing_level pLevel);
tWall_texturing_level GetWallTexturingLevel(void);
void SetWallTexturingLevel(tWall_texturing_level pLevel);
void ReallySetWallTexturingLevel(tWall_texturing_level pLevel);
br_material* DisposeSuffixedMaterials(br_model* pModel, tU16 pFace);
void DisposeTexturingMaterials(void);
/*br_uint_32*/ intptr_t SetAccessoryRenderingCB(br_actor* pActor, void* pFlag);
void SetAccessoryRendering(int pOn);
int GetAccessoryRendering(void);
void SetCarSimplificationLevel(int pLevel);
int GetCarSimplificationLevel(void);
void ParseSpecialVolume(FILE* pF, tSpecial_volume* pSpec, char* pScreen_name_str);
void AddExceptionToList(tException_list* pDst, tException_list pNew);
void LoadExceptionsFile(char* pName);
void LoadExceptionsFileForTrack(char* pTrack_file_name);
void FreeExceptions(void);
void LoadTrack(char* pFile_name, tTrack_spec* pTrack_spec, tRace_info* pRace_info);
intptr_t RemoveBounds(br_actor* pActor, void* pArg);
void RemoveBoundsStructures(br_actor* pActor);
void FreeTrack(tTrack_spec* pTrack_spec);
void ProcessTrack(br_actor* pWorld, tTrack_spec* pTrack_spec, br_actor* pCamera, br_matrix34* pCamera_to_world_transform, int pRender_blends);
br_scalar NormaliseDegreeAngle(br_scalar pAngle);
void FunkThoseTronics(void);
void LollipopizeActor(br_actor* pSubject_actor, br_matrix34* ref_to_world, tLollipop_mode pWhich_axis);
void CalcActorGlobalPos(br_vector3* pResult, br_actor* pActor);
int PointOutOfSight(br_vector3* pPoint, br_scalar pMax_distance);
void PathGrooveBastard(tGroovidelic_spec* pGroove, tU32 pTime, br_matrix34* pMat, int pInterrupt_it);
void ObjectGrooveBastard(tGroovidelic_spec* pGroove, tU32 pTime, br_matrix34* pMat, int pInterrupt_it);
void GrooveThisDelic(tGroovidelic_spec* pGroove, tU32 pTime, int pInterrupt_it);
void GrooveThoseDelics(void);
void StopGroovidelic(br_actor* pActor);
void SetGrooveInterrupt(int pGroove_index, br_matrix34* pMatrix, int pPath_interrupt, int pObject_interrupt, float pPath_resumption, float pObject_resumption);
void ResetGrooveFlags(void);
tSpecial_volume* GetDefaultSpecialVolumeForWater(void);
tSpecial_volume* FindSpecialVolume(br_vector3* pP, tSpecial_volume* pLast_vol);
void SaveAdditionalActors(void);
br_scalar DistanceFromFace(br_vector3* pPos, tFace_ref* pFace);
br_uint_32 CalcHighestID(br_actor* pActor, int* pHighest);
br_uint_32 SetID(br_actor* pActor, void* pArg);
void UniquificateActorsName(br_actor* pUniverse_actor, br_actor* pActor);
void AccessoryHeadup(br_actor* pActor, char* pPrefix);
br_uint_32 CalcHighestNonAmID(br_actor* pActor, int* pHighest);
br_uint_32 SetIDAndDupModel(br_actor* pActor, void* pArg);
void DuplicateIfNotAmpersand(br_actor* pActor);
void DropActor(int pIndex);
void DropActor0(void);
void DropActor1(void);
void DropActor2(void);
void DropActor3(void);
void DropActor4(void);
void DropActor5(void);
void DropActor6(void);
void DropActor7(void);
void DropActor8(void);
void DropActor9(void);
br_uint_32 IdentifyAccCB(br_actor* pActor, void* pArg);
void IdentifyAcc(void);
br_uint_32 DelGrooveRef(br_actor* pActor, void* pArg);
br_uint_32 DelReferencedModels(br_actor* pActor, void* pArg);
void DeleteAcc(void);
br_uint_32 OffsetModel(br_actor* pActor, void* pArg);
void OffsetActor(br_actor* pActor, br_vector3* pOffset);
void CentreActor(br_actor* pActor, br_vector3* pOffset);
void SnapAccToVertical(void);
void RotateAccessory(br_angle pAngle);
void ScaleAccessory(float pScaling_factor);
void MoveAccessory(br_scalar pX_shift, br_scalar pY_shift, br_scalar pZ_shift);
void RotateAccL(void);
void RotateAccL2(void);
void RotateAccL3(void);
void RotateAccL4(void);
void RotateAccR(void);
void RotateAccR2(void);
void RotateAccR3(void);
void RotateAccR4(void);
void CycleAccRotate(void);
void CycleAccScale(void);
void ScaleAccUp2(void);
void ScaleAccUp3(void);
void ScaleAccUp4(void);
void ScaleAccDown2(void);
void ScaleAccDown3(void);
void ScaleAccDown4(void);
void MoveXAccL(void);
void MoveXAccL2(void);
void MoveXAccL3(void);
void MoveXAccL4(void);
void MoveXAccR(void);
void MoveXAccR2(void);
void MoveXAccR3(void);
void MoveXAccR4(void);
void MoveYAccL(void);
void MoveYAccL2(void);
void MoveYAccL3(void);
void MoveYAccL4(void);
void MoveYAccR(void);
void MoveYAccR2(void);
void MoveYAccR3(void);
void MoveYAccR4(void);
void MoveZAccL(void);
void MoveZAccL2(void);
void MoveZAccL3(void);
void MoveZAccL4(void);
void MoveZAccR(void);
void MoveZAccR2(void);
void MoveZAccR3(void);
void MoveZAccR4(void);
br_material* GetInternalMat(void);
br_material* GetExternalMat(void);
void BuildSpecVolModel(tSpecial_volume* pSpec, int pIndex, br_material* pInt_mat, br_material* pExt_mat);
void DropSpecVol(int pIndex);
void DropSpecVol0(void);
void DropSpecVol1(void);
void DropSpecVol2(void);
void DropSpecVol3(void);
void DropSpecVol4(void);
void DropSpecVol5(void);
void DropSpecVol6(void);
void DropSpecVol7(void);
void DropSpecVol8(void);
void DropSpecVol9(void);
void IdentifySpecVol(void);
void DelSpecVolumeGraph(int pIndex);
void DeleteSpecVol(void);
void RotateSpecVolL(void);
void RotateSpecVolL2(void);
void RotateSpecVolL3(void);
void RotateSpecVolL4(void);
void RotateSpecVolR(void);
void RotateSpecVolR2(void);
void RotateSpecVolR3(void);
void RotateSpecVolR4(void);
void CycleSpecVolRotate(void);
void CycleSpecVolScale(void);
void ScaleSpecVolUp2(void);
void ScaleSpecVolUp3(void);
void ScaleSpecVolUp4(void);
void ScaleSpecVolDown2(void);
void ScaleSpecVolDown3(void);
void ScaleSpecVolDown4(void);
void MoveXSpecVolL(void);
void MoveXSpecVolL2(void);
void MoveXSpecVolL3(void);
void MoveXSpecVolL4(void);
void MoveXSpecVolR(void);
void MoveXSpecVolR2(void);
void MoveXSpecVolR3(void);
void MoveXSpecVolR4(void);
void MoveYSpecVolL(void);
void MoveYSpecVolL2(void);
void MoveYSpecVolL3(void);
void MoveYSpecVolL4(void);
void MoveYSpecVolR(void);
void MoveYSpecVolR2(void);
void MoveYSpecVolR3(void);
void MoveYSpecVolR4(void);
void MoveZSpecVolL(void);
void MoveZSpecVolL2(void);
void MoveZSpecVolL3(void);
void MoveZSpecVolL4(void);
void MoveZSpecVolR(void);
void MoveZSpecVolR2(void);
void MoveZSpecVolR3(void);
void MoveZSpecVolR4(void);
void SnapSpecVolToVertical(void);
void ShowSpecialVolumes(void);
void HideSpecialVolumes(void);
#endif