/************************************************************ * * * tunnel2.h * * * * * LPGE 1997 * * * * Copyright (C) 1996 Sony Computer Entertainment Inc. * * All Rights Reserved * * * ***********************************************************/ #ifndef TUNNEL_2_H_INCLUDED /**************************************************************************** includes ****************************************************************************/ #include "sys_libs.h" /**************************************************************************** constants, structures, globals ****************************************************************************/ #define PLUS_X 0 #define MINUS_X 1 #define PLUS_Y 2 #define MINUS_Y 3 #define PLUS_Z 4 #define MINUS_Z 5 #define X_Y_PLANE 0 #define X_Z_PLANE 1 #define Y_Z_PLANE 2 #define STRAIGHT 0 #define SIMPLE_CURVE 1 #define Z_ONLY_CURVE 2 #define MAX_SECTIONS_PER_CHUNK 32 #define ON_STRAIGHT 0 #define ENTERING_CURVE 1 #define DURING_CURVE 2 #define EXITING_CURVE 3 // NOTE: thetaZ happens once at start of chunk // thetaX and thetaY apply to every section in chunk typedef struct { short type; short numberSections; short thetaX, thetaY, thetaZ, pad; } TunnelChunk; #define MAX_CHUNKS_PER_DESCRIPTION 32 #define MAX_IMAGES_PER_DESCRIPTION 16 // how tunnel is textured #define SINGLE_TUNNEL_TEXTURE 1 #define ONE_TEXTURE_PER_CHUNK 2 #define ONE_TEXTURE_PER_N_SECTIONS 3 #define ONE_TEXTURE_PER_N_POLYGONS 4 #define SPREAD_N_TEXTURES_EVENLY 5 // for section-polygon-level specification #define FULL_MAP (1 << 16) // light effects #define THREE_COLOURED_LIGHTS 1 #define CYCLE_THREE_LIGHTS_AROUND_AXES 2 #define CYCLE_THREE_LIGHTS_BRIGHTLY_AROUND_AXES 3 #define CYCLE_LIGHTS_BRIGHTNESS 4 #define CYCLE_THREE_LIGHTS_DIRECTION_AND_COLOUR 5 #define THREE_WHITE_LIGHTS 6 // values for twoDflag; FALSE when not 2d #define X_Z_PLANE_ONLY 1 #define Y_Z_PLANE_ONLY 2 #define MAX_CLUT_ANIMATIONS_PER_DESCRIPTION 4 typedef struct { GsIMAGE *image; int animationPeriod; int animationFunctionLabel; int numberCells; u_short initialFourBitClut[16]; u_short initialEightBitClut[256]; u_short bufferFourBitClut[16]; u_short bufferEightBitClut[256]; } ClutAnimation; #define MAX_DRAW_PROCESSES_PER_DESCRIPTION 4 typedef struct { int id; int alive; RECT clipArea; u_short offsets[2]; int otLabel; int packetAreaLabel; int screenShowFlag; } DrawProcess; // should really use pointer and malloc to save space here typedef struct { short numberChunks; TunnelChunk listOfChunks[MAX_CHUNKS_PER_DESCRIPTION]; int classicShapeID; // dimensions short sectionLength; short outerRadius; // smoothness short shapesPerSection; // visual parameters short numberSectionsDrawn; short drawBackOffset; short numberSectionsSubdivided; short subdivisionBackOffset; short subdivisionExtent; short twoDflag; // FALSE, X_Z_PLANE_ONLY, Y_Z_PLANE_ONLY short texturingType; int textureNumber; // meaning depends on texturingType short numberImages; int listOfImageIds[MAX_IMAGES_PER_DESCRIPTION]; short listOfTwistFlags[MAX_IMAGES_PER_DESCRIPTION]; RECT listOfOffsets[MAX_IMAGES_PER_DESCRIPTION]; short tunnelLightingEffect; short lightEffectPeriod; int fogActive; int dqa, dqb; short fogR, fogG, fogB; short fogEffectFlag; short ambientEffectFlag; short ambientRed, ambientGreen, ambientBlue; int totalDistance; int bestLapTimeInFrames; short numberClutAnimations; ClutAnimation *listOfClutAnimations[MAX_CLUT_ANIMATIONS_PER_DESCRIPTION]; short numberDrawProcesses; DrawProcess drawingProcesses[MAX_DRAW_PROCESSES_PER_DESCRIPTION]; int tunnelHighlightFlag; int highlightEffectId; int highlightData1, highlightData2; } TunnelDescription; #define NUMBER_SET_TRACKS 64 extern TunnelDescription *SetTracks; extern int TrackViewerSpeed; extern int TrackViewerZAngle; // types of tunnel wrt flying #define SINGLE_CIRCLE 0 // this below: straight, curve, straight, curve, etc #define SIMPLE_TUNNEL 1 #define COMPLEX_TUNNEL 2 #define NO_BEST_TIME_FOR_SET_TRACK 0x01ffffff #define DEFAULT_BEST_LAP_TIME_FRAMES_PER_SECTION 24 #define DEFAULT_LAP_TIME 65536 // different ways to handle ships in tunnel #define IGNORE_COLLISIONS 0 #define ASSERT_NO_COLLISIONS_ONLY 1 #define DETECT_AND_HANDLE_COLLISIONS 2 #define SHIP_TO_SHIP_COLLISION_VELOCITY_DAMPING_FACTOR 3072 #define MOVE_PROPERLY 1 #define MOVE_BLAGGERY 2 // special movement flags for movement patterns/functions #define FIRST_CHEATER 0 #define TRACK_VIEWER_AUTO_CAMERA 1 #define TRACK_VIEWER_USER_CONTROLLED_CAMERA 0 #define VIEW_TRACK_FROM_INSIDE 0 #define VIEW_TRACK_FROM_OUTSIDE 1 extern int TrackViewerMainMode; #define TRACK_VIEWER_AUTO_CAMERA_SLOW_MODE 0 #define TRACK_VIEWER_AUTO_CAMERA_FAST_MODE 1 #define TRACK_VIEWER_AUTO_CAMERA_SUPER_FAST_MODE 2 #define TRACK_VIEWER_AUTO_CAMERA_TWISTER_MODE 3 #define TRACK_VIEWER_AUTO_CAMERA_ROLLERCOASTER_MODE 4 #define TRACK_VIEWER_AUTO_CAMERA_TWISTING_ROLLERCOASTER_MODE 5 #define TRACK_VIEWER_AUTO_CAMERA_ZOOM_ROLLERCOASTER_MODE 6 extern ObjectHandler ViewerObject; extern GsCOORDINATE2 TrackViewerCoord; extern int TrackViewerCameraControlMode; extern int TrackViewerAutoCameraMode; extern int TrackViewerShipViewMode; extern int TrackViewerDirection; extern int FrameWhenTrackViewingStarts; extern int TrackViewerDeviationAngle; extern int TrackViewingSpeedIncreasePeriod; // for when viewing whole track from outside #define DEFAULT_WHOLE_TRACK_CENTRE_DISTANCE 32768 #define MINIMUM_WHOLE_TRACK_CENTRE_DISTANCE 1024 #define MAXIMUM_WHOLE_TRACK_CENTRE_DISTANCE 60000 extern int TrackViewerWholeTrackCentreDistance; extern SVECTOR TrackViewerWholeTrackCoordTwist; // actual speeds: frames per section #define NORMAL_SPEED_FPS 8 #define MAXIMUM_SPEED_FPS 2 #define NORMAL_SPEED_32 1 #define MAXIMUM_SPEED_32 64 extern int RollingDemoActiveFlag; extern int RollingDemoDeliberateFlag; extern int RollingDemoStartFrame; extern int RollingDemoFirstTimeEverFlag; extern int RollingDemoAiFlierModelNumber; extern int PlayerOneModelNumber; extern int PlayerTwoModelNumber; #define ROLLING_DEMO_TRACK_VIEWING 0 #define ROLLING_DEMO_SOLO_AI_FLIER 1 #define ROLLING_DEMO_AI_FLIERS_RACE 2 extern int RollingDemoMainMode; // 60 seconds NTSC, 72 seconds PAL #define ROLLING_DEMO_NATURAL_DURATION 3600 extern int HighlightSectionOffsetWithinSection; extern int HighlightSpeed, HighlightMaxSpeed; extern int HighlightSectionSpacing; extern int HighlightPeriod; // speed types for solo AI flier #define SLOW_FLIER 1 #define SLOWISH_FLIER 2 #define FASTISH_FLIER 3 #define NUMBER_DEMO_FLIER_SPEED_MODES 3 #define DEFAULT_NUMBER_SECTIONS_DRAWN 8 #define DEFAULT_DRAW_BACK_OFFSET 2 #define DEFAULT_SUBDIVISION_BACK_OFFSET 1 #define DEFAULT_NUMBER_SECTIONS_SUBDIVIDED 3 #define DEFAULT_SUBDIVISION_EXTENT 2 // good alternatives: //#define DEFAULT_NUMBER_SECTIONS_SUBDIVIDED 4 //#define DEFAULT_SUBDIVISION_EXTENT 1 // first one uses section-level effects #define EVEN_SPACED_SECTIONS_MOVE_BACK_AND_FORTH 1 // others use polygon-level effects #define FULL_LENGTH_SNAKE_OSCILLATES_AROUND_TUNNEL 2 #define SHORT_SNAKE_SPIRALS_BACK_AND_FORTH 3 #define TWO_SNAKES_OSCILLATE_AROUND_TUNNEL_IN_HELIX 4 #define TWO_QUARTERS_SNAKE_OSCILLATES 5 #define SNAKE_GROWS_AND_SHRINKS 6 // section-level effects #define SECTION_BRIGHTENING 1 #define SECTION_DARKENING 2 #define SECTION_ACCENTUATE_X 3 #define SECTION_ACCENTUATE_Y 4 #define SECTION_ACCENTUATE_Z 5 // polygon-level effects #define POLYGON_BRIGHTEN 1 #define POLYGON_DARKEN 2 #define POLY_ACCENTUATE_X 3 #define POLY_ACCENTUATE_Y 4 #define POLY_ACCENTUATE_Z 5 #define POLY_NEW_RAND_FIXED_TEXTURE 6 #define POLY_NEW_RAND_CHANGING_TEXTURE 7 /**************************************************************************** prototypes ****************************************************************************/ void PrintSpline (VECTOR* spline, int numberPoints); void PrintTunnelChunk (TunnelChunk* chunk); void PrintTunnelDescription (TunnelDescription* description); void MakeTunnelChunk (TunnelChunk* chunk, int numberSections, int thetaX, int thetaY, int thetaZ); void CopyChunk (TunnelChunk* from, TunnelChunk* to); void MakeTunnelDescriptionFromChunks (TunnelDescription* description, int numberChunks, TunnelChunk* listOfChunks); void InferTwoDFlagForDescription (TunnelDescription* description); void InitDescription (TunnelDescription* description); void CopyDescription (TunnelDescription* from, TunnelDescription* to); int NumberSectionsInTunnelDescription (TunnelDescription* description); int WhichChunkInDescription (TunnelDescription *description, int sectionID); void GetChunkNumberAndOffset (TunnelDescription *description, int sectionID, int *chunkID, int *chunkOffset); // texturing and flat light settings for tracks void SetTextureDataForTunnelDescription (TunnelDescription *description, int textureType, int numberImages, int *listOfImageIds, int *twistFlags, RECT *listOfOffsets, int tetureNdata); void InitialiseLightingForTrack (TunnelDescription *description); void SetTrackLighting (TunnelDescription *description, int lightingEffect, int lightEffectPeriod); void SetDefaultLightingAndTexturingForDescription (TunnelDescription *description); // fogging for tracks void SetTrackFogging (TunnelDescription *description, int dqa, int dqb, int fogR, int fogG, int fogB); void InitialiseFoggingForTrack (TunnelDescription *description); void SetFogEffectForTrack (TunnelDescription *description, int fogEffectID); void HandleTunnelFogEffect (void); void OscillateFoggingColourBrightness (void); void OscillateFoggingColourThroughSpectrum (void); // ambient light levels for tracks void SetAmbientLevelForTrack (TunnelDescription *description, int r, int g, int b); void InitialiseAmbientLightForTrack (TunnelDescription *description); void SetAmbientEffectForTrack (TunnelDescription *description, int effectID); void HandleTunnelAmbientEffect (void); void OscillateAmbientColours (void); void SetAmbientByShipSpeed (void); // main track parameters: size dimensions, smoothness, amount drawn void SetDescriptionSizeParameters (TunnelDescription *description, int sectionLength, int outerRadius); void SetDescriptionShapesPerSection (TunnelDescription *description, int number); void SetDescriptionNumberSectionsDrawn (TunnelDescription *description, int number); void SetDescriptionDrawParameters (TunnelDescription *description, int numberDrawn, int drawBackOffset); void SetDescriptionSubdivisionParameters (TunnelDescription *description, int numberSectionsSubdivided, int subdivisionBackOffset, int subdivisionExtent); void CreateDescriptionFromRotationList (TunnelDescription* description, int numberRotations, SVECTOR* rotationList, TunnelChunk* listOfChunks); void GenerateRotationListFromTunnelDescription (TunnelDescription* description, SVECTOR* rotationList, int maxNumberRotations); void GenerateSplineFromTunnelDescription (TunnelDescription* description, VECTOR* splineList, int maxNumberSplinePoints, VECTOR* startPoint, MATRIX* startOrientation, int sectionLength); void BuildFirstTunnelFromChunks (void); void BuildTunnelFromDescription (TunnelDescription* description, VECTOR* startPoint, MATRIX* startOrientation); void InferSoundToGraphicUseFromTunnelDescription (void); void GenerateAndPrintSplineListOfDescription (TunnelDescription* description, VECTOR* startPoint, MATRIX* startOrientation); void BuildTunnelFromSetTrack (int trackNumber); void FirstEverTunnelInit (void); void SortTunnelToSetTrack (int setTracklD); void HandleAShipsMovementInTunnel (ObjectHandler* object, int viewObjectFlag, int playersShipFlag, int collisionDealingFlag, int movementUpdateFlag); void AssertObjectHasNoCollisions (ObjectHandler* object, int newSection, VECTOR* newPos); void HandleObjectBlaggeryMovement (ObjectHandler* object); void HandleRacePositions (void); void HandleAllShipCollisions (void); void HandleShipCollisions (ObjectHandler *first, ObjectHandler *second); int ShipGrossPositionInRace (ObjectHandler* ship); void SortShipPositionsAndBestLapTimes (void); void FleshOutLapTimesForShipsStillRacing (void); void HandleSomeShipsMovementInTunnel (ObjectHandler* object); void ResetTrackViewingData (void); void SetUpTheViewer (void); void BringAliveLocalTunnelAroundTrackViewer (void); void HandleTrackViewer (void); void MoveTrackViewer (void); void CompensateForCurveWithCamera (int tunnelSectionID); void GetCurveStatus (ObjectHandler *object, int *type, int *fraction); void RotateCameraForWholeTrack (void); void CalculateEachSectionsTotalAngle (void); void PrintTunnelSectionAngles (void); void PrintTunnelSplineCurve (void); void InitialiseTrackClutAnimation (TunnelDescription *description); void SetClutAnimation (ClutAnimation *animation, GsIMAGE *image, int period, int functionLabel, int numberCells); void SetClutAnimationsForTrackDescription (TunnelDescription *description, int numberAnimations, ClutAnimation *listOfAnimations); void HandleTunnelClutAnimations (void); void SimpleCycleFourBitClut (ClutAnimation *animation); void SimpleCycleEightBitClut (ClutAnimation *animation); void CycleFirstAndSecond256CellsThroughRainbow (ClutAnimation *animation); void ResetCluts(); void HandleTunnelDrawProcesses (void); void ExecuteSingleDrawProcess (DrawProcess *process); void GetOtOfProcess (DrawProcess *process, int bufferIndex, GsOT **ot); void GetWorkAreaOfProcess (DrawProcess *process, int bufferIndex, PACKET **workArea); void SetDrawProcess (DrawProcess *process, int id, RECT *clipArea, u_short *offsets, int otLabel, int packetAreaLabel); void SetDrawProcess2 (DrawProcess *process, GsIMAGE *dynamicTextureArea, int id, int otLabel, int packetAreaLabel); void SetDrawProcessesForTrack (TunnelDescription *description, int numberProcesses, DrawProcess *listOfProcesses); void ClearDataForDrawProcesses (void); void ClearAllDrawingBusiness (void); int FindGrossViewFlag (int viewSection); int GetOffsetOfPoint (VECTOR *point, int sectionID); int GetTotalAngleAtPoint (int sectionID, int offsetRatio); int GetAngularChangeAtPoint (int sectionID, int offsetRatio); void ProperGetCurveStatus (int sectionID, int offsetRatio, int *statusFlag, int *angleOnThisCurve); void GetNewSectionAndOffset (int sectionID, int offsetRatio, int sectionIncrement, int offsetIncrement, int *newSectionID, int *newOffsetRatio); void GetDividedSectionAndOffset (int numberSections, int offsetRatio, int divisor, int *newNumberSections, int *newOffsetRatio); int GetTunnelCurvatureAtPoint (int sectionID, int offsetRatio); void SetTrackHighlightEffect (TunnelDescription *track, int effectID, int data1, int data2); void InitialiseHighlightingForTrack (TunnelDescription *description); void HandleHighlightingForTrack (void); void ResetDataDueToHighlighting (void); #define TUNNEL_2_H_INCLUDED 1 #endif