Request for Feedback: Thicket - Free Open Source Laubwerk Plants Add-on for Blender 2.80

First time contributor here :wave: looking for feedback on a free open source Blender Add-on I’ve been working on. Thicket is a Blender 2.80 Add-on to import Laubwerk Plants high resolution plant and tree models using the Python SDK distributed with the commercial Plant Kits, including the Plant Kit Freebie.

I’m an independent open source software developer and archviz hobbyist, I’m not affiliated with Laubwerk GmbH. I started this project to migrate my archviz workflow from SketchUp to Blender.

I’m reaching out here hoping to get some feedback from Blender artists. The project is functional, but still relatively early in the development cycle toward a 1.0 release (currently at 0.3.0). Specifically I’d like to hear from you regarding:

  • Installation
  • Utility (do you find it useful?)
  • Ease of use (did it behave like you expected it to?)
  • The Blender Way (does the Add-on feel like it was made for Blender in terms of terminology, UI layouts, workflows, etc.?)
  • Feature set (is there something else you would like it to do that it doesn’t?)
  • Platform (Thicket is limited to Mac OS and Windows due to the dependency on the Laubwerk Python SDK which isn’t available for Linux)

I’d welcome both comments here as well as Issues on the GitHub page.

OK, so with that, a quick intro to the Thicket Add-on for context. Thicket provides a visual plant gallery to select from the installed Laubwerk plants.

The Plant Properties panel provides options to configure the plant model variant, age, and leaf density. It generates separate viewport and render objects, supporting various levels of detail for each. The viewport can display a low poly proxy (convex hull), partial or full geometry models in any of Blender’s viewport modes.

The rendered model geometry is generated using various level of detail controls. Thicket uses Material Nodes and takes advantage of collection instancing to optimize scene size.

Instructions to install and get started with the Add-on are all available at the Thicket GitHub Project. The latest development release is available on the Releases tab. Thanks for having a look.

6 Likes

I’m trying to install this in Blender 2.83 but I get an error rebuilding the DB

location: <unknown location>:-1
Error: Traceback (most recent call last):
  File "C:\Users\John\AppData\Roaming\Blender Foundation\Blender\2.83\scripts\addons\thicket-0_3_0\__init__.py", line 961, in execute
    db.build(str(plants_path), str(sdk_path))
  File "C:\Users\John\AppData\Roaming\Blender Foundation\Blender\2.83\scripts\addons\thicket-0_3_0\thicket_db.py", line 232, in build
    p_rec = json.loads(outs)
  File "N:\Programs\Blender\stable\blender-2.83.0-windows64\2.83\python\lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "N:\Programs\Blender\stable\blender-2.83.0-windows64\2.83\python\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "N:\Programs\Blender\stable\blender-2.83.0-windows64\2.83\python\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

location: <unknown location>:-1

Also I had a strange result installing the Laubwerk pack. I normally install programs to an SSD in N.\Programs. When I tried to install the pack to the SSD it worked but I didn’t get the Python folder. I found that Laubwerk was also Installed under “C:\Program files” with a Python folder. I had to copy the Python folder to the SSD Laubwerk folder to get it to be recognised. Maybe there’s some conflict there?

1 Like

I found more details in the console

Load Handler:
usage: thicket_db.py [-h] [-d D] [-f F] [-l {DEBUG,INFO,WARN,ERROR,CRITICAL}]
                     [-p P] [-s S]
                     {read,build,parse_plant}
thicket_db.py: error: argument -l: invalid choice: 'WARNING' (choose from 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL')
usage: thicket_db.py [-h] [-d D] [-f F] [-l {DEBUG,INFO,WARN,ERROR,CRITICAL}]
                     [-p P] [-s S]
                     {read,build,parse_plant}
thicket_db.py: error: argument -l: invalid choice: 'WARNING' (choose from 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL')
usage: thicket_db.py [-h] [-d D] [-f F] [-l {DEBUG,INFO,WARN,ERROR,CRITICAL}]
                     [-p P] [-s S]
                     {read,build,parse_plant}
thicket_db.py: error: argument -l: invalid choice: 'WARNING' (choose from 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL')
usage: thicket_db.py [-h] [-d D] [-f F] [-l {DEBUG,INFO,WARN,ERROR,CRITICAL}]
                     [-p P] [-s S]
                     {read,build,parse_plant}
thicket_db.py: error: argument -l: invalid choice: 'WARNING' (choose from 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL')
usage: thicket_db.py [-h] [-d D] [-f F] [-l {DEBUG,INFO,WARN,ERROR,CRITICAL}]
                     [-p P] [-s S]
                     {read,build,parse_plant}
thicket_db.py: error: argument -l: invalid choice: 'WARNING' (choose from 'DEBUG', 'INFO', 'WARN', 'ERROR', 'CRITICAL')
Traceback (most recent call last):
  File "C:\Users\John\AppData\Roaming\Blender Foundation\Blender\2.83\scripts\addons\thicket-0_3_0\__init__.py", line 961, in execute
    db.build(str(plants_path), str(sdk_path))
  File "C:\Users\John\AppData\Roaming\Blender Foundation\Blender\2.83\scripts\addons\thicket-0_3_0\thicket_db.py", line 232, in build
    p_rec = json.loads(outs)
  File "N:\Programs\Blender\stable\blender-2.83.0-windows64\2.83\python\lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "N:\Programs\Blender\stable\blender-2.83.0-windows64\2.83\python\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "N:\Programs\Blender\stable\blender-2.83.0-windows64\2.83\python\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

location: <unknown location>:-1

location: <unknown location>:-1
Error: Traceback (most recent call last):
  File "C:\Users\John\AppData\Roaming\Blender Foundation\Blender\2.83\scripts\addons\thicket-0_3_0\__init__.py", line 961, in execute
    db.build(str(plants_path), str(sdk_path))
  File "C:\Users\John\AppData\Roaming\Blender Foundation\Blender\2.83\scripts\addons\thicket-0_3_0\thicket_db.py", line 232, in build
    p_rec = json.loads(outs)
  File "N:\Programs\Blender\stable\blender-2.83.0-windows64\2.83\python\lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "N:\Programs\Blender\stable\blender-2.83.0-windows64\2.83\python\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "N:\Programs\Blender\stable\blender-2.83.0-windows64\2.83\python\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

location: <unknown location>:-1

1 Like

Thank you @pinthenet, this pointed me right to the problem:

Fortunately, the fix is easy:

diff --git a/thicket_db.py b/thicket_db.py
index f6d8791…5d6f9ca 100644
— a/thicket_db.py
+++ b/thicket_db.py
@@ -334,7 +334,7 @@ Commands:
argParse.add_argument(“cmd”, choices=[“read”, “build”, “parse_plant”])
argParse.add_argument("-d", help=“database filename”)
argParse.add_argument("-f", help=“Laubwerk Plant filename (lbw.gz)”)

  • argParse.add_argument("-l", choices=[“DEBUG”, “INFO”, “WARN”, “ERROR”, “CRITICAL”],
  • argParse.add_argument("-l", choices=[“DEBUG”, “INFO”, “WARNING”, “ERROR”, “CRITICAL”],
    default=“INFO”, help=“Logging level”)
    argParse.add_argument("-p", help=“Laubwerk Plants path”)
    argParse.add_argument("-s", help=“Laubwerk Python SDK path”)

I’ve pushed this fix to the master branch and published a pre-release zip file to simplify testing:
https://github.com/Thicket-Blender/thicket/archive/v0_3_1-alpha01.zip

That’s interesting, I haven’t attempted a custom installation with the Laubwerk Plant Packs. If this is a common installation pattern, then I may need to add the ability to specify the Plants and Python folders independently… I had hoped to avoid that to keep the initial setup easier.

Yes, it work now with the new alpha release. Looks good.
Just to be clear - the C:\Program File\Laubwerk folder had the plants & python folders, although ‘plants’ was called ‘Plants for Forest Pack’. I renamed it to Plants but it was still not recognised. It was only recognised when I copied Python to the SSD Laubwerk folder. Very odd. Maybe I’ll uninstall and run again tomorrow, just to see what happens. It doesn’t take much space so I could leave it on C:

1 Like

Thanks @pinthenet. Plants and Plants for Forest Pack are different things, and Thicket only looks at the Plants folder. Sounds like I need to add separate Plants and Python folder configuration to the Add-on preferences. I’ve opened an issue on the project to track that feedback - many thanks.

I’ve pushed an experimental branch (lbw-paths) and created a thicket-v0_3_1-alpha02 release zip file to simplify testing. This version allows you to independently specify the Plants and Python Extension paths in the Addon preferences. It also specifies default paths for the common case for both Mac OS and Windows. Does this work for your custom installation @pinthenet?

1 Like

alpha02 works fine Darren. I tried to upload a screenshot but the upload just hangs.
I chose C:\Program Files\Laubwerk\Plants & N:\Programs\Laubwerk\Python.

I think Laubwerk should fix their installer though.

Thanks

1 Like

This is a fantastic add-on and I really appreciate your work on this. Installing worked well. Everything actually works very well. Is there a way to put all my tree models into the Tree folder and use them in the same way? I would love to to able to do that, thanks!

1 Like

Thanks for testing and your feedback @dEREw . With respect to non-Laubwerk trees, the Thicket add-on is designed around the Laubwerk tree format, the SDK, etc. Thicket doesn’t currently work with other plant assets, and I don’t think it would be feasible to provide a consistent interface across them all, although perhaps something like that could be possible. Have you tried other general purpose Asset Managers? If so, what would you like to see from them that they don’t currently do? I believe there is a project to provide a built-in general purpose asset manager in the works, but I’ve yet to dig into it.

Hi Darren,
I installed your add-on recently and it works fine with Blender 2.90. I was also wondering if it will be possible to add other assets in that library and to use that template feature because it works so well, and it’s so fast with EEvEE… it’s almost instant! :scream:
So having that would be a new world :grinning:

Again, congrats for your work :ok_hand: :+1:

@hervus2 hey thanks for the testing and the kind words :smiley:. The Add-on is very Laubwerk specific (building a database from Laubwerk models via the SDK, etc.) so it can’t work as a generic asset manager unfortunately. I know there are some Asset Managers in development - and it might make sense to make a future version of Thicket a plugin to those so users can have a more consistent way to work with their various assets (instead of an Add-on for every type).

As for the template feature - if you just want instances of a template, you can do this using the “instance collection” feature in Blender: https://docs.blender.org/manual/en/latest/scene_layout/object/properties/instancing/collection.html#making-an-instanced-collection-real

If you are referring to the proxy model, you can do this manually too using “convex hull” and some work with the collection hierarchy and toggling which objects are visible in the viewport vs the render. But - you might also be interested in checking out Proxify… er LOD (now replaces Proxify, by the same developer): https://devtalk.blender.org/t/level-of-detail-addon/12840

And finally, EEvEE is an incredible engine, I’m amazed at how much it can handle in the viewport. Kudos the EEvEE and Cycles devs, both incredible.

Hi Darren,

Thanks a lot for the information.
As you said, it makes sense to have only one asset manager for all the add-on…

I watched recently the tutorial “Creating Ghibli trees in 3D”. He has a kind of similar workflow by using
particle instancing. I have to figure out how I could maybe mixte both of them !!!???!!!

About EEvEE, did you see this twit: https://twitter.com/BettiniGabe/status/1317614710213103617
That’s insane :slight_smile:

Cheers,

1 Like