//---------------------------------------------------------------------------- void SESound::Link(SEStream& rStream, SEStream::SELink* pLink) { SESpatial::Link(rStream, pLink); SEObject* pLinkID = pLink->GetLinkID(); ModelBound = (SEBoundingVolume*)rStream.GetFromMap(pLinkID); pLinkID = pLink->GetLinkID(); SBuffer = (SESoundBuffer*)rStream.GetFromMap(pLinkID); }
//---------------------------------------------------------------------------- void SEParticles::Link(SEStream& rStream, SEStream::SELink* pLink) { SETriMesh::Link(rStream, pLink); SEObject* pLinkID = pLink->GetLinkID(); Locations = (SEVector3fArray*)rStream.GetFromMap(pLinkID); pLinkID = pLink->GetLinkID(); Sizes = (SEFloatArray*)rStream.GetFromMap(pLinkID); }
//---------------------------------------------------------------------------- void SECamera::Save(SEStream& rStream) const { SE_BEGIN_DEBUG_STREAM_SAVE; SEObject::Save(rStream); // native data rStream.Write(m_Location); rStream.Write(m_RVector); rStream.Write(m_UVector); rStream.Write(m_DVector); rStream.Write(m_Frustum[VF_DMIN]); rStream.Write(m_Frustum[VF_DMAX]); rStream.Write(m_Frustum[VF_UMIN]); rStream.Write(m_Frustum[VF_UMAX]); rStream.Write(m_Frustum[VF_RMIN]); rStream.Write(m_Frustum[VF_RMAX]); rStream.Write(m_fPortL); rStream.Write(m_fPortR); rStream.Write(m_fPortT); rStream.Write(m_fPortB); rStream.Write(m_fPortN); rStream.Write(m_fPortF); SE_END_DEBUG_STREAM_SAVE(SECamera); }
//---------------------------------------------------------------------------- // streaming //---------------------------------------------------------------------------- void SECamera::Load(SEStream& rStream, SEStream::SELink* pLink) { SE_BEGIN_DEBUG_STREAM_LOAD; SEObject::Load(rStream, pLink); // native data rStream.Read(m_Location); rStream.Read(m_RVector); rStream.Read(m_UVector); rStream.Read(m_DVector); rStream.Read(m_Frustum[VF_DMIN]); rStream.Read(m_Frustum[VF_DMAX]); rStream.Read(m_Frustum[VF_UMIN]); rStream.Read(m_Frustum[VF_UMAX]); rStream.Read(m_Frustum[VF_RMIN]); rStream.Read(m_Frustum[VF_RMAX]); rStream.Read(m_fPortL); rStream.Read(m_fPortR); rStream.Read(m_fPortT); rStream.Read(m_fPortB); rStream.Read(m_fPortN); rStream.Read(m_fPortF); SE_END_DEBUG_STREAM_LOAD(SECamera); }
//---------------------------------------------------------------------------- void SEPolyline::Save(SEStream& rStream) const { SE_BEGIN_DEBUG_STREAM_SAVE; SEGeometry::Save(rStream); // native data rStream.Write(m_iActiveCount); rStream.Write(m_bClosed); rStream.Write(m_bContiguous); SE_END_DEBUG_STREAM_SAVE(SEPolyline); }
//---------------------------------------------------------------------------- void SEObject::Load(SEStream& rStream, SEStream::SELink* pLink) { SE_BEGIN_DEBUG_STREAM_LOAD; // 获取save时存入的object内存指针,稍后用于link阶段 SEObject* pLinkID; rStream.Read(pLinkID); rStream.InsertInMap(pLinkID, pLink); // 获取name rStream.Read(m_Name); SE_END_DEBUG_STREAM_LOAD(SEObject); }
//---------------------------------------------------------------------------- void SEMultitextureEffect::Save(SEStream& rStream) const { SE_BEGIN_DEBUG_STREAM_SAVE; SEShaderEffect::Save(rStream); // native data rStream.Write(m_iTextureCount); for( int i = 0; i < m_iTextureCount; i++ ) { rStream.Write(m_aImageName[i]); } SE_END_DEBUG_STREAM_SAVE(SEMultitextureEffect); }
//---------------------------------------------------------------------------- // streaming //---------------------------------------------------------------------------- void SEPolyline::Load(SEStream& rStream, SEStream::SELink* pLink) { SE_BEGIN_DEBUG_STREAM_LOAD; SEGeometry::Load(rStream,pLink); // native data rStream.Read(m_iActiveCount); rStream.Read(m_bClosed); rStream.Read(m_bContiguous); SetGeometryType(); SE_END_DEBUG_STREAM_LOAD(SEPolyline); }
//---------------------------------------------------------------------------- void SEObject::Save(SEStream& rStream) const { SE_BEGIN_DEBUG_STREAM_SAVE; // RTTI name用于load时的工厂函数表查找 rStream.Write(std::string(GetType().GetName())); // 该内存地址用于load/link时的object unique ID rStream.Write((SEObject*)this); // 写入name rStream.Write(m_Name); SE_END_DEBUG_STREAM_SAVE(SEObject); }
//---------------------------------------------------------------------------- bool SEObject::Register(SEStream& rStream) const { SEObject* pThis = (SEObject*)this; // 该object是否已插入到hash表,确保唯一性 if( rStream.InsertInMap(pThis, 0) ) { // 所有object按照深度优先的顺序,在遍历场景树时被收集, // 该object不能重复被收集 rStream.InsertInOrdered(pThis); return true; } return false; }
//---------------------------------------------------------------------------- // streaming //---------------------------------------------------------------------------- void SEListener::Load(SEStream& rStream, SEStream::SELink* pLink) { SE_BEGIN_DEBUG_STREAM_LOAD; SEObject::Load(rStream, pLink); // native data rStream.Read(m_Location); rStream.Read(m_RVector); rStream.Read(m_UVector); rStream.Read(m_DVector); rStream.Read(m_fMasterGain); SE_END_DEBUG_STREAM_LOAD(SEListener); }
//---------------------------------------------------------------------------- void SEListener::Save(SEStream& rStream) const { SE_BEGIN_DEBUG_STREAM_SAVE; SEObject::Save(rStream); // native data rStream.Write(m_Location); rStream.Write(m_RVector); rStream.Write(m_UVector); rStream.Write(m_DVector); rStream.Write(m_fMasterGain); SE_END_DEBUG_STREAM_SAVE(SEListener); }
//---------------------------------------------------------------------------- // streaming //---------------------------------------------------------------------------- void SEMultitextureEffect::Load(SEStream& rStream, SEStream::SELink* pLink) { SE_BEGIN_DEBUG_STREAM_LOAD; SEShaderEffect::Load(rStream, pLink); // native data rStream.Read(m_iTextureCount); SetTextureCount(m_iTextureCount); for( int i = 0; i < m_iTextureCount; i++ ) { rStream.Read(m_aImageName[i]); } SE_END_DEBUG_STREAM_LOAD(SEMultitextureEffect); }
//---------------------------------------------------------------------------- void SESoundBuffer::Save(SEStream& rStream) const { SE_BEGIN_DEBUG_STREAM_SAVE; SEObject::Save(rStream); // link data int iWCount = (int)m_Waves.size(); rStream.Write(iWCount); for( int i = 0; i < iWCount; i++ ) { rStream.Write(m_Waves[i]); } SE_END_DEBUG_STREAM_SAVE(SESoundBuffer); }
//---------------------------------------------------------------------------- void SEParticles::Save(SEStream& rStream) const { SE_BEGIN_DEBUG_STREAM_SAVE; SETriMesh::Save(rStream); // native data rStream.Write(SizeAdjust); rStream.Write(m_iActiveCount); // link data rStream.Write(Locations); rStream.Write(Sizes); SE_END_DEBUG_STREAM_SAVE(SEParticles); }
//---------------------------------------------------------------------------- void SEController::Link(SEStream& rStream, SEStream::SELink* pLink) { SEObject::Link(rStream, pLink); SEObject* pLinkID = pLink->GetLinkID(); m_pObject = (SEAdvancedObject*)rStream.GetFromMap(pLinkID); }
//---------------------------------------------------------------------------- void SEBoxBV::Save(SEStream& rStream) const { SE_BEGIN_DEBUG_STREAM_SAVE; SEBoundingVolume::Save(rStream); // native data rStream.Write(m_Box.Center); rStream.Write(m_Box.Axis[0]); rStream.Write(m_Box.Axis[1]); rStream.Write(m_Box.Axis[2]); rStream.Write(m_Box.Extent[0]); rStream.Write(m_Box.Extent[1]); rStream.Write(m_Box.Extent[2]); SE_END_DEBUG_STREAM_SAVE(SEBoxBV); }
//---------------------------------------------------------------------------- // streaming //---------------------------------------------------------------------------- void SEBoxBV::Load(SEStream& rStream, SEStream::SELink* pLink) { SE_BEGIN_DEBUG_STREAM_LOAD; SEBoundingVolume::Load(rStream, pLink); // native data rStream.Read(m_Box.Center); rStream.Read(m_Box.Axis[0]); rStream.Read(m_Box.Axis[1]); rStream.Read(m_Box.Axis[2]); rStream.Read(m_Box.Extent[0]); rStream.Read(m_Box.Extent[1]); rStream.Read(m_Box.Extent[2]); SE_END_DEBUG_STREAM_LOAD(SEBoxBV); }
//---------------------------------------------------------------------------- void SEDescriptorItem::Save(SEStream& rStream) const { SE_BEGIN_DEBUG_STREAM_SAVE; SEObject::Save(rStream); // native data rStream.Write(IsArray); rStream.Write(m_InstanceName); int iCount = (int)m_TypeNames.size(); rStream.Write(iCount); for( int i = 0; i < iCount; i++ ) { rStream.Write(m_TypeNames[i]); } SE_END_DEBUG_STREAM_SAVE(SEDescriptorItem); }
//---------------------------------------------------------------------------- // streaming //---------------------------------------------------------------------------- void SESoundBuffer::Load(SEStream& rStream, SEStream::SELink* pLink) { SE_BEGIN_DEBUG_STREAM_LOAD; SEObject::Load(rStream, pLink); // link data int iWCount; rStream.Read(iWCount); m_Waves.resize(iWCount); for( int i = 0; i < iWCount; i++ ) { SEObject* pObject; rStream.Read(pObject); // m_Waves[i] pLink->Add(pObject); } SE_END_DEBUG_STREAM_LOAD(SESoundBuffer); }
//---------------------------------------------------------------------------- void SESoundBuffer::Link(SEStream& rStream, SEStream::SELink* pLink) { SEObject::Link(rStream, pLink); for( int i = 0; i < (int)m_Waves.size(); i++ ) { SEObject* pLinkID = pLink->GetLinkID(); m_Waves[i] = (SEWave*)rStream.GetFromMap(pLinkID); } }
//---------------------------------------------------------------------------- // copying //---------------------------------------------------------------------------- SEObjectPtr SEObject::Copy(bool bUniqueNames) const { // Save the object to a memory buffer. SEStream tempSaveStream; tempSaveStream.Insert((SEObject*)this); char* pBuffer = 0; int iBufferSize = 0; bool bSuccessful = tempSaveStream.Save(pBuffer, iBufferSize); SE_ASSERT( bSuccessful ); if( !bSuccessful ) { return 0; } // Load the object from the memory buffer. SEStream tempLoadStream; bSuccessful = tempLoadStream.Load(pBuffer, iBufferSize); SE_ASSERT( bSuccessful ); if( !bSuccessful ) { return 0; } SE_DELETE[] pBuffer; if( bUniqueNames ) { // Generate unique names. for( int i = 0; i < tempLoadStream.GetOrderedCount(); i++ ) { SEObject* pObject = tempLoadStream.GetOrderedObject(i); SE_ASSERT( pObject ); const std::string& rName = pObject->GetName(); int iLength = (int)rName.length(); if( iLength > 0 ) { // Object has a name, append a character to make it unique. const char* pName = rName.c_str(); char* acNewName = SE_NEW char[iLength + 2]; const size_t uiSize = (size_t)(iLength + 2); SESystem::SE_Strcpy(acNewName, uiSize, pName); acNewName[iLength] = NameAppend; acNewName[iLength+1] = 0; pObject->SetName(std::string(acNewName)); SE_DELETE[] acNewName; } } } return tempLoadStream.GetObjectAt(0); }
//---------------------------------------------------------------------------- // streaming //---------------------------------------------------------------------------- void SEDescriptorItem::Load(SEStream& rStream, SEStream::SELink* pLink) { SE_BEGIN_DEBUG_STREAM_LOAD; SEObject::Load(rStream, pLink); // native data rStream.Read(IsArray); rStream.Read(m_InstanceName); int iCount; rStream.Read(iCount); m_TypeNames.resize(iCount); for( int i = 0; i < iCount; i++ ) { rStream.Read(m_TypeNames[i]); } SE_END_DEBUG_STREAM_LOAD(SEDescriptorItem); }
//---------------------------------------------------------------------------- void SERenderStateBlock::Link(SEStream& rStream, SEStream::SELink* pLink) { SEObject::Link(rStream, pLink); SEObject* pLinkID; for( int i = 0; i < SEGlobalState::MAX_STATE_TYPE; i++ ) { pLinkID = pLink->GetLinkID(); States[i] = (SEGlobalState*)rStream.GetFromMap(pLinkID); } }
//---------------------------------------------------------------------------- void SESphereBV::Save(SEStream& rStream) const { SE_BEGIN_DEBUG_STREAM_SAVE; SEBoundingVolume::Save(rStream); // native data rStream.Write(m_Sphere.Center); rStream.Write(m_Sphere.Radius); SE_END_DEBUG_STREAM_SAVE(SESphereBV); }
//---------------------------------------------------------------------------- // streaming //---------------------------------------------------------------------------- void SESphereBV::Load(SEStream& rStream, SEStream::SELink* pLink) { SE_BEGIN_DEBUG_STREAM_LOAD; SEBoundingVolume::Load(rStream, pLink); // native data rStream.Read(m_Sphere.Center); rStream.Read(m_Sphere.Radius); SE_END_DEBUG_STREAM_LOAD(SESphereBV); }
//---------------------------------------------------------------------------- // streaming //---------------------------------------------------------------------------- void SEParticles::Load(SEStream& rStream, SEStream::SELink* pLink) { SE_BEGIN_DEBUG_STREAM_LOAD; SETriMesh::Load(rStream, pLink); // native data rStream.Read(SizeAdjust); rStream.Read(m_iActiveCount); // link data SEObject* pObject; rStream.Read(pObject); // Locations pLink->Add(pObject); rStream.Read(pObject); // Sizes pLink->Add(pObject); SE_END_DEBUG_STREAM_LOAD(SEParticles); }
//---------------------------------------------------------------------------- // streaming //---------------------------------------------------------------------------- void SEController::Load(SEStream& rStream, SEStream::SELink* pLink) { SE_BEGIN_DEBUG_STREAM_LOAD; SEObject::Load(rStream, pLink); // native data int iRepeat; rStream.Read(iRepeat); Repeat = (RepeatType)iRepeat; rStream.Read(MinTime); rStream.Read(MaxTime); rStream.Read(Phase); rStream.Read(Frequency); rStream.Read(Active); // m_dLastAppTime is not streamed // link data SEObject* pObject; rStream.Read(pObject); pLink->Add(pObject); SE_END_DEBUG_STREAM_LOAD(SEController); }
//---------------------------------------------------------------------------- void SERenderStateBlock::Save(SEStream& rStream) const { SE_BEGIN_DEBUG_STREAM_SAVE; SEObject::Save(rStream); // link data for( int i = 0; i < SEGlobalState::MAX_STATE_TYPE; i++ ) { rStream.Write(States[i]); } SE_END_DEBUG_STREAM_SAVE(SERenderStateBlock); }
//---------------------------------------------------------------------------- // streaming //---------------------------------------------------------------------------- void SERenderStateBlock::Load(SEStream& rStream, SEStream::SELink* pLink) { SE_BEGIN_DEBUG_STREAM_LOAD; SEObject::Load(rStream, pLink); // link data SEObject* pObject; for( int i = 0; i < SEGlobalState::MAX_STATE_TYPE; i++ ) { rStream.Read(pObject); // States[i] pLink->Add(pObject); } SE_END_DEBUG_STREAM_LOAD(SERenderStateBlock); }