示例#1
0
void DocumentImporter::report_unknown_reference(const COLLADAFW::Node &node, const std::string object_type)
{
	std::string id = node.getOriginalId();
	std::string name = node.getName();
	fprintf(stderr,
		"error: node id=\"%s\", name=\"%s\" refers to an undefined %s.\n",
		id.c_str(),
		name.c_str(),
		object_type.c_str());
}
    //------------------------------
	bool NodeLoader::begin__instance_light( const instance_light__AttributeData& attributeData )
	{
		COLLADAFW::Node* currentNode = mNodeStack.top();
		COLLADAFW::UniqueId instantiatedLightUniqueId = getHandlingFilePartLoader()->createUniqueIdFromUrl( attributeData.url, COLLADAFW::Light::ID() );

        COLLADAFW::UniqueId instanceLightUniqueId = getHandlingFilePartLoader()->createUniqueId( COLLADAFW::InstanceLight::ID() );
		COLLADAFW::InstanceLight* instanceLight = FW_NEW COLLADAFW::InstanceLight(instanceLightUniqueId, instantiatedLightUniqueId);
		currentNode->getInstanceLights().append(instanceLight);

		return true;
	}
    //------------------------------
	bool NodeLoader::begin__instance_camera( const instance_camera__AttributeData& attributeData )
	{
        COLLADAFW::Node* currentNode = mNodeStack.top();
		COLLADAFW::UniqueId instantiatedCameraUniqueId = getHandlingFilePartLoader()->createUniqueIdFromUrl( attributeData.url, COLLADAFW::Camera::ID() );

        COLLADAFW::UniqueId instanceCameraUniqueId = getHandlingFilePartLoader()->createUniqueId( COLLADAFW::InstanceCamera::ID() );
		COLLADAFW::InstanceCamera* instanceCamera = FW_NEW COLLADAFW::InstanceCamera(instanceCameraUniqueId, instantiatedCameraUniqueId);
		currentNode->getInstanceCameras().append(instanceCamera);

		return true;
	}
	//------------------------------
	bool NodeLoader::begin__instance_node( const instance_node__AttributeData& attributeData )
	{
		COLLADAFW::Node* currentNode = mNodeStack.top();
		COLLADAFW::UniqueId instantiatedNodeUniqueId = getHandlingFilePartLoader()->createUniqueIdFromUrl( attributeData.url, COLLADAFW::Node::ID() );

        COLLADAFW::UniqueId instanceNodeUniqueId = getHandlingFilePartLoader()->createUniqueId( COLLADAFW::InstanceNode::ID() );
		COLLADAFW::InstanceNode* instanceNode = FW_NEW COLLADAFW::InstanceNode(instanceNodeUniqueId,instantiatedNodeUniqueId);
		if( attributeData.name )
			instanceNode->setName( attributeData.name );
		currentNode->getInstanceNodes().append(instanceNode);

		return true;
	}
    //------------------------------
	bool NodeLoader::begin__instance_geometry( const instance_geometry__AttributeData& attributeData )
	{
		COLLADAFW::Node* currentNode = mNodeStack.top();

		COLLADAFW::UniqueId instantiatedGeometryUniqueId = getHandlingFilePartLoader()->createUniqueIdFromUrl( attributeData.url, COLLADAFW::Geometry::ID());
		mCurrentMaterialInfo = &getHandlingFilePartLoader()->getMeshMaterialIdInfo();

        COLLADAFW::UniqueId uniqueId = getHandlingFilePartLoader()->createUniqueId ( COLLADAFW::InstanceGeometry::ID() );
		COLLADAFW::InstanceGeometry* instanceGeometry = FW_NEW COLLADAFW::InstanceGeometry ( uniqueId, instantiatedGeometryUniqueId );
		mCurrentInstanceGeometry = instanceGeometry;
		instanceGeometry->setName(currentNode->getName());
		currentNode->getInstanceGeometries().append(instanceGeometry);

		return true;
	}
	//------------------------------
	bool NodeLoader::beginNode( const node__AttributeData& attributeData )
	{
		COLLADAFW::Node* newNode = new COLLADAFW::Node( getHandlingFilePartLoader()->createUniqueIdFromId(attributeData.id, COLLADAFW::Node::ID()));

		if ( attributeData.name )
			newNode->setName ( (const char*)attributeData.name );
		else if ( attributeData.id )
			newNode->setName ( (const char*)attributeData.id );

        if ( attributeData.id )
            newNode->setOriginalId ( (const char*)attributeData.id );

        if ( attributeData.type == ENUM__NodeType__JOINT )
            newNode->setType ( COLLADAFW::Node::JOINT );

		getHandlingFilePartLoader()->addToSidTree(attributeData.id, attributeData.sid, newNode);

		if ( mNodeStack.empty() )
		{
			// we are a direct child of a container
			handleRootNode(newNode);
		}
		else
		{
			//we are a child of another node
			COLLADAFW::Node* parentNode = mNodeStack.top();
			parentNode->getChildNodes().append(newNode);
		}
		mNodeStack.push(newNode);
		return true;
	}
	//------------------------------
	bool NodeLoader::begin__instance_controller( const instance_controller__AttributeData& attributeData )
	{
		COLLADAFW::Node* currentNode = mNodeStack.top();
		COLLADAFW::UniqueId instantiatedControllerUniqueId = getHandlingFilePartLoader()->createUniqueIdFromUrl( attributeData.url, COLLADAFW::SkinControllerData::ID() );
		mCurrentMaterialInfo = &getHandlingFilePartLoader()->getMeshMaterialIdInfo();

        COLLADAFW::UniqueId uniqueId = getHandlingFilePartLoader()->createUniqueId ( COLLADAFW::InstanceController::ID() );
		COLLADAFW::InstanceController* instanceController = FW_NEW COLLADAFW::InstanceController( uniqueId, instantiatedControllerUniqueId);
		mCurrentInstanceController = instanceController;
		currentNode->getInstanceControllers().append(instanceController);

		Loader::InstanceControllerData instanceControllerData;
		instanceControllerData.instanceController = instanceController;
		Loader::InstanceControllerDataList& instanceControllerDataList = getHandlingFilePartLoader()->getInstanceControllerDataListByControllerUniqueId(instantiatedControllerUniqueId);
		instanceControllerDataList.push_back(instanceControllerData);
		mCurrentInstanceControllerData = &instanceControllerDataList.back();

		return true;
	}
	//--------------------------------------------------------------------
	bool Nebula3Writer::importNode ( const COLLADAFW::Node* node,const COLLADAFW::Node* parentNode)
	{
		const COLLADAFW::UniqueId& uniqueId = node->getUniqueId ();			
		this->mNodeMaps.Add(uniqueId,NodeData());
		NodeData& nodeData = this->mNodeMaps[uniqueId];
		nodeData.nodeName = this->generaterNodeName(node);
		nodeData.nodeUniqueId = uniqueId;
		if( node->getType() == COLLADAFW::Node::JOINT ) nodeData.nodeType = NodeData::JOINT;
		this->importTransformations(node,nodeData);
		//n_printf("importNode [%s] ......\n",nodeData.nodeName.AsCharPtr());
		
		/// ¸¸×Ó¹Øϵ
		if( parentNode!=NULL ) 
		{
			nodeData.parentUniqueId = parentNode->getUniqueId();			
		}	

		if( node->getType() == COLLADAFW::Node::JOINT )
		{
			const Util::Array<COLLADAFW::UniqueId>& keys = this->mCharacterDatas.KeysAsArray();
			for (int i=0; i< keys.Size();i++)
			{
				const COLLADAFW::UniqueId& jointId = keys[i];
				CharacterData& characterData = this->mCharacterDatas[jointId];
				if( characterData.rootUniqueId.isValid()) continue;
				characterData.rootUniqueId = uniqueId;
			}///end for
		}	

		// Go through the controller instances and save the ids to the current node.
		const COLLADAFW::InstanceControllerArray& controllerInstances = node->getInstanceControllers ();
		size_t numInstances = controllerInstances.getCount ();
		for ( size_t i=0; i<numInstances; ++i )
		{
			const COLLADAFW::InstanceController* instanceController = controllerInstances [i];
			const COLLADAFW::UniqueId& controllerId = instanceController->getInstanciatedObjectId ();
			mControllerNodeMaps.Add(controllerId,uniqueId);
			mInstanceNodeMaps.Add(controllerId,uniqueId);
			nodeData.controllerUniqueIds.Append(controllerId);

			const MaterialBindingArray& materialArray = instanceController->getMaterialBindings();
			this->getMaterialBinding(nodeData,materialArray);
		}

		// Go through the geometry instances and save the ids to the current node.
		const COLLADAFW::InstanceGeometryPointerArray& geometryInstances = node->getInstanceGeometries ();
		numInstances = geometryInstances.getCount ();
		for ( size_t i=0; i<numInstances; ++i )
		{
			const COLLADAFW::InstanceGeometry* instanceGeometry = geometryInstances [i];
			const COLLADAFW::UniqueId& geometryId = instanceGeometry->getInstanciatedObjectId ();
			mGeometryNodeMaps.Add(geometryId,uniqueId);
			mInstanceNodeMaps.Add(geometryId,uniqueId);
			nodeData.geometryUniqueIds.Append(geometryId);

			const MaterialBindingArray& materialArray = instanceGeometry->getMaterialBindings();
			this->getMaterialBinding(nodeData,materialArray);
			
		}///end for

		// Recursive call for all child elements.
		const COLLADAFW::NodeArray& childNodes = node->getChildNodes ();
		size_t numChildNodes = childNodes.getCount ();
		for ( size_t i=0; i<numChildNodes; ++i )
		{
			COLLADAFW::Node* childNode = childNodes [i];
			nodeData.childUniqueIds.Append(childNode->getUniqueId());
		}

		for ( size_t i=0; i<numChildNodes; ++i )
		{
			COLLADAFW::Node* childNode = childNodes [i];		
			importNode ( childNode, node);
		}
		return true;
	}