void CLedgeManager::Load( const char* fileName ) { // Clear in case there is anything left Reset(); // In editor we don't load exported data, entities will recreate on load if (m_editorManager.IsInEditorMode()) return; CCryFile file; if( false != file.Open( fileName, "rb" ) ) { // File version uint32 nFileVersion; file.ReadType( &nFileVersion ); if (nFileVersion != LEDGE_DATA_FILE_VERSION) { GameWarning("!LedgeManager: Level data could not be loaded, file %s has version %d, expected %d. Level needs re-export", fileName, nFileVersion, LEDGE_DATA_FILE_VERSION); return; } // Ledges and markers info uint32 totalLedgeObjectsCount, totalLedgeMarkersCount; file.ReadType( &totalLedgeObjectsCount ); file.ReadType( &totalLedgeMarkersCount ); m_levelLedges.Allocate( totalLedgeObjectsCount, totalLedgeMarkersCount ); file.ReadType( &m_levelLedges.m_pLedgeObjects[0], totalLedgeObjectsCount ); file.ReadType( &m_levelLedges.m_pMarkers[0], totalLedgeMarkersCount ); file.Close(); } }
void CLedgeManagerEdit::Export( const char* fileName ) const { const uint32 totalLedgeObjectsCount = m_ledgeObjects.size(); if (totalLedgeObjectsCount > 0) { CCryFile file; if( false != file.Open( fileName, "wb" ) ) { // Count number of markers ... uint32 totalLedgeMarkersCount = 0; for (uint32 objectIdx = 0; objectIdx < totalLedgeObjectsCount; ++objectIdx) { totalLedgeMarkersCount += m_ledgeObjects[objectIdx].m_markers.size(); } // Prepare buffers ... SLedgeObject ledgeObjectBuffer[MAX_LEDGE_ENTITIES]; SLedgeMarkerBuffer ledgeMarkersBuffer(totalLedgeMarkersCount); uint32 currentMarkerIdx = 0; for (uint32 objectIdx = 0; objectIdx < totalLedgeObjectsCount; ++objectIdx) { SLedgeObject& ledgeObject = ledgeObjectBuffer[objectIdx]; const SLedgeObjectEditor& ledgeObjectEdit = m_ledgeObjects[objectIdx]; ledgeObject.m_entityId = ((ledgeObjectEdit.m_ledgeFlags[LedgeSide_In] & kLedgeFlag_static) == 0) ? ledgeObjectEdit.m_entityId : 0; ledgeObject.m_ledgeFlags[LedgeSide_In] = ledgeObjectEdit.m_ledgeFlags[LedgeSide_In]; ledgeObject.m_ledgeFlags[LedgeSide_Out] = ledgeObjectEdit.m_ledgeFlags[LedgeSide_Out]; ledgeObject.m_ledgeCornerEndAdjustAmount = ledgeObjectEdit.m_ledgeCornerEndAdjustAmount; ledgeObject.m_markersStartIdx = currentMarkerIdx; ledgeObject.m_markersCount = ledgeObjectEdit.m_markers.size(); CRY_ASSERT((ledgeObject.m_markersStartIdx + ledgeObject.m_markersCount) <= totalLedgeMarkersCount); for(size_t markerIdx = 0; markerIdx < ledgeObjectEdit.m_markers.size(); ++markerIdx) { ledgeMarkersBuffer.InsertAt( ledgeObjectEdit.m_markers[markerIdx], currentMarkerIdx + markerIdx ); } currentMarkerIdx += ledgeObject.m_markersCount; } // Write to file... // File version uint32 nFileVersion = LEDGE_DATA_FILE_VERSION; file.Write( &nFileVersion,sizeof(nFileVersion) ); // Ledges and markers info file.Write( &totalLedgeObjectsCount, sizeof(totalLedgeObjectsCount) ); file.Write( &totalLedgeMarkersCount, sizeof(totalLedgeMarkersCount) ); file.Write( &ledgeObjectBuffer[0], sizeof(ledgeObjectBuffer[0]) * totalLedgeObjectsCount ); file.Write( &ledgeMarkersBuffer.pMarkers[0], sizeof(ledgeMarkersBuffer.pMarkers[0]) * ledgeMarkersBuffer.bufferSize ); file.Close(); } } }
void CGameVolumesManager::Export( const char* fileName ) const { CCryFile file; if( false != file.Open( fileName, "wb" ) ) { const uint32 maxVertices = 512; Vec3 writeVertexBuffer[maxVertices]; // File version uint32 nFileVersion = GAME_VOLUMES_FILE_VERSION; file.Write( &nFileVersion,sizeof(nFileVersion) ); // Save volume info uint32 nVolumeCount = (uint32)m_volumesData.size(); file.Write( &nVolumeCount, sizeof(nVolumeCount) ); for (uint32 i = 0; i < nVolumeCount; ++i) { const EntityVolume& volumeInfo = m_volumesData[i]; CRY_ASSERT ( volumeInfo.vertices.size() < maxVertices ); uint32 nVertexCount = min( (uint32)volumeInfo.vertices.size(), maxVertices ); uint32 nEntityId = volumeInfo.entityId; f32 fHeight = volumeInfo.height; bool bClosed = volumeInfo.closed; file.Write( &nEntityId, sizeof(nEntityId) ); file.Write( &fHeight, sizeof(fHeight) ); if( nFileVersion > 1 ) { file.Write( &bClosed, sizeof(bClosed) ); } file.Write( &nVertexCount, sizeof(nVertexCount) ); if (nVertexCount > 0) { for (uint32 v = 0; v < nVertexCount; ++v) { writeVertexBuffer[v] = volumeInfo.vertices[v]; } file.Write( &writeVertexBuffer[0], sizeof(writeVertexBuffer[0]) * nVertexCount ); } } file.Close(); } }
void CGameVolumesManager::Load( const char* fileName ) { ////////////////////////////////////////////////////////////////////////// /// Free any left data (it should be empty though...) Reset(); ////////////////////////////////////////////////////////////////////////// /// No need to load in editor /// The saved entities will restore the data inside the manager if (gEnv->IsEditor()) return; CCryFile file; if( false != file.Open( fileName, "rb" ) ) { uint32 nFileVersion = GAME_VOLUMES_FILE_VERSION; file.ReadType( &nFileVersion ); // Verify version... if ((nFileVersion >= 1) && (nFileVersion <= GAME_VOLUMES_FILE_VERSION)) { const uint32 maxVertices = 512; Vec3 readVertexBuffer[maxVertices]; // Read volumes uint32 nVolumeCount = 0; file.ReadType( &nVolumeCount ); m_volumesData.resize( nVolumeCount ); for (uint32 i = 0; i < nVolumeCount; ++i) { EntityVolume& volumeInfo = m_volumesData[i]; uint32 nVertexCount = 0; uint32 nEntityId = 0; f32 fHeight = 0; bool bClosed = false; file.ReadType( &nEntityId ); file.ReadType( &fHeight ); if( nFileVersion > 1 ) { file.ReadType( &bClosed ); } file.ReadType( &nVertexCount ); volumeInfo.entityId = (EntityId)nEntityId; volumeInfo.height = fHeight; volumeInfo.closed = bClosed; volumeInfo.vertices.resize( nVertexCount ); if (nVertexCount > 0) { file.ReadType( &readVertexBuffer[0], nVertexCount ); for (uint32 v = 0; v < nVertexCount; ++v) { volumeInfo.vertices[v] = readVertexBuffer[v]; } } } } else { GameWarning("GameVolumesManger:Load - Failed to load file '%s'. Version mis-match, try to re-export your level", fileName); } file.Close(); } }