LIB3MFMETHODIMP CCOMModelMeshObject::SetTriangle(_In_ DWORD nIndex, _In_ MODELMESHTRIANGLE * pTriangle) { UINT j; try { if (!pTriangle) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CMesh * pMesh = getMesh(); __NMRASSERT(pMesh); // Check for input validity UINT nNodeCount = pMesh->getNodeCount(); for (j = 0; j < 3; j++) if (pTriangle->m_nIndices[j] >= nNodeCount) throw CNMRException_Windows(NMR_ERROR_INVALIDINDEX, LIB3MF_INVALIDARG); if ((pTriangle->m_nIndices[0] == pTriangle->m_nIndices[1]) || (pTriangle->m_nIndices[0] == pTriangle->m_nIndices[2]) || (pTriangle->m_nIndices[1] == pTriangle->m_nIndices[2])) throw CNMRException_Windows(NMR_ERROR_INVALIDINDEX, LIB3MF_INVALIDARG); // retrieve node and return position MESHFACE * pFace = pMesh->getFace(nIndex); for (j = 0; j < 3; j++) pFace->m_nodeindices[j] = pTriangle->m_nIndices[j]; return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelMeshObject::SetGeometry(_In_ MODELMESHVERTEX * pVertices, _In_ DWORD nVertexCount, _In_ MODELMESHTRIANGLE * pTriangles, _In_ DWORD nTriangleCount) { UINT j, nIndex; try { if ((!pVertices) || (!pTriangles)) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CMesh * pMesh = getMesh(); __NMRASSERT(pMesh); // Clear old mesh pMesh->clear(); // Rebuild Mesh Coordinates MODELMESHVERTEX * pVertex = pVertices; for (nIndex = 0; nIndex < nVertexCount; nIndex++) { NVEC3 vPosition; for (j = 0; j < 3; j++) { FLOAT fCoord = pVertex->m_fPosition[j]; if (fabs(fCoord) > NMR_MESH_MAXCOORDINATE) throw CNMRException_Windows(NMR_ERROR_INVALIDCOORDINATES, LIB3MF_INVALIDARG); vPosition.m_fields[j] = fCoord; } pMesh->addNode(vPosition); pVertex++; } // Rebuild Mesh Faces MODELMESHTRIANGLE * pTriangle = pTriangles; for (nIndex = 0; nIndex < nTriangleCount; nIndex++) { MESHNODE * pNodes[3]; for (j = 0; j < 3; j++) { if (pTriangle->m_nIndices[j] >= nVertexCount) throw CNMRException_Windows(NMR_ERROR_INVALIDINDEX, LIB3MF_INVALIDARG); pNodes[j] = pMesh->getNode(pTriangle->m_nIndices[j]); } if ((pTriangle->m_nIndices[0] == pTriangle->m_nIndices[1]) || (pTriangle->m_nIndices[0] == pTriangle->m_nIndices[2]) || (pTriangle->m_nIndices[1] == pTriangle->m_nIndices[2])) throw CNMRException_Windows(NMR_ERROR_INVALIDINDEX, LIB3MF_INVALIDARG); pMesh->addFace(pNodes[0], pNodes[1], pNodes[2]); pTriangle++; } return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelMeshObject::AddVertex(_In_ MODELMESHVERTEX * pVertex, _Out_opt_ DWORD * pnIndex) { UINT j; try { if (!pVertex) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CMesh * pMesh = getMesh(); __NMRASSERT(pMesh); // Create Position Vector and check input NVEC3 vPosition; for (j = 0; j < 3; j++) { FLOAT fCoord = pVertex->m_fPosition[j]; if (fabs(fCoord) > NMR_MESH_MAXCOORDINATE) throw CNMRException_Windows(NMR_ERROR_INVALIDCOORDINATES, LIB3MF_INVALIDARG); vPosition.m_fields[j] = fCoord; } // Set position to node MESHNODE * pNode = pMesh->addNode(vPosition); if (pnIndex) { *pnIndex = pNode->m_index; } return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelMeshObject::GetTriangle(_In_ DWORD nIndex, _Out_ MODELMESHTRIANGLE * pTriangle) { UINT j; try { if (!pTriangle) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CMesh * pMesh = getMesh(); __NMRASSERT(pMesh); // retrieve node and return position MESHFACE * pFace = pMesh->getFace(nIndex); for (j = 0; j < 3; j++) pTriangle->m_nIndices[j] = pFace->m_nodeindices[j]; return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelMeshObject::GetVertex(_In_ DWORD nIndex, _Out_ MODELMESHVERTEX * pVertex) { UINT j; try { if (!pVertex) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CMesh * pMesh = getMesh(); __NMRASSERT(pMesh); // retrieve node and return position MESHNODE * pNode = pMesh->getNode(nIndex); for (j = 0; j < 3; j++) pVertex->m_fPosition[j] = pNode->m_position.m_fields[j]; return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelBuildItem::GetPartNumber(_Out_opt_ LPWSTR pwszBuffer, _In_ ULONG cbBufferSize, _Out_opt_ ULONG * pcbNeededChars) { try { if (!m_pModelBuildItem.get()) throw CNMRException(NMR_ERROR_INVALIDBUILDITEM); if (cbBufferSize > MODEL_MAXSTRINGBUFFERLENGTH) throw CNMRException(NMR_ERROR_INVALIDBUFFERSIZE); // Safely call StringToBuffer nfUint32 nNeededChars = 0; fnWStringToBufferSafe(m_pModelBuildItem->getPartNumber(), pwszBuffer, cbBufferSize, &nNeededChars); // Return length if needed if (pcbNeededChars) *pcbNeededChars = nNeededChars; return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelBuildItem::SetObjectTransform(_In_ MODELTRANSFORM * pmTransform) { try { if (!pmTransform) throw CNMRException(NMR_ERROR_INVALIDPOINTER); if (!m_pModelBuildItem.get()) throw CNMRException(NMR_ERROR_INVALIDBUILDITEM); NMATRIX3 mMatrix = fnMATRIX3_identity (); int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { mMatrix.m_fields[i][j] = pmTransform->m_fFields[i][j]; } } m_pModelBuildItem->setTransform(mMatrix); return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelMeshObject::GetName(_Out_opt_ LPWSTR pwszBuffer, _In_ ULONG cbBufferSize, _Out_opt_ ULONG * pcbNeededChars) { try { if (cbBufferSize > MODEL_MAXSTRINGBUFFERLENGTH) throw CNMRException(NMR_ERROR_INVALIDBUFFERSIZE); CModelMeshObject * pObject = getMeshObject(); __NMRASSERT(pObject); // Safely call StringToBuffer nfUint32 nNeededChars = 0; fnWStringToBufferSafe(pObject->getName(), pwszBuffer, cbBufferSize, &nNeededChars); // Return length if needed if (pcbNeededChars) *pcbNeededChars = nNeededChars; return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelComponentsObject::GetNameUTF8(_Out_opt_ LPSTR pszBuffer, _In_ ULONG cbBufferSize, _Out_opt_ ULONG * pcbNeededChars) { try { if (cbBufferSize > MODEL_MAXSTRINGBUFFERLENGTH) throw CNMRException(NMR_ERROR_INVALIDBUFFERSIZE); CModelComponentsObject * pObject = getComponentsObject(); __NMRASSERT(pObject); std::wstring sUTF16Name = pObject->getName(); std::string sUTF8Name = fnUTF16toUTF8(sUTF16Name); // Safely call StringToBuffer nfUint32 nNeededChars = 0; fnStringToBufferSafe(sUTF8Name, pszBuffer, cbBufferSize, &nNeededChars); // Return length if needed if (pcbNeededChars) *pcbNeededChars = nNeededChars; return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::WriteToFile(_In_z_ LPCWSTR pwszFilename) { try { if (pwszFilename == nullptr) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); PImportStream pTextureStream = pTextureResource->getTextureStream(); if (pTextureStream.get() != nullptr) { pTextureStream->writeToFile(pwszFilename); } else { throw CNMRException(NMR_ERROR_NOTEXTURESTREAM); } return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::GetBox2D(_Out_ FLOAT * pfU, _Out_ FLOAT * pfV, _Out_ FLOAT * pfWidth, _Out_ FLOAT * pfHeight) { try { if ((pfU == nullptr) || (pfV == nullptr) || (pfWidth == nullptr) || (pfHeight == nullptr)) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); nfFloat fU, fV, fWidth, fHeight; if (pTextureResource->getBox2D(fU, fV, fWidth, fHeight)) { *pfU = fU; *pfV = fV; *pfWidth = fWidth; *pfHeight = fHeight; } else { *pfU = 0.0f; *pfV = 0.0f; *pfWidth = 1.0f; *pfHeight = 1.0f; } return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelWriter::WriteToFileUTF8(_In_z_ LPCSTR pwszFilename) { try { if (pwszFilename == nullptr) throw CNMRException(NMR_ERROR_INVALIDPOINTER); if (m_pModelWriter.get() == nullptr) throw CNMRException(NMR_ERROR_RESOURCENOTFOUND); // Convert to UTF16 std::string sUTF8FileName(pwszFilename); std::wstring sUTF16FileName = fnUTF8toUTF16(sUTF8FileName); PExportStream pStream = fnCreateExportStreamInstance(sUTF16FileName.c_str()); m_pModelWriter->exportToStream(pStream); return handleSuccess(); } catch (CNMRException_Windows & WinException) { return handleNMRException(&WinException); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::ReadFromBuffer(_In_ BYTE * pBuffer, _In_ ULONG64 cbBufferSize) { try { if (pBuffer == nullptr) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); PImportStream pImportStream = std::make_shared<CImportStream_Memory>(pBuffer, cbBufferSize); CModel * pModel = pTextureResource->getModel(); __NMRASSERT(pModel); pModel->removeAttachment(pTextureResource->getPath()); pModel->addAttachment(pTextureResource->getPath(), PACKAGE_TEXTURE_RELATIONSHIP_TYPE, pImportStream); return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::GetPath(_Out_opt_ LPWSTR pwszBuffer, _In_ ULONG cbBufferSize, _Out_ ULONG * pcbNeededChars) { try { if (cbBufferSize > MODEL_MAXSTRINGBUFFERLENGTH) throw CNMRException(NMR_ERROR_INVALIDBUFFERSIZE); CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); // Retrieve Path std::wstring sPath = pTextureResource->getPath(); // Safely call StringToBuffer nfUint32 nNeededChars = 0; fnWStringToBufferSafe(sPath, pwszBuffer, cbBufferSize, &nNeededChars); // Return length if needed if (pcbNeededChars) *pcbNeededChars = nNeededChars; return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::WriteToCallback(_In_ void * pWriteCallback, _In_opt_ void * pUserData) { try { if (pWriteCallback == nullptr) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); PImportStream pTextureAttachment = pTextureResource->getTextureStream(); ExportStream_WriteCallbackType pTypedWriteCallback = (ExportStream_WriteCallbackType)pWriteCallback; if (pTextureAttachment.get() != nullptr) { PExportStream pExportStream = std::make_shared<CExportStream_Callback>(pTypedWriteCallback, nullptr, pUserData); pExportStream->copyFrom(pTextureAttachment.get(), pTextureAttachment->retrieveSize(), MODELTEXTURE2D_BUFFERSIZE); } else { throw CNMRException(NMR_ERROR_NOTEXTURESTREAM); } return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::ReadFromFileUTF8(_In_z_ LPCSTR pszFilename) { try { if (pszFilename == nullptr) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); std::string sUTF8FileName(pszFilename); PImportStream pImportStream = fnCreateImportStreamInstance(sUTF8FileName.c_str()); CModel * pModel = pTextureResource->getModel(); __NMRASSERT(pModel); pModel->removeAttachment(pTextureResource->getPath()); pModel->addAttachment(pTextureResource->getPath(), PACKAGE_TEXTURE_RELATIONSHIP_TYPE, pImportStream); return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::WriteToBuffer(_Out_ BYTE * pBuffer, _In_ ULONG64 cbBufferSize) { try { if (pBuffer == nullptr) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); PImportStream pTextureStream = pTextureResource->getTextureStream(); if (pTextureStream.get() != nullptr) { nfUint64 cbStreamSize = pTextureStream->retrieveSize(); if (cbStreamSize > cbBufferSize) throw CNMRException(NMR_ERROR_INSUFFICIENTBUFFERSIZE); pTextureStream->seekPosition(0, true); pTextureStream->readBuffer(pBuffer, cbStreamSize, true); } else { throw CNMRException(NMR_ERROR_NOTEXTURESTREAM); } return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::WriteToFileUTF8(_In_z_ LPCSTR pszFilename) { try { if (pszFilename == nullptr) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); PImportStream pTextureAttachment = pTextureResource->getTextureStream(); if (pTextureAttachment.get() != nullptr) { std::string sUTF8FileName(pszFilename); std::wstring sUTF16FileName = fnUTF8toUTF16(sUTF8FileName); pTextureAttachment->writeToFile(sUTF16FileName.c_str()); } else { throw CNMRException(NMR_ERROR_NOTEXTURESTREAM); } return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::SetAttachment(_In_ ILib3MFModelAttachment * pTextureAttachment) { try { if (pTextureAttachment == nullptr) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); // check relationship type std::string sRelationshipType; ULONG cbNeededChars; pTextureAttachment->GetRelationshipTypeUTF8(nullptr, 0, &cbNeededChars); sRelationshipType.resize(cbNeededChars); pTextureAttachment->GetRelationshipTypeUTF8(&(sRelationshipType[0]), cbNeededChars + 1, &cbNeededChars); if (!(sRelationshipType == PACKAGE_TEXTURE_RELATIONSHIP_TYPE)) throw CNMRException(NMR_ERROR_INVALIDRELATIONSHIPTYPEFORTEXTURE); std::string sPath; pTextureAttachment->GetPathUTF8(nullptr, 0, &cbNeededChars); sPath.resize(cbNeededChars); pTextureAttachment->GetPathUTF8(&(sPath[0]), cbNeededChars+1, &cbNeededChars); pTextureResource->setPath(sPath); return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::GetAttachment(_Out_ ILib3MFModelAttachment ** ppTextureAttachment) { try { if (ppTextureAttachment == nullptr) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); // Retrieve Path std::string sPath = pTextureResource->getPath(); CModel * pModel = pTextureResource->getModel(); __NMRASSERT(pModel); PModelAttachment pAttachment = pModel->findModelAttachment(sPath); CCOMObject<CCOMModelAttachment> * pCOMObject = new CCOMObject<CCOMModelAttachment>(); pCOMObject->AddRef(); pCOMObject->setAttachment(pAttachment); *ppTextureAttachment = pCOMObject; return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::ReadFromFile(_In_z_ LPCWSTR pwszFilename) { try { if (pwszFilename == nullptr) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); PImportStream pImportStream = std::make_shared<CImportStream_COM>(pwszFilename); CModel * pModel = pTextureResource->getModel(); __NMRASSERT(pModel); pModel->removeTextureStream(pTextureResource->getPath()); pModel->addTextureStream(pTextureResource->getPath(), pImportStream); return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::GetStreamSize(_Out_ ULONG64 * pcbStreamSize) { try { CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); PImportStream pTextureStream = pTextureResource->getTextureStream(); if (pTextureStream.get() != nullptr) { *pcbStreamSize = pTextureStream->retrieveSize(); } else { *pcbStreamSize = 0; } return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelComponentsObject::AddComponent(_In_ ILib3MFModelObjectResource * pObject, _In_opt_ MODELTRANSFORM * pmTransform, _Outptr_ ILib3MFModelComponent ** ppComponent) { try { if (!pObject) throw CNMRException (NMR_ERROR_INVALIDPOINTER); CModelComponentsObject * pComponentsObject = getComponentsObject(); CModel * pModel = pComponentsObject->getModel(); __NMRASSERT(pModel); // Get Resource ID ModelResourceID nObjectID; HRESULT hResult = pObject->GetResourceID(&nObjectID); if (hResult != LIB3MF_OK) return hResult; // Find class instance CModelObject * pObject = pModel->findObject(nObjectID); if (pObject == nullptr) throw CNMRException(NMR_ERROR_RESOURCENOTFOUND); // Convert Transform, if given NMATRIX3 mMatrix = fnMATRIX3_identity(); if (pmTransform) { int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { mMatrix.m_fields[i][j] = pmTransform->m_fFields[i][j]; } } } // Create Model component PModelComponent pNewComponent = std::make_shared<CModelComponent>(pObject, mMatrix); pComponentsObject->addComponent(pNewComponent); // Create Component COM Wrapper if (ppComponent) { CCOMObject<CCOMModelComponent> * pResult = new CCOMObject<CCOMModelComponent>(); pResult->AddRef(); pResult->setComponent(pNewComponent); *ppComponent = pResult; } return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::ReadFromBuffer(_In_ BYTE * pBuffer, _In_ ULONG64 cbBufferSize) try { if (pBuffer == nullptr) throw CNMRException(NMR_ERROR_INVALIDPOINTER); HRESULT hResult; CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); CComPtr<IStream> pMemoryStream = nullptr; hResult = CreateStreamOnHGlobal(nullptr, true, &pMemoryStream); if (hResult != S_OK) throw CNMRException_Windows(NMR_ERROR_COULDNOTCREATESTREAM, hResult); BYTE * pByte = pBuffer; nfUint64 cbBytesLeft = cbBufferSize; while (cbBytesLeft > 0) { nfUint64 cbLength = cbBytesLeft; if (cbLength > NMR_IMPORTSTREAM_COPYBUFFERSIZE) cbLength = NMR_IMPORTSTREAM_COPYBUFFERSIZE; ULONG cbWrittenBytes = 0; hResult = pMemoryStream->Write(pByte, (nfUint32)cbLength, &cbWrittenBytes); if (hResult != S_OK) throw CNMRException_Windows(NMR_ERROR_COULDNOTWRITESTREAM, hResult); if (cbWrittenBytes != cbLength) throw CNMRException(NMR_ERROR_COULDNOTWRITEFULLDATA); cbBytesLeft -= cbLength; pByte += cbLength; } PImportStream pImportStream = std::make_shared<CImportStream_COM>(pMemoryStream); CModel * pModel = pTextureResource->getModel(); __NMRASSERT(pModel); pModel->removeTextureStream(pTextureResource->getPath()); pModel->addTextureStream(pTextureResource->getPath(), pImportStream); return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); }
LIB3MFMETHODIMP CCOMModelTexture2D::WriteToStream(_In_ IStream * pStream) { try { if (pStream == nullptr) throw CNMRException(NMR_ERROR_INVALIDPOINTER); CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); PImportStream pTextureStream = pTextureResource->getTextureStream(); if (pTextureStream.get() != nullptr) { nfUint64 cbStreamSize = pTextureStream->retrieveSize(); pTextureStream->seekPosition(0, true); std::array<nfByte, NMR_IMPORTSTREAM_COPYBUFFERSIZE> pBuffer; nfUint64 cbBytesLeft = cbStreamSize; while (cbBytesLeft > 0) { nfUint64 cbLength = cbBytesLeft; if (cbLength > NMR_IMPORTSTREAM_COPYBUFFERSIZE) cbLength = NMR_IMPORTSTREAM_COPYBUFFERSIZE; ULONG cbWrittenBytes = 0; pTextureStream->readBuffer(&pBuffer[0], cbLength, true); HRESULT hResult = pStream->Write(&pBuffer[0], (nfUint32) cbLength, &cbWrittenBytes); if (hResult != S_OK) throw CNMRException_Windows(NMR_ERROR_COULDNOTWRITESTREAM, hResult); if (cbWrittenBytes != cbLength) throw CNMRException(NMR_ERROR_COULDNOTWRITEFULLDATA); cbBytesLeft -= cbLength; } } else { throw CNMRException(NMR_ERROR_NOTEXTURESTREAM); } return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::SetFilter (_In_ eModelTextureFilter eFilter) { try { CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); pTextureResource->setFilter(eFilter); return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelComponentsObject::IsComponentsObject(_Out_ BOOL * pbIsComponentsObject) { try { if (!pbIsComponentsObject) throw CNMRException(NMR_ERROR_INVALIDPOINTER); *pbIsComponentsObject = true; return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelBuildItem::GetObjectResource(_Outptr_ ILib3MFModelObjectResource ** ppObject) { try { if (!ppObject) throw CNMRException(NMR_ERROR_INVALIDPOINTER); if (!m_pModelBuildItem.get()) throw CNMRException(NMR_ERROR_INVALIDBUILDITEM); // Retrieve Object of Build Item CModelObject * pObject = m_pModelBuildItem->getObject(); if (!pObject) throw CNMRException(NMR_ERROR_INVALIDOBJECT); // Retrieve Model of Build Item CModel * pModel = pObject->getModel(); if (!pModel) throw CNMRException(NMR_ERROR_INVALIDMODEL); // Retrieve corresponding Model Resource PModelResource pResource = pModel->findResource(pObject->getResourceID()); if (!pResource.get()) throw CNMRException(NMR_ERROR_INVALIDMODELRESOURCE); // Resource interface ILib3MFModelObjectResource * pResourceInterface = nullptr; // Return Mesh COM Object fnCreateModelObjectResourceFromClass(pResource, false, &pResourceInterface); // We have not found a suitable object class to return.. if (pResourceInterface == nullptr) throw CNMRException(NMR_ERROR_RESOURCENOTFOUND); // Return result *ppObject = pResourceInterface; return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::SetBox2D(_In_ FLOAT fU, _In_ FLOAT fV, _In_ FLOAT fWidth, _In_ FLOAT fHeight) { try { CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); pTextureResource->setBox2D(fU, fV, fWidth, fHeight); return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }
LIB3MFMETHODIMP CCOMModelTexture2D::ClearBox2D() { try { CModelTexture2DResource * pTextureResource = getTexture2D(); __NMRASSERT(pTextureResource); pTextureResource->clearBox2D(); return handleSuccess(); } catch (CNMRException & Exception) { return handleNMRException(&Exception); } catch (...) { return handleGenericException(); } }