public void GenerateGeometry(HEU_SessionBase session, bool bRebuild)
	{
	    // Volumes could come in as a geonode + part for each heightfield layer.
	    // Otherwise the other geo types can be done individually.

	    bool bResult = false;

	    List<HEU_PartData> meshParts = new List<HEU_PartData>();
	    List<HEU_PartData> volumeParts = new List<HEU_PartData>();

	    List<HEU_PartData> partsToDestroy = new List<HEU_PartData>();

	    HEU_HoudiniAsset parentAsset = ParentAsset;

	    foreach (HEU_GeoNode geoNode in _geoNodes)
	    {
		geoNode.GetPartsByOutputType(meshParts, volumeParts);

		if (volumeParts.Count > 0)
		{
		    // Volumes
		    // Each layer in the volume is retrieved as a volume part, in the display geo node. 
		    // But we need to handle all layers as 1 terrain output in Unity, with 1 height layer and 
		    // other layers as alphamaps.
		    geoNode.ProcessVolumeParts(session, volumeParts, bRebuild);

		    // Clear the volume parts after processing since we are done with this set
		    volumeParts.Clear();
		}
	    }

	    // Meshes
	    foreach (HEU_PartData part in meshParts)
	    {
		// This returns false when there is no valid geometry or is not instancing. Should remove it as otherwise
		// stale data sticks around on recook
		bResult = part.GenerateMesh(session, parentAsset.GenerateUVs, parentAsset.GenerateTangents, parentAsset.GenerateNormals, parentAsset.UseLODGroups);
		if (!bResult)
		{
		    partsToDestroy.Add(part);
		}
	    }

	    int numPartsToDestroy = partsToDestroy.Count;
	    for (int i = 0; i < numPartsToDestroy; ++i)
	    {
		HEU_GeoNode parentNode = partsToDestroy[i].ParentGeoNode;
		if (parentNode != null)
		{
		    parentNode.RemoveAndDestroyPart(partsToDestroy[i]);
		}
		else
		{
		    HEU_PartData.DestroyPart(partsToDestroy[i]);
		}
	    }
	    partsToDestroy.Clear();

	    ApplyObjectTransformToGeoNodes();

	    // Set visibility and attribute-based tag, layer, and scripts
	    bool bIsVisible = IsVisible();
	    foreach (HEU_GeoNode geoNode in _geoNodes)
	    {
		geoNode.CalculateVisiblity(bIsVisible);
		geoNode.CalculateColliderState();

		geoNode.SetAttributeModifiersOnPartOutputs(session);
	    }

	    // Create editable attributes.
	    // This should happen after visibility has been calculated above
	    // since we need to show/hide the intermediate geometry during painting.
	    foreach (HEU_PartData part in meshParts)
	    {
		if (part.ParentGeoNode.IsIntermediateOrEditable())
		{
		    part.SetupAttributeGeometry(session);
		}
	    }
	}
Exemple #2
0
		public void GenerateGeometry(HEU_SessionBase session)
		{
			// Volumes could come in as a geonode + part for each heightfield layer.
			// Otherwise the other geo types can be done individually.

			bool bResult = false;

			List<HEU_PartData> meshParts = new List<HEU_PartData>();
			List<HEU_PartData> volumeParts = new List<HEU_PartData>();

			List<HEU_PartData> partsToDestroy = new List<HEU_PartData>();

			HEU_HoudiniAsset parentAsset = ParentAsset;

			foreach (HEU_GeoNode geoNode in _geoNodes)
			{
				geoNode.GetPartsByOutputType(meshParts, volumeParts);
			}

			// Meshes
			foreach (HEU_PartData part in meshParts)
			{
				bResult = part.GenerateMesh(session, parentAsset.GenerateUVs, parentAsset.GenerateTangents, parentAsset.GenerateNormals, parentAsset.UseLODGroups);
				if (!bResult)
				{
					partsToDestroy.Add(part);
				}
			}

#if TERRAIN_SUPPORTED
			// Volumes
			// Each layer in the volume is retrieved as a volume part, in the display geo node. 
			// But we need to handle all layers as 1 terrain output in Unity, with 1 height layer and 
			// other layers as alphamaps.
			if (volumeParts.Count > 0)
			{
				HEU_PartData heightLayerPart = null;
				HEU_VolumeCache volumeCache = new HEU_VolumeCache();
				volumeCache.GenerateTerrainFromParts(session, volumeParts, ParentAsset, out heightLayerPart);

				// Remove volume parts that are not the height layer (even if heightLayerPart is null)
				foreach (HEU_PartData part in volumeParts)
				{
					if (part != heightLayerPart)
					{
						partsToDestroy.Add(part);
					}
				}
			}
#endif

			int numPartsToDestroy = partsToDestroy.Count;
			for(int i = 0; i < numPartsToDestroy; ++i)
			{
				HEU_GeoNode parentNode = partsToDestroy[i].ParentGeoNode;
				if (parentNode != null)
				{
					parentNode.RemoveAndDestroyPart(partsToDestroy[i]);
				}
				else
				{
					HEU_PartData.DestroyPart(partsToDestroy[i]);
				}
			}
			partsToDestroy.Clear();

			ApplyObjectTransformToGeoNodes();

			// Set visibility
			bool bIsVisible = IsVisible();
			foreach (HEU_GeoNode geoNode in _geoNodes)
			{
				geoNode.CalculateVisiblity(bIsVisible);
			}

			// Create editable attributes.
			// This should happen after visibility has been calculated above
			// since we need to show/hide the intermediate geometry during painting.
			foreach (HEU_PartData part in meshParts)
			{
				if (part.ParentGeoNode.IsIntermediateOrEditable())
				{
					part.SetupAttributeGeometry(session);
				}
			}
		}