/** * (Partially) prefill the given tiles with data already cached with data of the given types. * * Currently prefill is done by looking for the parent tile in the cache * and copying data that intersects the bounding box of the given tile. */ void DataTileCache::PrefillDataFromCache(Tile& tile, const TypeInfoSet& nodeTypes, const TypeInfoSet& wayTypes, const TypeInfoSet& areaTypes, const TypeInfoSet& optimizedWayTypes, const TypeInfoSet& optimizedAreaTypes) { if (tile.GetId().GetLevel()>0) { TileId parentTileId=tile.GetId().GetParent(); TileRef parentTile=GetCachedTile(parentTileId); GeoBox boundingBox=tile.GetBoundingBox(); if (parentTile) { ResolveNodesFromParent(tile,*parentTile,boundingBox,nodeTypes); ResolveOptimizedWaysFromParent(tile,*parentTile,boundingBox,optimizedWayTypes,wayTypes); ResolveWaysFromParent(tile,*parentTile,boundingBox,wayTypes); ResolveOptimizedAreasFromParent(tile,*parentTile,boundingBox,optimizedAreaTypes,areaTypes); ResolveAreasFromParent(tile,*parentTile,boundingBox,areaTypes); return; } } /* Magnification zoomedInMagnification; zoomedInMagnification.SetLevel(tile.GetId().GetLevel()+1); TileId childIds[4]={TileId(zoomedInMagnification,tile.GetId().GetX()*2,tile.GetId().GetY()*2), TileId(zoomedInMagnification,tile.GetId().GetX()*2+1,tile.GetId().GetY()*2), TileId(zoomedInMagnification,tile.GetId().GetX()*2,tile.GetId().GetY()*2+1), TileId(zoomedInMagnification,tile.GetId().GetX()*2+1,tile.GetId().GetY()*2+1)}; TileRef childTiles[4]; for (size_t i=0; i<4; i++) { childTiles[i]=GetCachedTile(childIds[i]); } if (childTiles[0] && childTiles[1] && childTiles[2] && childTiles[3]) { std::cout << "Prefilling from children..." << std::endl; }*/ }
ANITILE *CreateAnimationTile( ANITILE_PARAMS *pAniParams ) { ANITILE *pAniNode; ANITILE *pNewAniNode; LEVELNODE *pNode; INT32 iCachedTile=-1; INT16 sGridNo; UINT8 ubLevel; INT16 usTileType; INT16 usTileIndex; INT16 sDelay; INT16 sStartFrame=-1; UINT32 uiFlags; LEVELNODE *pGivenNode; INT16 sX, sY, sZ; UINT8 ubTempDir; // Get some parameters from structure sent in... sGridNo = pAniParams->sGridNo; ubLevel = pAniParams->ubLevelID; usTileType = pAniParams->usTileType; usTileIndex = pAniParams->usTileIndex; sDelay = pAniParams->sDelay; sStartFrame = pAniParams->sStartFrame; uiFlags = pAniParams->uiFlags; pGivenNode = pAniParams->pGivenLevelNode; sX = pAniParams->sX; sY = pAniParams->sY; sZ = pAniParams->sZ; pAniNode = pAniTileHead; // Allocate head pNewAniNode = MemAlloc( sizeof( ANITILE ) ); if ( (uiFlags & ANITILE_EXISTINGTILE ) ) { pNewAniNode->pLevelNode = pGivenNode; pNewAniNode->pLevelNode->pAniTile = pNewAniNode; } else { if ( ( uiFlags & ANITILE_CACHEDTILE ) ) { iCachedTile = GetCachedTile( pAniParams->zCachedFile ); if ( iCachedTile == -1 ) { return( NULL ); } usTileIndex = iCachedTile + TILE_CACHE_START_INDEX; } // ALLOCATE NEW TILE switch( ubLevel ) { case ANI_STRUCT_LEVEL: pNode = ForceStructToTail( sGridNo, usTileIndex ); break; case ANI_SHADOW_LEVEL: AddShadowToHead( sGridNo, usTileIndex ); pNode = gpWorldLevelData[ sGridNo ].pShadowHead; break; case ANI_OBJECT_LEVEL: AddObjectToHead( sGridNo, usTileIndex ); pNode = gpWorldLevelData[ sGridNo ].pObjectHead; break; case ANI_ROOF_LEVEL: AddRoofToHead( sGridNo, usTileIndex ); pNode = gpWorldLevelData[ sGridNo ].pRoofHead; break; case ANI_ONROOF_LEVEL: AddOnRoofToHead( sGridNo, usTileIndex ); pNode = gpWorldLevelData[ sGridNo ].pOnRoofHead; break; case ANI_TOPMOST_LEVEL: AddTopmostToHead( sGridNo, usTileIndex ); pNode = gpWorldLevelData[ sGridNo ].pTopmostHead; break; default: return( NULL ); } // SET NEW TILE VALUES pNode->ubShadeLevel=DEFAULT_SHADE_LEVEL; pNode->ubNaturalShadeLevel=DEFAULT_SHADE_LEVEL; pNewAniNode->pLevelNode = pNode; if ( ( uiFlags & ANITILE_CACHEDTILE ) ) { pNewAniNode->pLevelNode->uiFlags |= ( LEVELNODE_CACHEDANITILE ); pNewAniNode->sCachedTileID = (INT16)iCachedTile; pNewAniNode->usCachedTileSubIndex = usTileType; pNewAniNode->pLevelNode->pAniTile = pNewAniNode; pNewAniNode->sRelativeX = sX; pNewAniNode->sRelativeY = sY; pNewAniNode->pLevelNode->sRelativeZ = sZ; } // Can't set relative X,Y,Z IF FLAGS ANITILE_CACHEDTILE set! else if ( (uiFlags & ANITILE_USEABSOLUTEPOS ) ) { pNewAniNode->pLevelNode->sRelativeX = sX; pNewAniNode->pLevelNode->sRelativeY = sY; pNewAniNode->pLevelNode->sRelativeZ = sZ; pNewAniNode->pLevelNode->uiFlags |= ( LEVELNODE_USEABSOLUTEPOS ); } } switch( ubLevel ) { case ANI_STRUCT_LEVEL: ResetSpecificLayerOptimizing( TILES_DYNAMIC_STRUCTURES ); break; case ANI_SHADOW_LEVEL: ResetSpecificLayerOptimizing( TILES_DYNAMIC_SHADOWS ); break; case ANI_OBJECT_LEVEL: ResetSpecificLayerOptimizing( TILES_DYNAMIC_OBJECTS ); break; case ANI_ROOF_LEVEL: ResetSpecificLayerOptimizing( TILES_DYNAMIC_ROOF ); break; case ANI_ONROOF_LEVEL: ResetSpecificLayerOptimizing( TILES_DYNAMIC_ONROOF ); break; case ANI_TOPMOST_LEVEL: ResetSpecificLayerOptimizing( TILES_DYNAMIC_TOPMOST ); break; } // SET FLAGS FOR LEVELNODE pNewAniNode->pLevelNode->uiFlags |= ( LEVELNODE_ANIMATION | LEVELNODE_USEZ | LEVELNODE_DYNAMIC ); if ( ( uiFlags & ANITILE_NOZBLITTER ) ) { pNewAniNode->pLevelNode->uiFlags |= LEVELNODE_NOZBLITTER; } if ( ( uiFlags & ANITILE_ALWAYS_TRANSLUCENT ) ) { pNewAniNode->pLevelNode->uiFlags |= LEVELNODE_REVEAL; } if ( ( uiFlags & ANITILE_USEBEST_TRANSLUCENT ) ) { pNewAniNode->pLevelNode->uiFlags |= LEVELNODE_USEBESTTRANSTYPE; } if ( ( uiFlags & ANITILE_ANIMATE_Z ) ) { pNewAniNode->pLevelNode->uiFlags |= LEVELNODE_DYNAMICZ; } if ( ( uiFlags & ANITILE_PAUSED ) ) { pNewAniNode->pLevelNode->uiFlags |= ( LEVELNODE_LASTDYNAMIC | LEVELNODE_UPDATESAVEBUFFERONCE ); pNewAniNode->pLevelNode->uiFlags &= (~LEVELNODE_DYNAMIC ); } if ( ( uiFlags & ANITILE_OPTIMIZEFORSMOKEEFFECT ) ) { pNewAniNode->pLevelNode->uiFlags |= LEVELNODE_NOWRITEZ; } // SET ANITILE VALUES pNewAniNode->ubLevelID = ubLevel; pNewAniNode->usTileIndex = usTileIndex; if ( ( uiFlags & ANITILE_CACHEDTILE ) ) { pNewAniNode->usNumFrames = gpTileCache[ iCachedTile ].ubNumFrames; } else { Assert( gTileDatabase[ usTileIndex ].pAnimData != NULL ); pNewAniNode->usNumFrames = gTileDatabase[ usTileIndex ].pAnimData->ubNumFrames; } if ( ( uiFlags & ANITILE_USE_DIRECTION_FOR_START_FRAME ) ) { // Our start frame is actually a direction indicator ubTempDir = gOneCDirection[ pAniParams->uiUserData3 ]; sStartFrame = (UINT16)sStartFrame + ( pNewAniNode->usNumFrames * ubTempDir ); } if ( ( uiFlags & ANITILE_USE_4DIRECTION_FOR_START_FRAME ) ) { // Our start frame is actually a direction indicator ubTempDir = gb4DirectionsFrom8[ pAniParams->uiUserData3 ]; sStartFrame = (UINT16)sStartFrame + ( pNewAniNode->usNumFrames * ubTempDir ); } pNewAniNode->usTileType = usTileType; pNewAniNode->pNext = pAniNode; pNewAniNode->uiFlags = uiFlags; pNewAniNode->sDelay = sDelay; pNewAniNode->sCurrentFrame = sStartFrame; pNewAniNode->uiTimeLastUpdate = GetJA2Clock( ); pNewAniNode->sGridNo = sGridNo; pNewAniNode->sStartFrame = sStartFrame; pNewAniNode->ubKeyFrame1 = pAniParams->ubKeyFrame1; pNewAniNode->uiKeyFrame1Code = pAniParams->uiKeyFrame1Code; pNewAniNode->ubKeyFrame2 = pAniParams->ubKeyFrame2; pNewAniNode->uiKeyFrame2Code = pAniParams->uiKeyFrame2Code; pNewAniNode->uiUserData = pAniParams->uiUserData; pNewAniNode->ubUserData2 = pAniParams->ubUserData2; pNewAniNode->uiUserData3 = pAniParams->uiUserData3; //Set head pAniTileHead = pNewAniNode; // Set some special stuff return( pNewAniNode ); }