Skip to content

Commit d7c3892

Browse files
committed
Version 2.0.54 - Houdini 18.5.759
Update 5 of the V2 Plugin. The plug-in is now linked to Houdini 18.5.759 / HAPI 3.7.3. As H18.5.759 is the last 18.5 production, this release will be the last update for the v2 plugin for H18.5. The Houdini 19.0 plugin can be found in the Houdini Engine for UYnreal repository https://github.com/sideeffects/HoudiniEngineForUnreal New Features: Added support for controlling Nanite settings via attributes (UE5) "unreal_nanite_enabled" (int, 0 or 1 ) can be used to enable Nanite processing when building a StaticMesh. "unreal_nanite_position_precision" (int) can be used to set the position precision. Step size is 2^(-Value) cm "unreal_nanite_percent_triangles" (float [0 1]) can be used to control the percentage of triangles to keep from LOD0. 1.0 = no reduction, 0.0 = no triangles. Added support for generating landscapes with edit layers By using the "Generate" output mode, (unreal_landscape_output_mode set to 0). Edit layer attributes arte now supported on heightfield primitives. It is now possible to set the default directory used in the browse dialog for File parameters by using the "default_dir" Parameter tag. By default, the plugin now uses the output nodes found in a HDA instead of the display flag. For landscape inputs, the option to marshall only selected landscapes was added, as well as the auto-selection of landscape component using the asset bounds. (those two features existed previously in the v1 plugin) Added an "Update selected components" button, that updates the selected components to the current landscape selection. Added a new attribute, "unreal_force_instancer", that can be used to ensure that an instancer component is created even if there is only a single instance of a StaticMesh. If unreal_foliage, unreal_split_instances or unreal_hierarchical_instancer is set and not 0, then the particular instancer type is created even if there is only a single instance of the StaticMesh. Added support for the "unreal_bake_name" attribute that can be used to set the name of the object(s) generated during baking. The "unreal_output_name" attribute takes precedence. When baking Houdini Instanced Actor Components the "unreal_output_name" (or "unreal_bake_name") attribute, if set, is now used to determine the baked instance actor names. When baking Houdini Instanced Actor Components the instanced object name is now used as the default bake name instead of the HDA actor's name (if the "unreal_output_name" and unreal_bake_name attributes are not set). Houdini Instanced Actor Components now support the "unreal_bake_actor" attribute when baking: the instanced actors are attached to unreal_bake_actor (which is created as an empty actor or re-used from a previous bake depending on the replacement mode). Bugs Fixes: - Fixed Wrong tooltip on Landscape Input "Update Landscape Data" - UE5: Fixed "double cooking" issue when instantiating a new HDA by dragging it on the viewport. Like in UE4, the HDA is only cooked after being dropped. - Fixed a regression that caused rebuilds to fail with "Fatal error - invalid". - All UHoudiniPublicAPIInput classes are now API exported in the C++ Public API. - AHoudiniAssetActor is now public in the C++ API. - Fixed setting multiparm parameters via the Public API. - Fixed various issues with Modify landscape output mode. - Fixed an issue where temporary landscapes were not spawned in the HAC's level. - Fixed an issue where HDA would output from hidden or nested subnets. - Fixed handling of output data between Display nodes and Output nodes to match Houdini's internal behaviour. - Fixed a material update issue for tiled landscapes. - Fixed an issue where input updates/changes via the public API, especially with curve inputs, would not always take effect. - Fixed loading of PDG output regression. - UE5: Fixed an issue where bake to actor would fail and not create any baked actors / assets. - Fixed a crash when trying to assign object path properties via generic attributes with an invalid path. - Fixed unreal_landscape_editlayer_target attribute for Landscape Modify mode. - Fixed landscape input targeting using Input0, Input1, etc. - Fixed Landscape edit layer transforms in Modify mode. - Fixed an issue where HDA would fail to produce an output if the HDA is a SOP/Subnet with the display flag set on an output node, and the "Use Output Nodes is enabled" option is enabled. - Houdini to Unreal StaticMesh translation: fixed an issue where duplicate warnings would be logged in Unreal for meshes with invalid face / vertex data, for each invalid index. - Fixed landscape tile resizing in Generate mode. - Fixed an issue where nested empty folders might crash Unreal or Houdini Engine - Fixed output updates / HDA cooking issues that can occur when using Session Sync. - Fixed an issue during baking where the baked actors of the work items of a TOP node in the PDG asset link were not shared with the remaining work items on the TOP node. - Fixed an issue when processing a spline/curve from Houdini where attributes such as "unreal_output_name" and "unreal_bake_actor" were not always updated when the HDA was cooked more than once, resulting in baking producing incorrect output names / bake actor names. If unreal_bake_actor is not set for a spline / curve we now use "unreal_output_name" to determine the bake actor name. - Improved how work items of TOP nodes are associated with previous cook / bake data in the PDG asset link. - Fixed various cases where after a successful bake the plug-in incorrectly reported that 0 packages were created and/or updated. - Fixed an issue where the HDA wouldn't properly switch between editable and non-editable curve. - Fixed cleanup issue of Houdini Spline input objects in Houdini sessions. - Fixed an issue where data tables with invalid names (spaces or colons) would not marshall data into Houdini Engine. - The generated mesh output now properly uses the collision complexity from the Houdini Mesh Generation Properties. A side effect of this is that the default collision complexity behaviour is now CTF_UseDefault instead of CTF_UseComplexAsSimple. - Fixed issues regarding exported input capsule colliders with rotations. - Fixed issues regarding exported input translation/rotation/scale of convex collider collisions. - Updated how the plugin tries to detect if an HDA should have a PDGAssetLink created. The plugin now simply looks for non scheduler/non bypassed TOP nodes in the asset. Previously it would look for TOP nodes inside all the non bypassed TOP/SOP network, which in some case drastically increased the HDA instantiation time, even for assets without any TOP nodes. - A Landscape's visibility layer is now properly named when sent as heightfield data to Houdini. - Fixed an issue where collision presets were not being saved from the plugin settings - When removing temporary PDG outputs the plugin now also uses the HoudiniAssetComponent's GUID in the package metadata to determine if the output asset may be deleted. - Fixed BSP transform issue. - Fixed an issue where nodes for world input actors were always recreated on update - Fixed an issue where landscape input transform changes were not applied correctly - Fixed an issue with output node: the plugin now ensures that all data from all output nodes are being output properly. - Prevent modifying non-editlayer landscapes when using the Modify Layer output mode. - Fixed tracking of transform changes, as well as transform uploading issues, of non-root components in World Input objects. - Fixed transform updating for Spline components - Fixed an issue where input nodes were not cleaned up in the session. - Prevent cooking of HDAs during PIE except for HDAs that are refining geometry. We now make sure that the plugin is inactive / not ticking during PIE after refinement is completed.
1 parent dc50314 commit d7c3892

File tree

103 files changed

+6945
-2619
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

103 files changed

+6945
-2619
lines changed

Content/Examples/Cpp/CurveInputExample.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@
2424
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2525
*/
2626

27-
#include "Examples/CurveInputExample.h"
27+
#include "CurveInputExample.h"
2828

29+
#include "Engine/StaticMesh.h"
30+
31+
#include "HoudiniAsset.h"
2932
#include "HoudiniPublicAPI.h"
3033
#include "HoudiniPublicAPIBlueprintLib.h"
3134
#include "HoudiniPublicAPIAssetWrapper.h"

Content/Examples/Cpp/CurveInputExample.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
class UHoudiniPublicAPIAssetWrapper;
3535

3636
UCLASS()
37-
class HOUDINIENGINEEDITOR_API ACurveInputExample : public AEditorUtilityActor
37+
class ACurveInputExample : public AEditorUtilityActor
3838
{
3939
GENERATED_BODY()
4040

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
/*
2+
* Copyright (c) <2021> Side Effects Software Inc.
3+
* All rights reserved.
4+
*
5+
* Redistribution and use in source and binary forms, with or without
6+
* modification, are permitted provided that the following conditions are met:
7+
*
8+
* 1. Redistributions of source code must retain the above copyright notice,
9+
* this list of conditions and the following disclaimer.
10+
*
11+
* 2. The name of Side Effects Software may not be used to endorse or
12+
* promote products derived from this software without specific prior
13+
* written permission.
14+
*
15+
* THIS SOFTWARE IS PROVIDED BY SIDE EFFECTS SOFTWARE "AS IS" AND ANY EXPRESS
16+
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17+
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
18+
* NO EVENT SHALL SIDE EFFECTS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
19+
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
21+
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
22+
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
23+
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24+
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25+
*/
26+
27+
28+
#include "IterateOverHoudiniActorsExample.h"
29+
30+
#include "EngineUtils.h"
31+
32+
#include "HoudiniAssetActor.h"
33+
#include "HoudiniPublicAPI.h"
34+
#include "HoudiniPublicAPIBlueprintLib.h"
35+
#include "HoudiniPublicAPIAssetWrapper.h"
36+
37+
38+
// Sets default values
39+
AIterateOverHoudiniActorsExample::AIterateOverHoudiniActorsExample()
40+
{
41+
}
42+
43+
void AIterateOverHoudiniActorsExample::RunIterateOverHoudiniActorsExample_Implementation()
44+
{
45+
// Get the API instance
46+
UHoudiniPublicAPI* const API = UHoudiniPublicAPIBlueprintLib::GetAPI();
47+
// Ensure we have a running Houdini Engine session
48+
if (!API->IsSessionValid())
49+
API->CreateSession();
50+
51+
// Iterate over HoudiniAssetActors in the world (by default when instantiating an HDA in the world an
52+
// AHoudiniAssetActor is spawned, which has a component that manages the instantiated HDA node in Houdini Engine.
53+
UWorld* const OurWorld = GetWorld();
54+
for (TActorIterator<AHoudiniAssetActor> It(OurWorld); It; ++It)
55+
{
56+
AHoudiniAssetActor* const HDAActor = *It;
57+
if (!IsValid(HDAActor))
58+
continue;
59+
60+
// Print the name of the actor
61+
UE_LOG(LogTemp, Display, TEXT("HDA Actor (Name, Label): %s, %s"), *(HDAActor->GetName()), *(HDAActor->GetActorLabel()));
62+
63+
// Wrap it with the API
64+
UHoudiniPublicAPIAssetWrapper* const Wrapper = UHoudiniPublicAPIAssetWrapper::CreateWrapper(this, HDAActor);
65+
if (!IsValid(Wrapper))
66+
continue;
67+
68+
// Print its parameters via the API
69+
TMap<FName, FHoudiniParameterTuple> ParameterTuples;
70+
if (!Wrapper->GetParameterTuples(ParameterTuples))
71+
{
72+
// The operation failed, log the error
73+
FString ErrorMessage;
74+
if (Wrapper->GetLastErrorMessage(ErrorMessage))
75+
UE_LOG(LogTemp, Warning, TEXT("%s"), *ErrorMessage);
76+
77+
continue;
78+
}
79+
80+
UE_LOG(LogTemp, Display, TEXT("# Parameter Tuples: %d"), ParameterTuples.Num());
81+
for (const auto& Entry : ParameterTuples)
82+
{
83+
UE_LOG(LogTemp, Display, TEXT("\tParameter Tuple Name: %s"), *(Entry.Key.ToString()));
84+
85+
const FHoudiniParameterTuple& ParameterTuple = Entry.Value;
86+
TArray<FString> Strings;
87+
FString Type;
88+
if (ParameterTuple.BoolValues.Num() > 0)
89+
{
90+
Type = TEXT("Bool");
91+
for (const bool Value : ParameterTuple.BoolValues)
92+
{
93+
Strings.Add(Value ? TEXT("1") : TEXT("0"));
94+
}
95+
}
96+
else if (ParameterTuple.FloatValues.Num() > 0)
97+
{
98+
Type = TEXT("Float");
99+
for (const float Value : ParameterTuple.FloatValues)
100+
{
101+
Strings.Add(FString::Printf(TEXT("%.4f"), Value));
102+
}
103+
}
104+
else if (ParameterTuple.Int32Values.Num() > 0)
105+
{
106+
Type = TEXT("Int32");
107+
for (const int32 Value : ParameterTuple.Int32Values)
108+
{
109+
Strings.Add(FString::Printf(TEXT("%d"), Value));
110+
}
111+
}
112+
else if (ParameterTuple.StringValues.Num() > 0)
113+
{
114+
Type = TEXT("String");
115+
Strings = ParameterTuple.StringValues;
116+
}
117+
118+
if (Type.Len() == 0)
119+
{
120+
UE_LOG(LogTemp, Display, TEXT("\t\tEmpty"));
121+
}
122+
else
123+
{
124+
UE_LOG(LogTemp, Display, TEXT("\t\t%s Values: %s"), *Type, *FString::Join(Strings, TEXT("; ")));
125+
}
126+
}
127+
}
128+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright (c) <2021> Side Effects Software Inc.
3+
* All rights reserved.
4+
*
5+
* Redistribution and use in source and binary forms, with or without
6+
* modification, are permitted provided that the following conditions are met:
7+
*
8+
* 1. Redistributions of source code must retain the above copyright notice,
9+
* this list of conditions and the following disclaimer.
10+
*
11+
* 2. The name of Side Effects Software may not be used to endorse or
12+
* promote products derived from this software without specific prior
13+
* written permission.
14+
*
15+
* THIS SOFTWARE IS PROVIDED BY SIDE EFFECTS SOFTWARE "AS IS" AND ANY EXPRESS
16+
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17+
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
18+
* NO EVENT SHALL SIDE EFFECTS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
19+
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
21+
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
22+
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
23+
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24+
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25+
*/
26+
27+
#pragma once
28+
29+
#include "CoreMinimal.h"
30+
#include "EditorUtilityActor.h"
31+
32+
#include "IterateOverHoudiniActorsExample.generated.h"
33+
34+
UCLASS()
35+
class APIEXAMPLEEDITOR_API AIterateOverHoudiniActorsExample : public AEditorUtilityActor
36+
{
37+
GENERATED_BODY()
38+
39+
public:
40+
// Sets default values for this actor's properties
41+
AIterateOverHoudiniActorsExample();
42+
43+
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, CallInEditor)
44+
void RunIterateOverHoudiniActorsExample();
45+
};

Content/Examples/Python/eau_curve_input_example.py

+15-9
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@
2828

2929
@unreal.uclass()
3030
class CurveInputExample(unreal.PlacedEditorUtilityBase):
31-
def __init__(self, *args, **kwargs):
32-
self._asset_wrapper = None
31+
# Use a FProperty to hold the reference to the API wrapper we create in
32+
# run_curve_input_example
33+
_asset_wrapper = unreal.uproperty(unreal.HoudiniPublicAPIAssetWrapper)
3334

35+
@unreal.ufunction(meta=dict(BlueprintCallable=True, CallInEditor=True))
3436
def run_curve_input_example(self):
3537
# Get the API instance
3638
api = unreal.HoudiniPublicAPIBlueprintLib.get_api()
@@ -40,15 +42,17 @@ def run_curve_input_example(self):
4042
# Load our HDA uasset
4143
example_hda = unreal.load_object(None, '/HoudiniEngine/Examples/hda/copy_to_curve_1_0.copy_to_curve_1_0')
4244
# Create an API wrapper instance for instantiating the HDA and interacting with it
43-
self._asset_wrapper = api.instantiate_asset(example_hda, instantiate_at=unreal.Transform())
44-
if self._asset_wrapper:
45+
wrapper = api.instantiate_asset(example_hda, instantiate_at=unreal.Transform())
46+
if wrapper:
4547
# Pre-instantiation is the earliest point where we can set parameter values
46-
self._asset_wrapper.on_pre_instantiation_delegate.add_callable(self._set_initial_parameter_values)
48+
wrapper.on_pre_instantiation_delegate.add_function(self, '_set_initial_parameter_values')
4749
# Jumping ahead a bit: we also want to configure inputs, but inputs are only available after instantiation
48-
self._asset_wrapper.on_post_instantiation_delegate.add_callable(self._set_inputs)
50+
wrapper.on_post_instantiation_delegate.add_function(self, '_set_inputs')
4951
# Jumping ahead a bit: we also want to print the outputs after the node has cook and the plug-in has processed the output
50-
self._asset_wrapper.on_post_processing_delegate.add_callable(self._print_outputs)
52+
wrapper.on_post_processing_delegate.add_function(self, '_print_outputs')
53+
self.set_editor_property('_asset_wrapper', wrapper)
5154

55+
@unreal.ufunction(params=[unreal.HoudiniPublicAPIAssetWrapper], meta=dict(CallInEditor=True))
5256
def _set_initial_parameter_values(self, in_wrapper):
5357
""" Set our initial parameter values: disable upvectorstart and set the scale to 0.2. """
5458
# Uncheck the upvectoratstart parameter
@@ -58,8 +62,9 @@ def _set_initial_parameter_values(self, in_wrapper):
5862
in_wrapper.set_float_parameter_value('scale', 0.2)
5963

6064
# Since we are done with setting the initial values, we can unbind from the delegate
61-
in_wrapper.on_pre_instantiation_delegate.remove_callable(self._set_initial_parameter_values)
65+
in_wrapper.on_pre_instantiation_delegate.remove_function(self, '_set_initial_parameter_values')
6266

67+
@unreal.ufunction(params=[unreal.HoudiniPublicAPIAssetWrapper], meta=dict(CallInEditor=True))
6368
def _set_inputs(self, in_wrapper):
6469
""" Configure our inputs: input 0 is a cube and input 1 a helix. """
6570
# Create an empty geometry input
@@ -94,8 +99,9 @@ def _set_inputs(self, in_wrapper):
9499
in_wrapper.set_input_at_index(1, curve_input)
95100

96101
# unbind from the delegate, since we are done with setting inputs
97-
in_wrapper.on_post_instantiation_delegate.remove_callable(self._set_inputs)
102+
in_wrapper.on_post_instantiation_delegate.remove_function(self, '_set_inputs')
98103

104+
@unreal.ufunction(params=[unreal.HoudiniPublicAPIAssetWrapper], meta=dict(CallInEditor=True))
99105
def _print_outputs(self, in_wrapper):
100106
""" Print the outputs that were generated by the HDA (after a cook) """
101107
num_outputs = in_wrapper.get_num_outputs()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# Copyright (c) <2021> Side Effects Software Inc.
2+
# All rights reserved.
3+
#
4+
# Redistribution and use in source and binary forms, with or without
5+
# modification, are permitted provided that the following conditions are met:
6+
#
7+
# 1. Redistributions of source code must retain the above copyright notice,
8+
# this list of conditions and the following disclaimer.
9+
#
10+
# 2. The name of Side Effects Software may not be used to endorse or
11+
# promote products derived from this software without specific prior
12+
# written permission.
13+
#
14+
# THIS SOFTWARE IS PROVIDED BY SIDE EFFECTS SOFTWARE "AS IS" AND ANY EXPRESS
15+
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16+
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
17+
# NO EVENT SHALL SIDE EFFECTS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
18+
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
19+
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
20+
# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
21+
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
22+
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
23+
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24+
25+
26+
""" Example script that uses unreal.ActorIterator to iterate over all
27+
HoudiniAssetActors in the editor world, creates API wrappers for them, and
28+
logs all of their parameter tuples.
29+
30+
"""
31+
32+
import unreal
33+
34+
35+
def run():
36+
# Get the API instance
37+
api = unreal.HoudiniPublicAPIBlueprintLib.get_api()
38+
39+
# Get the editor world
40+
editor_subsystem = None
41+
world = None
42+
try:
43+
# In UE5 unreal.EditorLevelLibrary.get_editor_world is deprecated and
44+
# unreal.UnrealEditorSubsystem.get_editor_world is the replacement,
45+
# but unreal.UnrealEditorSubsystem does not exist in UE4
46+
editor_subsystem = unreal.UnrealEditorSubsystem()
47+
except AttributeError:
48+
world = unreal.EditorLevelLibrary.get_editor_world()
49+
else:
50+
world = editor_subsystem.get_editor_world()
51+
52+
# Iterate over all Houdini Asset Actors in the editor world
53+
for houdini_actor in unreal.ActorIterator(world, unreal.HoudiniAssetActor):
54+
if not houdini_actor:
55+
continue
56+
57+
# Print the name and label of the actor
58+
actor_name = houdini_actor.get_name()
59+
actor_label = houdini_actor.get_actor_label()
60+
print(f'HDA Actor (Name, Label): {actor_name}, {actor_label}')
61+
62+
# Wrap the Houdini asset actor with the API
63+
wrapper = unreal.HoudiniPublicAPIAssetWrapper.create_wrapper(world, houdini_actor)
64+
if not wrapper:
65+
continue
66+
67+
# Get all parameter tuples of the HDA
68+
parameter_tuples = wrapper.get_parameter_tuples()
69+
if parameter_tuples is None:
70+
# The operation failed, log the error message
71+
error_message = wrapper.get_last_error_message()
72+
if error_message is not None:
73+
print(error_message)
74+
75+
continue
76+
77+
print(f'# Parameter Tuples: {len(parameter_tuples)}')
78+
for name, data in parameter_tuples.items():
79+
print(f'\tParameter Tuple Name: {name}')
80+
81+
type_name = None
82+
values = None
83+
if data.bool_values:
84+
type_name = 'Bool'
85+
values = '; '.join(('1' if v else '0' for v in data.bool_values))
86+
elif data.float_values:
87+
type_name = 'Float'
88+
values = '; '.join((f'{v:.4f}' for v in data.float_values))
89+
elif data.int32_values:
90+
type_name = 'Int32'
91+
values = '; '.join((f'{v:d}' for v in data.int32_values))
92+
elif data.string_values:
93+
type_name = 'String'
94+
values = '; '.join(data.string_values)
95+
96+
if not type_name:
97+
print('\t\tEmpty')
98+
else:
99+
print(f'\t\t{type_name} Values: {values}')
100+
101+
102+
if __name__ == '__main__':
103+
run()

HoudiniEngine.uplugin

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"FileVersion" : 3,
33
"FriendlyName" : "Houdini Engine v2",
4-
"Version" : 18050696,
5-
"VersionName" : "v2.0 - H18.5.696",
4+
"Version" : 18050759,
5+
"VersionName" : "v2.0 - H18.5.759",
66
"CreatedBy" : "Side Effects Software Inc.",
77
"CreatedByURL" : "http://www.sidefx.com",
88
"DocsURL" : "http://www.sidefx.com/docs/unreal/",

README.md

-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
Welcome to the repository for Version 2 of the Houdini Engine For Unreal Plugin.
44

5-
** As only version 2 of the plugin now ships with Houdini 19.0, regular updates of the version 2 plugin now happen on the [HoudiniEngineForUnreal](https://github.com/sideeffects/HoudiniEngineForUnreal) repository. The source code available on this repository is only for Houdini 18.5, and will stop to recieve updates after the last Houdini 18.5 production build. **
6-
75
This plug-in brings Houdini's powerful and flexible procedural workflow into Unreal Engine through Houdini Digital Assets. Artists can interactively adjust asset parameters inside the editor and use Unreal assets as inputs. Houdini's procedural engine will then "cook" the asset and the results will be available in the editor without the need for baking.
86

97
Version 2 is a significant rewrite of the core architecture of the existing Houdini Engine plugin, and comes  with many new features, and improvements.

0 commit comments

Comments
 (0)