Example #1
0
	// 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;
	}
Example #2
0
	_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();
		}
	}
Example #5
0
	_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;

	}