pietru2004 / Godot-WFC

My implementation of WFC algoritm with gui for making tile rules and 3 generators.
32 stars 1 forks source link

MeshPreview form Mesh Lib #4

Closed RonYanDaik closed 1 year ago

RonYanDaik commented 1 year ago

Use this code to generate mesh previews for Mesh Lib. Inside MeshLibDefiner.

class GetInterface extends EditorScript:
    var x

func get_meshlib()->MeshLibrary:
    var meshlib = MeshLibrary.new()
    for i in items.size():
        var item :MeshLibItem = items[i]
        meshlib.create_item(i)
        meshlib.set_item_mesh(i,item.mesh)
        meshlib.set_item_mesh_transform(i,item.transform)
        meshlib.set_item_name(i,item.object_name)

                #generate previews
        var gei := GetInterface.new()
        var ei = gei.get_editor_interface()
        var prv := ei.make_mesh_previews([item.mesh],32)
        meshlib.set_item_preview(i,prv[0])
                gei.free()

        if item.auto_generate_collision and item.mesh!=null:
            meshlib.set_item_shapes(i,[item.mesh.create_trimesh_shape()])
        else:
            meshlib.set_item_shapes(i,[item.collision])
    return meshlib
pietru2004 commented 1 year ago

well first thank you for saying how to do that - I did not know how to generate previews

Second do I understand correctly that GetInterface is dummy class only used to gain access to editor_interface ? (I didn't work with EditorScript yet)

Also gei.free() did not work obraz and I added new var to MeshLibDefiner - preview_resolution with minimal 32 and max of 1024, step 16

RonYanDaik commented 1 year ago

gei.free()

Oh yes, since it is RefCounted you can do just gei = null. Also probably better to not create it each loop iteration.

func get_meshlib()->MeshLibrary:
    var meshlib = MeshLibrary.new()

    var gei := GetInterface.new()
    var ei = gei.get_editor_interface()

    for i in items.size():
        var item :MeshLibItem = items[i]
        meshlib.create_item(i)
        meshlib.set_item_mesh(i,item.mesh)
        meshlib.set_item_mesh_transform(i,item.transform)
        meshlib.set_item_name(i,item.object_name)

        var prv := ei.make_mesh_previews([item.mesh],32)
        meshlib.set_item_preview(i,prv[0])

        if item.auto_generate_collision and item.mesh!=null:
            meshlib.set_item_shapes(i,[item.mesh.create_trimesh_shape()])
        else:
            meshlib.set_item_shapes(i,[item.collision])

    gei=null

    return meshlib

and I added new var to MeshLibDefiner - preview_resolution with minimal 32 and max of 1024, step 16

FYI This is how engine does it. Vector<Ref<Texture2D>> textures = EditorInterface::get_singleton()->make_mesh_previews(meshes, &transforms, EDITOR_GET("editors/grid_map/preview_size")); It takes settings from engine.

EditorInterface also can be accessed through EditorPlugin.get_editor_interface(). and since it is plugin probably better to take advantage of it. But i'm not sure how to access it.

pietru2004 commented 1 year ago

ok - gona update that

pietru2004 commented 1 year ago

also I hope you don't mind my marking/comment obraz

pietru2004 commented 1 year ago

also godot should free gei var after function ends by itself if I am not wrong...

pietru2004 commented 1 year ago

closing this issue for now as preview now works...