I'm trying to load an image using GDNative for use as a heightmap in terrain generation.
So far I've achieved 2 different results, one being the game crashing and the other resulting in an empty image resource.
The first way is trough loading an image with the resource loader:
Ref<Image> heightMap = (Ref<Image>) ResourceLoader::get_singleton()->load("res://res/heightmaps/desert_heightmap.png")
heightMap->lock();
auto color = heightMap->get_pixel(1, 1);
printf("R: %f\tG: %f\tB: %f\n", color.r, color.g, color.b);
The console output:
CrashHandlerException: Program crashed
Dumping the backtrace. Please include this when reporting the bug on https://github.com/godotengine/godot/issues
[0] PoolVector<unsigned char>::size (E:\Programs\godot\core\pool_vector.h:475)
[1] PoolVector<unsigned char>::size (E:\Programs\godot\core\pool_vector.h:475)
[2] Image::lock (E:\Programs\godot\core\image.cpp:2394)
[3] MethodBind0<Image>::ptrcall (E:\Programs\godot\core\method_bind.gen.inc:157)
[4] godot_method_bind_ptrcall (E:\Programs\godot\modules\gdnative\gdnative\gdnative.cpp:70)
[5] godot::___godot_icall_void (E:\godot-projects\hex-strategy\godot-cpp\include\gen\__icalls.hpp:163)
[6] godot::Image::lock (E:\godot-projects\hex-strategy\godot-cpp\src\gen\Image.cpp:242)
[7] godot::HexGridMap::generateSegmentMesh (E:\godot-projects\hex-strategy\src\HexGridMap.cpp:179)
[8] godot::HexGridMap::_init (E:\godot-projects\hex-strategy\src\HexGridMap.cpp:68)
[9] godot::_godot_class_instance_func<godot::HexGridMap> (E:\godot-projects\godot-cpp\include\core\Godot.hpp:163)
[10] NativeScript::instance_create (E:\Programs\godot\modules\gdnative\nativescript\nativescript.cpp:220)
[11] Object::set_script (E:\Programs\godot\core\object.cpp:1030)
[12] Object::set (E:\Programs\godot\core\object.cpp:433)
[13] SceneState::instance (E:\Programs\godot\scene\resources\packed_scene.cpp:215)
[14] PackedScene::instance (E:\Programs\godot\scene\resources\packed_scene.cpp:1698)
[15] Main::start (E:\Programs\godot\main\main.cpp:1942)
[16] widechar_main (E:\Programs\godot\platform\windows\godot_windows.cpp:160)
[17] _main (E:\Programs\godot\platform\windows\godot_windows.cpp:184)
[18] main (E:\Programs\godot\platform\windows\godot_windows.cpp:196)
[19] __scrt_common_main_seh (d:\A01\_work\6\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288)
[20] BaseThreadInitThunk
-- END OF BACKTRACE --
The second method I've tried is by instancing the resource after it has been loaded like so:
Ref<Image> heightMap = (Ref<Image>) ResourceLoader::get_singleton()->load("res://res/heightmaps/desert_heightmap.png");
heightMap.instance();
The result in this case is this:
ERROR: Image::lock: Condition "data.size() == 0" is true.
At: core\image.cpp:2394
ERROR: Image must be locked with 'lock()' before using get_pixel().
At: core\image.cpp:2411
R: 0.000000 G: 0.000000 B: 0.000000
I suppose this makes sense because the reference gets reset to a null state?
Am I overlooking something relating to resources?
Thanks in advance.