godotjs / godotjs/javascript

GDNative overridden modules issue (WebRTC)

Đang mở
#81 6 bình luận 0 reaction 0 người được giao Xem trên GitHub
enhancement good first issue
Ngôn ngữ chính
C++
Star
1.1k
Fork
80
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

Hi,

This is a bit of an obscure issue, I have a workaround, but I want to debug it. I'm not sure where to start looking.

I'm using the `webrtc-native` GDNativeLibrary from: https://github.com/godotengine/webrtc-native

To allow native webrtc on windows/linux.

I've compiled the library from source. This supplies Godot with a native program for doing WebRTC calls outside of HTML5 builds. It does so by supplying native binary implementations for the Godot `WebRTCPeerConnection` and `WebRTCDataChannel` objects, via `WebRTCPeerConnectionGDNative` and `WebRTCDataChannelGDNative`.

The method `initialize(Dictionary options)` on `WebRTCPeerConnection` fails when calling from ECMAScript with the following error:

```
const peer = new godot.WebRTCPeerConnection();
peer.initialize({});
```
Output:
```
E 0:00:02.059 initialize: Condition "interface == __null" is true. Returned: ERR_UNCONFIGURED
modules/webrtc/webrtc_peer_connection_gdnative.cpp:74 @ initialize()
```

The `interface` variable is set in the `godot/modules/webrtc/webrtc_peer_connection_gdnative.cpp` class in the method `set_native_webrtc_peer_connection`, which is called by `godot/modules/gdnative/net/webrtc_gdnative.cpp` when a native implementation has been found, via a macro:

```
void GDAPI godot_net_bind_webrtc_peer_connection(godot_object *p_obj, const godot_net_webrtc_peer_connection *p_impl) {
#ifdef WEBRTC_GDNATIVE_ENABLED
((WebRTCPeerConnectionGDNative *)p_obj)->set_native_webrtc_peer_connection(p_impl);
#endif
}
```

Now the reason I think this is a bug in the ECMAScript module is that if I create a GDScript file `webrtc_wrapper.gd`:

```
extends Node

func initialize(options: Dictionary) -> WebRTCPeerConnection:
var peer = WebRTCPeerConnection.new()
peer.initialize(options)
return peer
```

Set that GDscript as an Autoload singleton, and then call the following from my ECMAScript:

```
const webWrapper = this.get_node("/root/WebrtcWrapper");

const peer = webWrapper.call("initialize", {});
```

The `initialize` call executes correctly and I can continue to work with the returned `peer` object in ECMAScript.

So, for now, I have a workaround, but I'm puzzled why it's not working with ECMAScript, and wondered if someone could point me in the right direction, as I'm pretty new to GDNative and how it works. I wonder if for some reason the ECMAScript module is calling the unimplemented version of WebRTCPeerConnection rather than the GDNative version.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Bắt đầu bằng cách tái hiện lệnh gọi ECMAScript và phần so sánh với GDScript wrapper được mô tả trong issue. Đọc modules/webrtc/webrtc_peer_connection_gdnative.cpp và modules/gdnative/net/webrtc_gdnative.cpp, sau đó lần theo cách set_native_webrtc_peer_connection được gọi; hoàn tất khi xác định được vì sao đường dẫn ECMAScript không sử dụng triển khai native và xác nhận hành vi đã được sửa.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
cpp, javascript
Lĩnh vực
game-dev
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Cần làm rõ
Mức phù hợp với người mới
30/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.