From 3d0ad915137a0284464a7b598c980a4773e15ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C5=A0achov?= Date: Tue, 28 Apr 2026 10:18:19 +0200 Subject: [PATCH 1/5] copy of godot.natvis from master --- natvis/godot-cpp.natvis | 435 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 435 insertions(+) create mode 100644 natvis/godot-cpp.natvis diff --git a/natvis/godot-cpp.natvis b/natvis/godot-cpp.natvis new file mode 100644 index 000000000..5910401f0 --- /dev/null +++ b/natvis/godot-cpp.natvis @@ -0,0 +1,435 @@ + + + + reference + [empty] + {*reference} + + reference + reference->refcount.count.value + + + + + + _cowdata._ptr ? (((const unsigned long long *)(_cowdata._ptr))[-1]) : 0 + + _cowdata._ptr ? (((const unsigned long long *)(_cowdata._ptr))[-1]) : 0 + ($T1 *) _cowdata._ptr + + + + + + + _p->array._cowdata._ptr ? (((const unsigned long long *)(_p->array._cowdata._ptr))[-1]) : 0 + + _p->array._cowdata._ptr ? (((const unsigned long long *)(_p->array._cowdata._ptr))[-1]) : 0 + (Variant *) _p->array._cowdata._ptr + + + + + + + _p && _p->variant_map._head_element ? _p->variant_map._size : 0 + + _p && _p->variant_map._head_element ? _p->variant_map._size : 0 + _p ? _p->variant_map._head_element : nullptr + next + (*this),view(MapHelper) + + + + + + + count + + count + data + + + + + + + _data ? (_data->size_cache) : 0 + + _data ? (_data->size_cache) : 0 + _data->first + next_ptr + value + + + + + + [empty] + {{[absolute] = {data->absolute} [path] = {data->path,view(NodePathHelper)} [subpath] = {data->subpath,view(NodePathHelper)}}} + + data->path,view(NodePathHelper) + data->subpath,view(NodePathHelper) + data->absolute + + + + + + + _cowdata._ptr ? (((const unsigned long long *)(_cowdata._ptr))[-1]) : 0 + ((StringName *)_cowdata._ptr),view(NodePathHelper) + + + + + + {_data->cname,s8b} + {_data->name,s32b} + [empty] + _data->cname,s8b + _data->name,s32b + + + + + _size + + _size + ($T1 *) _keys._cowdata._ptr + + + + + + {{Key = {($T1 *) &data.key} Value = {($T2 *) &data.value}}} + + ($T1 *) &data.key + ($T2 *) &data.value + + + + + + + _head_element ? _size : 0 + + _head_element ? _size : 0 + _head_element + next + (*this) + + + + + + + + + _head_element ? _size : 0 + + _head_element ? _size : 0 + _head_element + next + (*this),view(MapHelper) + + + + + + {value} + + + + {data.value} + + ($T1 *) &data.key + ($T2 *) &data.value + + + + + + *(reinterpret_cast<long long*>(_cowdata._ptr) - 1) + + *(reinterpret_cast<long long*>(_cowdata._ptr) - 1) + reinterpret_cast<VMap<$T1,$T2>::Pair*>(_cowdata._ptr) + + + + + + {dynamic_cast<CallableCustomMethodPointerBase*>(key.custom)->text} + + + + + nil + {_data._bool} + {_data._int} + {_data._float} + {_data._transform2d} + {_data._aabb} + {_data._basis} + {_data._transform3d} + {_data._projection} + {*(String *)_data._mem} + {*(Vector2 *)_data._mem} + {*(Rect2 *)_data._mem} + {*(Vector3 *)_data._mem} + {*(Vector4 *)_data._mem} + {*(Plane *)_data._mem} + {*(Quaternion *)_data._mem} + {*(Color *)_data._mem} + {*(StringName *)_data._mem} + {*(NodePath *)_data._mem} + {*(::RID *)_data._mem} + {*(*reinterpret_cast<ObjData*>(&_data._mem[0])).obj} + {*(Dictionary *)_data._mem} + {*(Array *)_data._mem} + {reinterpret_cast<const Variant::PackedArrayRef<unsigned char>*>(_data.packed_array)->array} + {reinterpret_cast<const Variant::PackedArrayRef<int>*>(_data.packed_array)->array} + {*reinterpret_cast<PackedInt64Array *>(&_data.packed_array[1])} + {reinterpret_cast<const Variant::PackedArrayRef<float>*>(_data.packed_array)->array} + {reinterpret_cast<const Variant::PackedArrayRef<double>*>(_data.packed_array)->array} + {reinterpret_cast<const Variant::PackedArrayRef<String>*>(_data.packed_array)->array} + {reinterpret_cast<const Variant::PackedArrayRef<Vector2>*>(_data.packed_array)->array} + {reinterpret_cast<const Variant::PackedArrayRef<Vector3>*>(_data.packed_array)->array} + {reinterpret_cast<const Variant::PackedArrayRef<Color>*>(_data.packed_array)->array} + {reinterpret_cast<const Variant::PackedArrayRef<Vector4>*>(_data.packed_array)->array} + [INVALID] + + ((String *)(_data._mem))->_cowdata._ptr,s32 + + + _data._bool + _data._int + _data._float + _data._transform2d + _data._aabb + _data._basis + _data._transform3d + *(String *)_data._mem + *(Vector2 *)_data._mem + *(Rect2 *)_data._mem + *(Vector3 *)_data._mem + *(Plane *)_data._mem + *(Quaternion *)_data._mem + *(Color *)_data._mem + *(StringName *)_data._mem + *(NodePath *)_data._mem + *(::RID *)_data._mem + *(*reinterpret_cast<ObjData*>(&_data._mem[0])).obj + *(Dictionary *)_data._mem + *(Array *)_data._mem + reinterpret_cast<const Variant::PackedArrayRef<unsigned char>*>(_data.packed_array)->array + reinterpret_cast<const Variant::PackedArrayRef<int>*>(_data.packed_array)->array + *reinterpret_cast<PackedInt64Array *>(&_data.packed_array[1]) + reinterpret_cast<const Variant::PackedArrayRef<float>*>(_data.packed_array)->array + reinterpret_cast<const Variant::PackedArrayRef<double>*>(_data.packed_array)->array + reinterpret_cast<const Variant::PackedArrayRef<String>*>(_data.packed_array)->array + reinterpret_cast<const Variant::PackedArrayRef<Vector2>*>(_data.packed_array)->array + reinterpret_cast<const Variant::PackedArrayRef<Vector3>*>(_data.packed_array)->array + reinterpret_cast<const Variant::PackedArrayRef<Color>*>(_data.packed_array)->array + reinterpret_cast<const Variant::PackedArrayRef<Vector4>*>(_data.packed_array)->array + + + + + + [empty] + {_cowdata._ptr,s32} + _cowdata._ptr,s32 + + + + {*reinterpret_cast<void**>(opaque),s32} + + *reinterpret_cast<void**>(opaque) + *reinterpret_cast<void**>(opaque),s32 + + + + + {_data->name,s32} + [empty] + _data->name,s32 + + + + + + {get_data_ptr(),s32} + + *reinterpret_cast<void**>(opaque) + get_data_ptr(),s32 + + + + + "{user.name}" {slot_map} + "{slot_map} + + + + ({x,g}, {y,g}) + + x + y + + + + ({x}, {y}) + + x + y + + + + + ({x,g}, {y,g}, {z,g}) + + x + y + z + + + + ({x}, {y}, {z}) + + x + y + z + + + + + ({x,g}, {y,g}, {z,g}, {w,g}) + + x + y + z + w + + + + ({x}, {y}, {z}, {w}) + + x + y + z + w + + + + + ({x,g}, {y,g}, {z,g}, {w,g}) + + x + y + z + w + + + + + ({r,g}, {g,g}, {b,g}, {a,g}) + + r + g + b + a + + + + + [P: {position}, S: {size}] + + position,nr + size,nr + + + + [P: {position}, S: {size}] + + position,nr + size,nr + + + + + [P: {position}, S: {size}] + + position,nr + size,nr + + + + + [N: {normal}, D: {d,g}] + + normal,nr + d + + + + + [X: {rows[0]}, Y: {rows[1]}, Z: {rows[2]}] + + rows[0],nr + rows[1],nr + rows[2],nr + + + + + [X: {columns[0]}, Y: {columns[1]}, O: {columns[2]}] + + columns[0],nr + columns[1],nr + columns[2],nr + + + + + + [X: ({basis.rows[0].x,g}, {basis.rows[1].x,g}, {basis.rows[2].x,g}), Y: ({basis.rows[0].y,g}, {basis.rows[1].y,g}, {basis.rows[2].y,g}), Z: ({basis.rows[0].z,g}, {basis.rows[1].z,g}, {basis.rows[2].z,g}), O: {origin}] + + + ({basis.rows[0].x,g}, {basis.rows[1].x,g}, {basis.rows[2].x,g}) + + basis.rows[0].x + basis.rows[1].x + basis.rows[2].x + + + + ({basis.rows[0].y,g}, {basis.rows[1].y,g}, {basis.rows[2].y,g}) + + basis.rows[0].y + basis.rows[1].y + basis.rows[2].y + + + + ({basis.rows[0].z,g}, {basis.rows[1].z,g}, {basis.rows[2].z,g}) + + basis.rows[0].z + basis.rows[1].z + basis.rows[2].z + + + origin,nr + + + + + [X: {columns[0]}, Y: {columns[1]}, Z: {columns[2]}, W: {columns[3]}] + + columns[0],nr + columns[1],nr + columns[2],nr + columns[3],nr + + + From da3c4a3d382d7e058b5499adf99c91ca68b6ba86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C5=A0achov?= Date: Tue, 28 Apr 2026 10:20:37 +0200 Subject: [PATCH 2/5] Remove unused entries (godotengine original types) --- natvis/godot-cpp.natvis | 519 +++++++++------------------------------- 1 file changed, 111 insertions(+), 408 deletions(-) diff --git a/natvis/godot-cpp.natvis b/natvis/godot-cpp.natvis index 5910401f0..13ca3e987 100644 --- a/natvis/godot-cpp.natvis +++ b/natvis/godot-cpp.natvis @@ -1,247 +1,5 @@ - - reference - [empty] - {*reference} - - reference - reference->refcount.count.value - - - - - - _cowdata._ptr ? (((const unsigned long long *)(_cowdata._ptr))[-1]) : 0 - - _cowdata._ptr ? (((const unsigned long long *)(_cowdata._ptr))[-1]) : 0 - ($T1 *) _cowdata._ptr - - - - - - - _p->array._cowdata._ptr ? (((const unsigned long long *)(_p->array._cowdata._ptr))[-1]) : 0 - - _p->array._cowdata._ptr ? (((const unsigned long long *)(_p->array._cowdata._ptr))[-1]) : 0 - (Variant *) _p->array._cowdata._ptr - - - - - - - _p && _p->variant_map._head_element ? _p->variant_map._size : 0 - - _p && _p->variant_map._head_element ? _p->variant_map._size : 0 - _p ? _p->variant_map._head_element : nullptr - next - (*this),view(MapHelper) - - - - - - - count - - count - data - - - - - - - _data ? (_data->size_cache) : 0 - - _data ? (_data->size_cache) : 0 - _data->first - next_ptr - value - - - - - - [empty] - {{[absolute] = {data->absolute} [path] = {data->path,view(NodePathHelper)} [subpath] = {data->subpath,view(NodePathHelper)}}} - - data->path,view(NodePathHelper) - data->subpath,view(NodePathHelper) - data->absolute - - - - - - - _cowdata._ptr ? (((const unsigned long long *)(_cowdata._ptr))[-1]) : 0 - ((StringName *)_cowdata._ptr),view(NodePathHelper) - - - - - - {_data->cname,s8b} - {_data->name,s32b} - [empty] - _data->cname,s8b - _data->name,s32b - - - - - _size - - _size - ($T1 *) _keys._cowdata._ptr - - - - - - {{Key = {($T1 *) &data.key} Value = {($T2 *) &data.value}}} - - ($T1 *) &data.key - ($T2 *) &data.value - - - - - - - _head_element ? _size : 0 - - _head_element ? _size : 0 - _head_element - next - (*this) - - - - - - - - - _head_element ? _size : 0 - - _head_element ? _size : 0 - _head_element - next - (*this),view(MapHelper) - - - - - - {value} - - - - {data.value} - - ($T1 *) &data.key - ($T2 *) &data.value - - - - - - *(reinterpret_cast<long long*>(_cowdata._ptr) - 1) - - *(reinterpret_cast<long long*>(_cowdata._ptr) - 1) - reinterpret_cast<VMap<$T1,$T2>::Pair*>(_cowdata._ptr) - - - - - - {dynamic_cast<CallableCustomMethodPointerBase*>(key.custom)->text} - - - - - nil - {_data._bool} - {_data._int} - {_data._float} - {_data._transform2d} - {_data._aabb} - {_data._basis} - {_data._transform3d} - {_data._projection} - {*(String *)_data._mem} - {*(Vector2 *)_data._mem} - {*(Rect2 *)_data._mem} - {*(Vector3 *)_data._mem} - {*(Vector4 *)_data._mem} - {*(Plane *)_data._mem} - {*(Quaternion *)_data._mem} - {*(Color *)_data._mem} - {*(StringName *)_data._mem} - {*(NodePath *)_data._mem} - {*(::RID *)_data._mem} - {*(*reinterpret_cast<ObjData*>(&_data._mem[0])).obj} - {*(Dictionary *)_data._mem} - {*(Array *)_data._mem} - {reinterpret_cast<const Variant::PackedArrayRef<unsigned char>*>(_data.packed_array)->array} - {reinterpret_cast<const Variant::PackedArrayRef<int>*>(_data.packed_array)->array} - {*reinterpret_cast<PackedInt64Array *>(&_data.packed_array[1])} - {reinterpret_cast<const Variant::PackedArrayRef<float>*>(_data.packed_array)->array} - {reinterpret_cast<const Variant::PackedArrayRef<double>*>(_data.packed_array)->array} - {reinterpret_cast<const Variant::PackedArrayRef<String>*>(_data.packed_array)->array} - {reinterpret_cast<const Variant::PackedArrayRef<Vector2>*>(_data.packed_array)->array} - {reinterpret_cast<const Variant::PackedArrayRef<Vector3>*>(_data.packed_array)->array} - {reinterpret_cast<const Variant::PackedArrayRef<Color>*>(_data.packed_array)->array} - {reinterpret_cast<const Variant::PackedArrayRef<Vector4>*>(_data.packed_array)->array} - [INVALID] - - ((String *)(_data._mem))->_cowdata._ptr,s32 - - - _data._bool - _data._int - _data._float - _data._transform2d - _data._aabb - _data._basis - _data._transform3d - *(String *)_data._mem - *(Vector2 *)_data._mem - *(Rect2 *)_data._mem - *(Vector3 *)_data._mem - *(Plane *)_data._mem - *(Quaternion *)_data._mem - *(Color *)_data._mem - *(StringName *)_data._mem - *(NodePath *)_data._mem - *(::RID *)_data._mem - *(*reinterpret_cast<ObjData*>(&_data._mem[0])).obj - *(Dictionary *)_data._mem - *(Array *)_data._mem - reinterpret_cast<const Variant::PackedArrayRef<unsigned char>*>(_data.packed_array)->array - reinterpret_cast<const Variant::PackedArrayRef<int>*>(_data.packed_array)->array - *reinterpret_cast<PackedInt64Array *>(&_data.packed_array[1]) - reinterpret_cast<const Variant::PackedArrayRef<float>*>(_data.packed_array)->array - reinterpret_cast<const Variant::PackedArrayRef<double>*>(_data.packed_array)->array - reinterpret_cast<const Variant::PackedArrayRef<String>*>(_data.packed_array)->array - reinterpret_cast<const Variant::PackedArrayRef<Vector2>*>(_data.packed_array)->array - reinterpret_cast<const Variant::PackedArrayRef<Vector3>*>(_data.packed_array)->array - reinterpret_cast<const Variant::PackedArrayRef<Color>*>(_data.packed_array)->array - reinterpret_cast<const Variant::PackedArrayRef<Vector4>*>(_data.packed_array)->array - - - - - - [empty] - {_cowdata._ptr,s32} - _cowdata._ptr,s32 - - {*reinterpret_cast<void**>(opaque),s32} @@ -250,13 +8,6 @@ - - {_data->name,s32} - [empty] - _data->name,s32 - - - {get_data_ptr(),s32} @@ -266,170 +17,122 @@ - - "{user.name}" {slot_map} - "{slot_map} - - - - ({x,g}, {y,g}) - - x - y - - - - ({x}, {y}) - - x - y - - - - - ({x,g}, {y,g}, {z,g}) - - x - y - z - - - - ({x}, {y}, {z}) - - x - y - z - - - - - ({x,g}, {y,g}, {z,g}, {w,g}) - - x - y - z - w - - - - ({x}, {y}, {z}, {w}) - - x - y - z - w - - - - - ({x,g}, {y,g}, {z,g}, {w,g}) - - x - y - z - w - - - - - ({r,g}, {g,g}, {b,g}, {a,g}) - - r - g - b - a - - - - - [P: {position}, S: {size}] - - position,nr - size,nr - - - - [P: {position}, S: {size}] - - position,nr - size,nr - - + - - [P: {position}, S: {size}] + + + + {{empty}} + {{size={_cow()[-1]}}} - position,nr - size,nr - - - - - [N: {normal}, D: {d,g}] - - normal,nr - d - - - - - [X: {rows[0]}, Y: {rows[1]}, Z: {rows[2]}] - - rows[0],nr - rows[1],nr - rows[2],nr - - - - - [X: {columns[0]}, Y: {columns[1]}, O: {columns[2]}] - - columns[0],nr - columns[1],nr - columns[2],nr - - - - - - [X: ({basis.rows[0].x,g}, {basis.rows[1].x,g}, {basis.rows[2].x,g}), Y: ({basis.rows[0].y,g}, {basis.rows[1].y,g}, {basis.rows[2].y,g}), Z: ({basis.rows[0].z,g}, {basis.rows[1].z,g}, {basis.rows[2].z,g}), O: {origin}] - - - ({basis.rows[0].x,g}, {basis.rows[1].x,g}, {basis.rows[2].x,g}) - - basis.rows[0].x - basis.rows[1].x - basis.rows[2].x - - - - ({basis.rows[0].y,g}, {basis.rows[1].y,g}, {basis.rows[2].y,g}) - - basis.rows[0].y - basis.rows[1].y - basis.rows[2].y - - - - ({basis.rows[0].z,g}, {basis.rows[1].z,g}, {basis.rows[2].z,g}) - - basis.rows[0].z - basis.rows[1].z - basis.rows[2].z - - - origin,nr + _cow()[-1] + + _cow()[-1] + (godot::Variant*)_cow() + - - [X: {columns[0]}, Y: {columns[1]}, Z: {columns[2]}, W: {columns[3]}] - - columns[0],nr - columns[1],nr - columns[2],nr - columns[3],nr + + + + + + {{empty}} + {{size={_size()}}} + + _size() + + + + + *(godot::Variant*)(elem + 16) + *(godot::Variant*)(elem + 40) + elem = *(unsigned char**)elem + idx++ + + + + + + + + + nil + {*reinterpret_cast<bool*>(opaque+8)} + {*reinterpret_cast<long long*>(opaque+8)} + {*reinterpret_cast<double*>(opaque+8)} + + {*(godot::String*)(opaque+8)} + {*(godot::Vector2*)(opaque+8)} + {*(godot::Vector2i*)(opaque+8)} + {*(godot::Rect2*)(opaque+8)} + {*(godot::Rect2i*)(opaque+8)} + {*(godot::Vector3*)(opaque+8)} + {*(godot::Vector3i*)(opaque+8)} + {*(godot::Vector4*)(opaque+8)} + {*(godot::Vector4i*)(opaque+8)} + {*(godot::Plane*)(opaque+8)} + {*(godot::Quaternion*)(opaque+8)} + {*(godot::Color*)(opaque+8)} + {*(godot::StringName*)(opaque+8)} + {*(godot::NodePath*)(opaque+8)} + {*(godot::RID*)(opaque+8)} + {*(godot::Callable*)(opaque+8)} + {*(godot::Signal*)(opaque+8)} + {*(godot::Dictionary*)(opaque+8)} + {*(godot::Array*)(opaque+8)} + + {**(godot::Transform2D**)(opaque+8)} + {**(godot::AABB**)(opaque+8)} + {**(godot::Basis**)(opaque+8)} + {**(godot::Transform3D**)(opaque+8)} + {**(godot::Projection**)(opaque+8)} + + Object(id={*reinterpret_cast<unsigned long long*>(opaque+8)}) + {{type={_type()}}} + + _type() + *(godot::String*)(opaque+8) + *(godot::Vector2*)(opaque+8) + *(godot::Vector2i*)(opaque+8) + *(godot::Rect2*)(opaque+8) + *(godot::Rect2i*)(opaque+8) + *(godot::Vector3*)(opaque+8) + *(godot::Vector3i*)(opaque+8) + **(godot::Transform2D**)(opaque+8) + *(godot::Vector4*)(opaque+8) + *(godot::Vector4i*)(opaque+8) + *(godot::Plane*)(opaque+8) + *(godot::Quaternion*)(opaque+8) + **(godot::AABB**)(opaque+8) + **(godot::Basis**)(opaque+8) + **(godot::Transform3D**)(opaque+8) + **(godot::Projection**)(opaque+8) + *(godot::Color*)(opaque+8) + *(godot::StringName*)(opaque+8) + *(godot::NodePath*)(opaque+8) + *(godot::RID*)(opaque+8) + *(godot::Callable*)(opaque+8) + *(godot::Signal*)(opaque+8) + *(godot::Dictionary*)(opaque+8) + *(godot::Array*)(opaque+8) From 8a9a17458888b257923ec09ce305d2a16891daae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C5=A0achov?= Date: Tue, 28 Apr 2026 21:01:50 +0200 Subject: [PATCH 3/5] add support for evaluating godot::Variant, godot::Array and godot::Dictionary natvis entries --- natvis/godot-cpp.natvis | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/natvis/godot-cpp.natvis b/natvis/godot-cpp.natvis index 13ca3e987..5aa40e4f2 100644 --- a/natvis/godot-cpp.natvis +++ b/natvis/godot-cpp.natvis @@ -17,10 +17,31 @@ - + - + {{empty}} {{size={_cow()[-1]}}} @@ -66,16 +42,16 @@ HashMap: [_elements(8)][unknown(8)][_head(8)][_last(8)][_capacity_index(4)][_num_elements(4)] HashMapElement: [next(8)][prev(8)][key:Variant(24)][value:Variant(24)] --> - - - + + + {{empty}} {{size={_size()}}} _size() - + (godot::Variant*)(elem + 16),[2] elem = *(unsigned char**)elem @@ -93,7 +69,7 @@ DICTIONARY=27 ARRAY=28 Layout: opaque[0..3]=type(int32), opaque[4..7]=pad, opaque[8..23]=_data union --> - + nil {*reinterpret_cast<bool*>(opaque+8)} {*reinterpret_cast<long long*>(opaque+8)} @@ -125,7 +101,8 @@ {**(godot::Transform3D**)(opaque+8)} {**(godot::Projection**)(opaque+8)} - Object(id={*reinterpret_cast<unsigned long long*>(opaque+8)}) + Object(id={*reinterpret_cast<unsigned long long*>(opaque+8)}) + {{type={_type()}}} _type()