43 namespace ALEMBIC_VERSION_NS {
45 typedef std::pair< OGroupPtr, Alembic::Util::uint64_t >
ParentPair;
48 class OGroup::PrivateData
60 std::vector<Alembic::Util::uint64_t> childVec;
63 Alembic::Util::uint64_t pos;
66 OGroup::OGroup(OGroupPtr iParent, Alembic::Util::uint64_t iIndex)
67 : mData(new OGroup::PrivateData())
69 mData->stream = iParent->mData->stream;
70 mData->parents.push_back(
ParentPair(iParent, iIndex) );
71 mData->pos = INVALID_GROUP;
74 OGroup::OGroup(OStreamPtr iStream)
75 : mData(new OGroup::PrivateData())
77 mData->stream = iStream;
78 mData->parents.push_back(
ParentPair(OGroupPtr(), 0));
79 mData->pos = INVALID_GROUP;
87 OGroupPtr OGroup::addGroup()
92 mData->childVec.push_back(0);
93 child.reset(
new OGroup(shared_from_this(), mData->childVec.size() - 1));
98 ODataPtr OGroup::createData(Alembic::Util::uint64_t iSize,
const void * iData)
108 mData->childVec.push_back(EMPTY_DATA);
109 child.reset(
new OData());
113 Alembic::Util::uint64_t pos = mData->stream->getAndSeekEndPos();
115 Alembic::Util::uint64_t size = iSize;
116 mData->stream->write(&size, 8);
117 mData->stream->write(iData, iSize);
119 child.reset(
new OData(mData->stream, pos, iSize));
124 ODataPtr OGroup::addData(Alembic::Util::uint64_t iSize,
const void * iData)
126 ODataPtr child = OGroup::createData(iSize, iData);
131 mData->childVec.push_back(child->getPos() | 0x8000000000000000ULL);
136 ODataPtr OGroup::createData(Alembic::Util::uint64_t iNumData,
137 const Alembic::Util::uint64_t * iSizes,
138 const void ** iDatas)
146 Alembic::Util::uint64_t totalSize = 0;
147 for (Alembic::Util::uint64_t i = 0; i < iNumData; ++i)
149 totalSize += iSizes[i];
154 mData->childVec.push_back(EMPTY_DATA);
155 child.reset(
new OData());
159 Alembic::Util::uint64_t pos = mData->stream->getAndSeekEndPos();
161 mData->stream->write(&totalSize, 8);
162 for (Alembic::Util::uint64_t i = 0; i < iNumData; ++i)
164 Alembic::Util::uint64_t size = iSizes[i];
167 mData->stream->write(iDatas[i], size);
171 child.reset(
new OData(mData->stream, pos, totalSize));
176 ODataPtr OGroup::addData(Alembic::Util::uint64_t iNumData,
177 const Alembic::Util::uint64_t * iSizes,
178 const void ** iDatas)
180 ODataPtr child = createData(iNumData, iSizes, iDatas);
185 mData->childVec.push_back(child->getPos() | 0x8000000000000000ULL);
190 void OGroup::addData(ODataPtr iData)
194 mData->childVec.push_back(iData->getPos() | 0x8000000000000000ULL);
198 void OGroup::addGroup(OGroupPtr iGroup)
202 if (iGroup->isFrozen())
204 mData->childVec.push_back(iGroup->mData->pos);
208 mData->childVec.push_back(EMPTY_GROUP);
209 iGroup->mData->parents.push_back(
210 ParentPair(shared_from_this(), mData->childVec.size() - 1));
215 void OGroup::addEmptyGroup()
219 mData->childVec.push_back(EMPTY_GROUP);
223 void OGroup::addEmptyData()
227 mData->childVec.push_back(EMPTY_DATA);
232 void OGroup::freeze()
242 if (mData->childVec.empty())
248 mData->pos = mData->stream->getAndSeekEndPos();
249 Alembic::Util::uint64_t size = mData->childVec.size();
250 mData->stream->write(&size, 8);
251 mData->stream->write(&mData->childVec.front(), size*8);
255 ParentPairVec::iterator it;
256 for(it = mData->parents.begin(); it != mData->parents.end(); ++it)
259 if (!it->first && it->second == 0)
261 mData->stream->seek(8);
262 mData->stream->write(&mData->pos, 8);
265 else if (it->first->isFrozen())
267 mData->stream->seek(it->first->mData->pos + (it->second + 1) * 8);
268 mData->stream->write(&mData->pos, 8);
270 it->first->mData->childVec[it->second] = mData->pos;
273 mData->parents.clear();
277 bool OGroup::isFrozen()
279 return mData->pos != INVALID_GROUP;
282 Alembic::Util::uint64_t OGroup::getNumChildren()
const
284 return mData->childVec.size();
287 bool OGroup::isChildGroup(Alembic::Util::uint64_t iIndex)
const
289 return (iIndex < mData->childVec.size() &&
290 (mData->childVec[iIndex] & EMPTY_DATA) == 0);
293 bool OGroup::isChildData(Alembic::Util::uint64_t iIndex)
const
295 return (iIndex < mData->childVec.size() &&
296 (mData->childVec[iIndex] & EMPTY_DATA) != 0);
299 bool OGroup::isChildEmptyGroup(Alembic::Util::uint64_t iIndex)
const
301 return (iIndex < mData->childVec.size() &&
302 mData->childVec[iIndex] == EMPTY_GROUP);
305 bool OGroup::isChildEmptyData(Alembic::Util::uint64_t iIndex)
const
307 return (iIndex < mData->childVec.size() &&
308 mData->childVec[iIndex] == EMPTY_DATA);
311 void OGroup::replaceData(Alembic::Util::uint64_t iIndex, ODataPtr iData)
313 if (!isChildData(iIndex))
318 Alembic::Util::uint64_t pos = iData->getPos() | 0x8000000000000000ULL;
321 mData->stream->seek(mData->pos + (iIndex + 1) * 8);
322 mData->stream->write(&pos, 8);
324 mData->childVec[iIndex] = pos;