// Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of NVIDIA CORPORATION nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Copyright (c) 2008-2025 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #include "OmniPvdWriterImpl.h" #include "OmniPvdDefines.h" #include OmniPvdWriterImpl::OmniPvdWriterImpl() { resetParams(); } OmniPvdWriterImpl::~OmniPvdWriterImpl() { } void OmniPvdWriterImpl::resetParams() { mStream = 0; mLastClassHandle = 0; mLastAttributeHandle = 0; mIsFirstWrite = true; mStatusFlags = 0; // That or set all flag bits off } void OMNI_PVD_CALL OmniPvdWriterImpl::setLogFunction(OmniPvdLogFunction logFunction) { mLog.setLogFunction(logFunction); } void OmniPvdWriterImpl::setVersionHelper() { if (mStream && mIsFirstWrite) { const OmniPvdVersionType omniPvdVersionMajor = OMNI_PVD_VERSION_MAJOR; const OmniPvdVersionType omniPvdVersionMinor = OMNI_PVD_VERSION_MINOR; const OmniPvdVersionType omniPvdVersionPatch = OMNI_PVD_VERSION_PATCH; setVersion(omniPvdVersionMajor, omniPvdVersionMinor, omniPvdVersionPatch); } } void OmniPvdWriterImpl::setVersion(OmniPvdVersionType majorVersion, OmniPvdVersionType minorVersion, OmniPvdVersionType patch) { if (mStream && mIsFirstWrite) { if (!mStream->openStream()) { return; } writeWithStatus((const uint8_t*)&majorVersion, sizeof(OmniPvdVersionType)); writeWithStatus((const uint8_t*)&minorVersion, sizeof(OmniPvdVersionType)); writeWithStatus((const uint8_t*)&patch, sizeof(OmniPvdVersionType)); mLog.outputLine("OmniPvdRuntimeWriterImpl::setVersion majorVersion(%lu), minorVersion(%lu), patch(%lu)", static_cast(majorVersion), static_cast(minorVersion), static_cast(patch)); mIsFirstWrite = false; } } void OMNI_PVD_CALL OmniPvdWriterImpl::setWriteStream(OmniPvdWriteStream& stream) { mLog.outputLine("OmniPvdRuntimeWriterImpl::setWriteStream"); mStream = &stream; } OmniPvdWriteStream* OMNI_PVD_CALL OmniPvdWriterImpl::getWriteStream() { return mStream; } OmniPvdClassHandle OMNI_PVD_CALL OmniPvdWriterImpl::registerClass(const char* className, OmniPvdClassHandle baseClass) { setVersionHelper(); if (mStream) { mLog.outputLine("OmniPvdWriterImpl::registerClass className(%s)", className); int classNameLen = (int)strlen(className); writeCommand(OmniPvdCommand::eREGISTER_CLASS); mLastClassHandle++; writeWithStatus((const uint8_t*)&mLastClassHandle, sizeof(OmniPvdClassHandle)); writeWithStatus((const uint8_t*)&baseClass, sizeof(OmniPvdClassHandle)); writeWithStatus((const uint8_t*)&classNameLen, sizeof(uint16_t)); writeWithStatus((const uint8_t*)className, classNameLen); return mLastClassHandle; } else { return OMNI_PVD_INVALID_HANDLE; } } OmniPvdAttributeHandle OMNI_PVD_CALL OmniPvdWriterImpl::registerAttribute(OmniPvdClassHandle classHandle, const char* attributeName, OmniPvdDataType::Enum attributeDataType, uint32_t nbElements) { setVersionHelper(); if (mStream) { mLog.outputLine("OmniPvdWriterImpl::registerAttribute classHandle(%llu), attributeName(%s), attributeDataType(%d), nbrFields(%llu)", static_cast(classHandle), attributeName, static_cast(attributeDataType), static_cast(nbElements)); int attribNameLen = (int)strlen(attributeName); writeCommand(OmniPvdCommand::eREGISTER_ATTRIBUTE); mLastAttributeHandle++; writeWithStatus((const uint8_t*)&classHandle, sizeof(OmniPvdClassHandle)); writeWithStatus((const uint8_t*)&mLastAttributeHandle, sizeof(OmniPvdAttributeHandle)); writeDataType(attributeDataType); writeWithStatus((const uint8_t*)&nbElements, sizeof(uint32_t)); writeWithStatus((const uint8_t*)&attribNameLen, sizeof(uint16_t)); writeWithStatus((const uint8_t*)attributeName, attribNameLen); return mLastAttributeHandle; } else { return OMNI_PVD_INVALID_HANDLE; } } OmniPvdAttributeHandle OMNI_PVD_CALL OmniPvdWriterImpl::registerFlagsAttribute(OmniPvdClassHandle classHandle, const char* attributeName, OmniPvdClassHandle enumClassHandle) { setVersionHelper(); if (mStream) { mLog.outputLine("OmniPvdWriterImpl::registerFlagsAttribute classHandle(%llu), enumClassHandle(%llu), attributeName(%s)", static_cast(classHandle), static_cast(enumClassHandle), attributeName); int attribNameLen = (int)strlen(attributeName); writeCommand(OmniPvdCommand::eREGISTER_ATTRIBUTE); mLastAttributeHandle++; writeWithStatus((const uint8_t*)&classHandle, sizeof(OmniPvdClassHandle)); writeWithStatus((const uint8_t*)&mLastAttributeHandle, sizeof(OmniPvdAttributeHandle)); writeDataType(OmniPvdDataType::eFLAGS_WORD); writeWithStatus((const uint8_t*)&enumClassHandle, sizeof(OmniPvdClassHandle)); writeWithStatus((const uint8_t*)&attribNameLen, sizeof(uint16_t)); writeWithStatus((const uint8_t*)attributeName, attribNameLen); return mLastAttributeHandle; } else { return OMNI_PVD_INVALID_HANDLE; } } OmniPvdAttributeHandle OMNI_PVD_CALL OmniPvdWriterImpl::registerEnumValue(OmniPvdClassHandle classHandle, const char* attributeName, OmniPvdEnumValueType value) { setVersionHelper(); if (mStream) { int attribNameLen = (int)strlen(attributeName); writeCommand(OmniPvdCommand::eREGISTER_ATTRIBUTE); mLastAttributeHandle++; writeWithStatus((const uint8_t*)&classHandle, sizeof(OmniPvdClassHandle)); writeWithStatus((const uint8_t*)&mLastAttributeHandle, sizeof(OmniPvdAttributeHandle)); writeDataType(OmniPvdDataType::eENUM_VALUE); writeWithStatus((const uint8_t*)&value, sizeof(OmniPvdEnumValueType)); writeWithStatus((const uint8_t*)&attribNameLen, sizeof(uint16_t)); writeWithStatus((const uint8_t*)attributeName, attribNameLen); return mLastAttributeHandle; } else { return OMNI_PVD_INVALID_HANDLE; } } OmniPvdAttributeHandle OMNI_PVD_CALL OmniPvdWriterImpl::registerClassAttribute(OmniPvdClassHandle classHandle, const char* attributeName, OmniPvdClassHandle classAttributeHandle) { setVersionHelper(); if (mStream) { int attribNameLen = (int)strlen(attributeName); writeCommand(OmniPvdCommand::eREGISTER_CLASS_ATTRIBUTE); mLastAttributeHandle++; writeWithStatus((const uint8_t*)&classHandle, sizeof(OmniPvdClassHandle)); writeWithStatus((const uint8_t*)&mLastAttributeHandle, sizeof(OmniPvdAttributeHandle)); writeWithStatus((const uint8_t*)&classAttributeHandle, sizeof(OmniPvdClassHandle)); writeWithStatus((const uint8_t*)&attribNameLen, sizeof(uint16_t)); writeWithStatus((const uint8_t*)attributeName, attribNameLen); return mLastAttributeHandle; } else { return OMNI_PVD_INVALID_HANDLE; } } OmniPvdAttributeHandle OMNI_PVD_CALL OmniPvdWriterImpl::registerUniqueListAttribute(OmniPvdClassHandle classHandle, const char* attributeName, OmniPvdDataType::Enum attributeDataType) { setVersionHelper(); if (mStream) { int attribNameLen = (int)strlen(attributeName); writeCommand(OmniPvdCommand::eREGISTER_UNIQUE_LIST_ATTRIBUTE); mLastAttributeHandle++; writeWithStatus((const uint8_t*)&classHandle, sizeof(OmniPvdClassHandle)); writeWithStatus((const uint8_t*)&mLastAttributeHandle, sizeof(OmniPvdAttributeHandle)); writeDataType(attributeDataType); writeWithStatus((const uint8_t*)&attribNameLen, sizeof(uint16_t)); writeWithStatus((const uint8_t*)attributeName, attribNameLen); return mLastAttributeHandle; } else { return OMNI_PVD_INVALID_HANDLE; } } void OMNI_PVD_CALL OmniPvdWriterImpl::setAttribute(OmniPvdContextHandle contextHandle, OmniPvdObjectHandle objectHandle, const OmniPvdAttributeHandle* attributeHandles, uint8_t nbAttributeHandles, const uint8_t* data, uint32_t nbrBytes) { setVersionHelper(); if (mStream) { writeCommand(OmniPvdCommand::eSET_ATTRIBUTE); writeWithStatus((const uint8_t*)&contextHandle, sizeof(OmniPvdContextHandle)); writeWithStatus((const uint8_t*)&objectHandle, sizeof(OmniPvdObjectHandle)); writeWithStatus((const uint8_t*)&nbAttributeHandles, sizeof(uint8_t)); for (int i = 0; i < nbAttributeHandles; i++) { writeWithStatus((const uint8_t*)attributeHandles, sizeof(OmniPvdAttributeHandle)); attributeHandles++; } writeWithStatus((const uint8_t*)&nbrBytes, sizeof(uint32_t)); writeWithStatus((const uint8_t*)data, nbrBytes); } } void OMNI_PVD_CALL OmniPvdWriterImpl::addToUniqueListAttribute(OmniPvdContextHandle contextHandle, OmniPvdObjectHandle objectHandle, const OmniPvdAttributeHandle* attributeHandles, uint8_t nbAttributeHandles, const uint8_t* data, uint32_t nbrBytes) { setVersionHelper(); if (mStream) { writeCommand(OmniPvdCommand::eADD_TO_UNIQUE_LIST_ATTRIBUTE); writeWithStatus((const uint8_t*)&contextHandle, sizeof(OmniPvdContextHandle)); writeWithStatus((const uint8_t*)&objectHandle, sizeof(OmniPvdObjectHandle)); writeWithStatus((const uint8_t*)&nbAttributeHandles, sizeof(uint8_t)); for (int i = 0; i < nbAttributeHandles; i++) { writeWithStatus((const uint8_t*)attributeHandles, sizeof(OmniPvdAttributeHandle)); attributeHandles++; } writeWithStatus((const uint8_t*)&nbrBytes, sizeof(uint32_t)); writeWithStatus((const uint8_t*)data, nbrBytes); } } void OMNI_PVD_CALL OmniPvdWriterImpl::removeFromUniqueListAttribute(OmniPvdContextHandle contextHandle, OmniPvdObjectHandle objectHandle, const OmniPvdAttributeHandle* attributeHandles, uint8_t nbAttributeHandles, const uint8_t* data, uint32_t nbrBytes) { setVersionHelper(); if (mStream) { writeCommand(OmniPvdCommand::eREMOVE_FROM_UNIQUE_LIST_ATTRIBUTE); writeWithStatus((const uint8_t*)&contextHandle, sizeof(OmniPvdContextHandle)); writeWithStatus((const uint8_t*)&objectHandle, sizeof(OmniPvdObjectHandle)); writeWithStatus((const uint8_t*)&nbAttributeHandles, sizeof(uint8_t)); for (int i = 0; i < nbAttributeHandles; i++) { writeWithStatus((const uint8_t*)attributeHandles, sizeof(OmniPvdAttributeHandle)); attributeHandles++; } writeWithStatus((const uint8_t*)&nbrBytes, sizeof(uint32_t)); writeWithStatus((const uint8_t*)data, nbrBytes); } } void OMNI_PVD_CALL OmniPvdWriterImpl::createObject(OmniPvdContextHandle contextHandle, OmniPvdClassHandle classHandle, OmniPvdObjectHandle objectHandle, const char* objectName) { setVersionHelper(); if (mStream) { writeCommand(OmniPvdCommand::eCREATE_OBJECT); writeWithStatus((const uint8_t*)&contextHandle, sizeof(OmniPvdContextHandle)); writeWithStatus((const uint8_t*)&classHandle, sizeof(OmniPvdClassHandle)); writeWithStatus((const uint8_t*)&objectHandle, sizeof(OmniPvdObjectHandle)); int objectNameLen = 0; if (objectName) { objectNameLen = (int)strlen(objectName); writeWithStatus((const uint8_t*)&objectNameLen, sizeof(uint16_t)); writeWithStatus((const uint8_t*)objectName, objectNameLen); } else { writeWithStatus((const uint8_t*)&objectNameLen, sizeof(uint16_t)); } } } void OMNI_PVD_CALL OmniPvdWriterImpl::destroyObject(OmniPvdContextHandle contextHandle, OmniPvdObjectHandle objectHandle) { setVersionHelper(); if (mStream) { writeCommand(OmniPvdCommand::eDESTROY_OBJECT); writeWithStatus((const uint8_t*)&contextHandle, sizeof(OmniPvdContextHandle)); writeWithStatus((const uint8_t*)&objectHandle, sizeof(OmniPvdObjectHandle)); } } void OMNI_PVD_CALL OmniPvdWriterImpl::startFrame(OmniPvdContextHandle contextHandle, uint64_t timeStamp) { setVersionHelper(); if (mStream) { writeCommand(OmniPvdCommand::eSTART_FRAME); writeWithStatus((const uint8_t*)&contextHandle, sizeof(OmniPvdContextHandle)); writeWithStatus((const uint8_t*)&timeStamp, sizeof(uint64_t)); } } void OMNI_PVD_CALL OmniPvdWriterImpl::stopFrame(OmniPvdContextHandle contextHandle, uint64_t timeStamp) { setVersionHelper(); if (mStream) { writeCommand(OmniPvdCommand::eSTOP_FRAME); writeWithStatus((const uint8_t*)&contextHandle, sizeof(OmniPvdContextHandle)); writeWithStatus((const uint8_t*)&timeStamp, sizeof(uint64_t)); } } void OMNI_PVD_CALL OmniPvdWriterImpl::recordMessage(OmniPvdContextHandle contextHandle, const char* message, const char* file, uint32_t line, uint32_t type, OmniPvdClassHandle handle) { setVersionHelper(); if (mStream) { writeCommand(OmniPvdCommand::eRECORD_MESSAGE); writeWithStatus((const uint8_t*)&contextHandle, sizeof(OmniPvdContextHandle)); int messageLength = 0; if (message) { messageLength = (int)strlen(message); writeWithStatus((const uint8_t*)&messageLength, sizeof(uint16_t)); writeWithStatus((const uint8_t*)message, messageLength); } else { writeWithStatus((const uint8_t*)&messageLength, sizeof(uint16_t)); } int filenameLength = 0; if (file) { filenameLength = (int)strlen(file); writeWithStatus((const uint8_t*)&filenameLength, sizeof(uint16_t)); writeWithStatus((const uint8_t*)file, filenameLength); } else { writeWithStatus((const uint8_t*)&filenameLength, sizeof(uint16_t)); } writeWithStatus((const uint8_t*)&line, sizeof(uint32_t)); writeWithStatus((const uint8_t*)&type, sizeof(uint32_t)); writeWithStatus((const uint8_t*)&handle, sizeof(OmniPvdClassHandle)); } } uint32_t OMNI_PVD_CALL OmniPvdWriterImpl::getStatus() { return mStatusFlags; } void OMNI_PVD_CALL OmniPvdWriterImpl::clearStatus() { mStatusFlags = 0; }