/*************************************************************** * * * Copyright (C) 1995 by Sony Computer Entertainment * * All rights Reserved * * * * L.Evans May 97 * * * ***************************************************************/ /**************************************************************************** includes ****************************************************************************/ #include #include #include "pad.h" #include "2d1.h" #include "rand.h" #include "text_str.h" #include "address.h" #include "sound.h" #include "object.h" /**************************************************************************** structures and constants ****************************************************************************/ GsIMAGE FireTextureInfo; int ScreenWidth = 320; int ScreenHeight = 240; #define PACKETMAX 2048 /* Max GPU packets */ #define PACKETMAX2 (PACKETMAX*24) static PACKET packetArea[2][PACKETMAX2]; /* GPU PACKETS AREA */ #define OT_LENGTH 9 static GsOT Wot[2]; /* Handler of OT */ static GsOT_TAG wtags[2][1< (b)) ? (b) : (a)) #define max(a,b) ( ((a) > (b)) ? (a) : (b)) #define KeepWithinRange(quantity, min, max) \ { \ if ((quantity) < (min)) \ (quantity) = (min); \ else if ((quantity) > (max)) \ (quantity) = (max); \ } #define setVECTOR(vector, x, y, z) \ (vector)->vx = (x), (vector)->vy = (y), (vector)->vz = (z) #define ALL_ONES 0xffffffff u_long onlyNthBitOn, onlyNthBitOffMask; #define TURN_NTH_BIT_OFF(argument, sizeInBits, N) \ { \ onlyNthBitOn = 1 << (N); \ onlyNthBitOffMask = ALL_ONES ^ onlyNthBitOn; \ argument &= onlyNthBitOn; \ } /**************************************************************************** functions ****************************************************************************/ void main (void) { int hsync = 0; int bufferIndex; // buffer index u_short zValue; MATRIX tmpls; ObjectHandler *object; int i; InitialiseAll(); bufferIndex = GsGetActiveBuff(); while (QuitFlag == FALSE) { FntPrint("frame %d\n", frameNumber); FntPrint("hsync %d\n", hsync); FntPrint("cube pos %d %d %d\n", TheCubes[0].coord.coord.t[0], TheCubes[0].coord.coord.t[1], TheCubes[0].coord.coord.t[2]); FntPrint("cube scale %d %d %d\n", TheCubes[0].scalingVector.vx, TheCubes[0].scalingVector.vy, TheCubes[0].scalingVector.vz); FntPrint("projection %d\n", ProjectionDistance); FntPrint("vp %d %d %d\n", TheView.vpx, TheView.vpy, TheView.vpz); RegisterTextStringForDisplay("right pad to move cube", -150, -100); RegisterTextStringForDisplay("right pad plus START to rotate cube", -150, -90); RegisterTextStringForDisplay("right pad plus Lleft to scale cube", -150, -80); RegisterTextStringForDisplay("right pad plus L1 changes projection", -150, -70); RegisterTextStringForDisplay("right pad plus L2 to move viewpoint", -150, -60); RegisterTextStringForDisplay("select makes controls act quicker", -150, -50); RegisterTextStringForDisplay("start and select to quit", -150, -40); frameNumber++; DealWithControllerPad(); GsSetRefView2(&TheView); HandleSound(); HandleAllObjects(); GsSetWorkBase( (PACKET*)packetArea[bufferIndex]); GsClearOt(0, 0, &Wot[bufferIndex]); DisplayTextStrings (&Wot[bufferIndex]); for (i = 0; i < MAX_OBJECTS; i++) { if (ObjectArray[i] != NULL) if (ObjectArray[i]->alive == TRUE) { object = ObjectArray[i]; if (object->displayFlag == TMD) { GsGetLs(&(object->coord), &tmpls); // local to screen matrix GsSetLightMatrix(&tmpls); GsSetLsMatrix(&tmpls); GsSortObject4( &(object->handler), &Wot[bufferIndex], 3, getScratchAddr(0)); } else if (object->displayFlag == SPRITE) // speed-up here: use a fast flag { // some can use GsSortFastSprite zValue = SortSpriteObjectPosition(object); GsSortSprite( &object->sprite, &Wot[bufferIndex], zValue); } else { assert(FALSE); } } } hsync = VSync(0); ResetGraph(1); GsSwapDispBuff(); GsSortClear(0,0,4,&Wot[bufferIndex]); GsDrawOt(&Wot[bufferIndex]); bufferIndex = GsGetActiveBuff(); FntFlush(-1); } CleanupAndExit(); } void InitialiseAll (void) { PadInit(); InitialiseRandomNumbers(); InitialiseTextStrings(); InitialiseSound(); GsInitGraph(ScreenWidth, ScreenHeight, GsINTER|GsOFSGPU, 1, 0); GsDefDispBuff(0,0,0,ScreenHeight); GsInit3D(); // sort our only ordering table Wot[0].length=OT_LENGTH; Wot[0].org=wtags[0]; Wot[1].length=OT_LENGTH; Wot[1].org=wtags[1]; GsClearOt(0,0,&Wot[0]); GsClearOt(0,0,&Wot[1]); InitialiseLighting(); InitialiseView(); // sort our single texture and single sprite ProperInitialiseTexture(FIRE_TEXTURE_ADDRESS, &FireTextureInfo); // sort basic text printing FntLoad( 960, 256); FntOpen( -120, 0, 256, 200, 0, 512); InitialiseObjects(); } void InitialiseLighting (void) { // three flat light sources TheLights[0].vx = ONE; TheLights[0].vy = 0; TheLights[0].vz = 0; TheLights[0].r = 128; TheLights[0].g = 0; TheLights[0].b = 0; GsSetFlatLight(0, &TheLights[0]); TheLights[1].vx = 0; TheLights[1].vy = ONE; TheLights[1].vz = 0; TheLights[1].r = 0; TheLights[1].g = 128; TheLights[1].b = 0; GsSetFlatLight(1, &TheLights[1]); TheLights[2].vx = 0; TheLights[2].vy = 0; TheLights[2].vz = ONE; TheLights[2].r = 0; TheLights[2].g = 0; TheLights[2].b = 128; GsSetFlatLight(2, &TheLights[2]); // background lighting GsSetAmbient(ONE/2, ONE/2, ONE/2); // distance colour blending ('fogging') TheFogging.dqa = -960; TheFogging.dqb = 5120*5120; TheFogging.rfc = 0; TheFogging.gfc = 0; TheFogging.bfc = 0; GsSetFogParam( &TheFogging); // overall lighting conditions OverallLightMode = 0; // does not allow fogging GsSetLightMode(OverallLightMode); } void InitialiseView (void) { ProjectionDistance = 192; GsSetProjection(ProjectionDistance); TheView.vrx = 0; TheView.vry = 0; TheView.vrz = 0; TheView.vpx = 0; TheView.vpy = 0; TheView.vpz = -220; TheView.rz = 0; TheView.super = WORLD; GsSetRefView2(&TheView); } void InitialiseObjects (void) { int i; InitialiseObjectClass(); for (i = 0; i < MAX_CUBES; i++) { InitSingleObject(&TheCubes[i]); BringObjectToLife(&TheCubes[i], CUBE, CUBE_MODEL_ADDRESS, 0, NONE); RegisterObjectIntoObjectArray(&TheCubes[i]); } for (i = 0; i < MAX_SQUARES; i++) { InitSingleObject(&TheSquares[i]); BringObjectToLife(&TheSquares[i], SQUARE, SQUARE_MODEL_ADDRESS, 0, NONE); RegisterObjectIntoObjectArray(&TheSquares[i]); } LinkAllObjectsToModelsOrSprites(); LinkAllObjectsToTheirCoordinateSystems(); for (i = 0; i < MAX_CUBES; i++) { TheCubes[i].alive = FALSE; // start off dead } for (i = 0; i < MAX_SQUARES; i++) { TheSquares[i].alive = FALSE; // start off dead } // bring alive the first cube, position it ahead of camera TheCubes[0].alive = TRUE; TheCubes[0].position.vz = 500; // this for later variable scaling SetObjectScaling( &TheCubes[0], ONE, ONE, ONE); } void CleanupAndExit (void) { //StoreScreen2 ( (u_long*)SCREEN_SAVE_ADDRESS, 0, 0, ScreenWidth, ScreenHeight); StoreScreen(); ResetGraph(3); CleanUpSound(); // if this program part of a multiple module, // can printf to siocons to tell user to // invoke a new batch file, etc } void DealWithControllerPad (void) { long pad; int controlSpeed; pad = PadRead(); // and