// Convenience functions for objects _Ret_maybenull_ CModelObject * CModel::findObject(_In_ ModelResourceID nResourceID) { PModelResource pResource = findResource(nResourceID); if (pResource != nullptr) { CModelObject * pModelObject = dynamic_cast<CModelObject *> (pResource.get()); if (pModelObject == nullptr) throw CNMRException (NMR_ERROR_RESOURCETYPEMISMATCH); return pModelObject; } return nullptr; }
_Ret_maybenull_ CModelTexture2DResource * CModel::findTexture2D(_In_ ModelResourceID nResourceID) { PModelResource pResource = findResource(nResourceID); if (pResource != nullptr) { CModelTexture2DResource * pTexture2D = dynamic_cast<CModelTexture2DResource *> (pResource.get()); if (pTexture2D == nullptr) throw CNMRException(NMR_ERROR_RESOURCETYPEMISMATCH); return pTexture2D; } return nullptr; }
CModelWriterNode100_Model::CModelWriterNode100_Model(_In_ CModel * pModel, _In_ CXmlWriter * pXMLWriter) :CModelWriterNode(pModel, pXMLWriter) { m_ResourceCounter = pModel->generateResourceID(); m_pColorMapping = std::make_shared<CModelWriter_ColorMapping>(generateOutputResourceID ()); m_pTexCoordMappingContainer = std::make_shared<CModelWriter_TexCoordMappingContainer>(); nfInt32 nObjectCount = pModel->getObjectCount(); nfInt32 nObjectIndex; for (nObjectIndex = 0; nObjectIndex < nObjectCount; nObjectIndex++) { PModelResource pResource = pModel->getObjectResource(nObjectIndex); CModelMeshObject * pMeshObject = dynamic_cast<CModelMeshObject*> (pResource.get()); if (pMeshObject) { CMesh * pMesh = pMeshObject->getMesh(); if (pMesh) { calculateColors(pMesh); calculateTexCoords(pMesh); } } // Register Default Property Resources CModelObject * pObject = dynamic_cast<CModelObject*> (pResource.get()); if (pObject) { PModelDefaultProperty pProperty = pObject->getDefaultProperty(); CModelDefaultProperty_Color * pColorProperty = dynamic_cast<CModelDefaultProperty_Color *> (pProperty.get()); if (pColorProperty != nullptr) { nfColor cColor = pColorProperty->getColor(); if (cColor != 0) m_pColorMapping->registerColor(cColor); } CModelDefaultProperty_TexCoord2D * pTexCoord2DProperty = dynamic_cast<CModelDefaultProperty_TexCoord2D *> (pProperty.get()); if (pTexCoord2DProperty != nullptr) { PModelWriter_TexCoordMapping pTexCoordMapping = m_pTexCoordMappingContainer->findTexture(pTexCoord2DProperty->getTextureID()); if (pTexCoordMapping.get() == nullptr) { pTexCoordMapping = m_pTexCoordMappingContainer->addTexture(pTexCoord2DProperty->getTextureID(), generateOutputResourceID()); } pTexCoordMapping->registerTexCoords(pTexCoord2DProperty->getU(), pTexCoord2DProperty->getV()); } } } }
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(); } }
_Ret_maybenull_ CModelBaseMaterialResource * CModel::findBaseMaterial(_In_ ModelResourceID nResourceID) { PModelResource pResource = findResource(nResourceID); if (pResource != nullptr) { CModelBaseMaterialResource * pBaseMaterial = dynamic_cast<CModelBaseMaterialResource *> (pResource.get()); if (pBaseMaterial == nullptr) throw CNMRException(NMR_ERROR_RESOURCETYPEMISMATCH); return pBaseMaterial; } return nullptr; }