void RenderObject::Save(KeyedArchive * archive, SceneFileV2* sceneFile) { AnimatedObject::Save(archive); if(NULL != archive) { archive->SetUInt32("ro.type", type); archive->SetUInt32("ro.flags", flags); archive->SetUInt32("ro.debugflags", debugFlags); archive->SetUInt32("ro.batchCount", GetRenderBatchCount()); KeyedArchive *batchesArch = new KeyedArchive(); for(uint32 i = 0; i < GetRenderBatchCount(); ++i) { RenderBatch *batch = GetRenderBatch(i); if(NULL != batch) { KeyedArchive *batchArch = new KeyedArchive(); batch->Save(batchArch, sceneFile); if(batchArch->Count() > 0) { batchArch->SetString("rb.classname", batch->GetClassName()); } batchesArch->SetArchive(KeyedArchive::GenKeyFromIndex(i), batchArch); batchArch->Release(); } } archive->SetArchive("ro.batches", batchesArch); batchesArch->Release(); } }
RenderObject * RenderObject::Clone(RenderObject *newObject) { if(!newObject) { DVASSERT_MSG(IsPointerToExactClass<RenderObject>(this), "Can clone only RenderObject"); newObject = new RenderObject(); } newObject->type = type; newObject->flags = flags; newObject->debugFlags = debugFlags; //ro->bbox = bbox; //ro->worldBBox = worldBBox; uint32 size = GetRenderBatchCount(); for(uint32 i = 0; i < size; ++i) { RenderBatch *batch = GetRenderBatch(i)->Clone(); newObject->AddRenderBatch(batch); batch->Release(); } newObject->ownerDebugInfo = ownerDebugInfo; return newObject; }
RenderObject* SkyboxRenderObject::Clone(RenderObject *newObject) { if(!newObject) { DVASSERT_MSG(IsPointerToExactClass<SkyboxRenderObject>(this), "Can clone only SkyboxRenderObject"); newObject = new SkyboxRenderObject(); } SkyboxRenderObject* skyboxRenderObject = static_cast<SkyboxRenderObject*>(newObject); skyboxRenderObject->type = type; skyboxRenderObject->flags = flags; skyboxRenderObject->RemoveFlag(RenderObject::TREE_NODE_NEED_UPDATE); skyboxRenderObject->debugFlags = debugFlags; skyboxRenderObject->ownerDebugInfo = ownerDebugInfo; skyboxRenderObject->bbox = bbox; skyboxRenderObject->texturePath = texturePath; skyboxRenderObject->offsetZ = offsetZ; skyboxRenderObject->rotationZ = rotationZ; skyboxRenderObject->nonClippingDistance = nonClippingDistance; uint32 size = GetRenderBatchCount(); for(uint32 i = 0; i < size; ++i) { RenderBatch *batch = GetRenderBatch(i)->Clone(); skyboxRenderObject->AddRenderBatch(batch); batch->Release(); } skyboxRenderObject->BuildSkybox(); skyboxRenderObject->UpdateMaterial(); return newObject; }